@adzen/doohbot 1.0.2 → 1.0.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adzen-doohbot.mjs","sources":["../../../src/lib/const/doohbot-constant.ts","../../../src/lib/predefined_messages.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.html","../../../src/lib/shared/chips/chips.component.ts","../../../src/lib/shared/chips/chips.component.html","../../../src/lib/const/utf8.ts","../../../src/lib/shared/utils/typewriter.ts","../../../src/lib/core/services/markdown.service.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.html","../../../src/lib/app/chat/components/message-list/message-list.component.ts","../../../src/lib/app/chat/components/message-list/message-list.component.html","../../../src/lib/app/chat/components/message-input/message-input.component.ts","../../../src/lib/app/chat/components/message-input/message-input.component.html","../../../src/lib/shared/dialog/dialog.component.ts","../../../src/lib/shared/dialog/dialog.component.html","../../../src/lib/shared/input-dialog/input-dialog.component.ts","../../../src/lib/shared/input-dialog/input-dialog.component.html","../../../src/lib/shared/dialog/dialog.service.ts","../../../src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts","../../../src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html","../../../src/lib/shared/snackbar/snackbar.utils.ts","../../../src/lib/core/config/doohbot-config.default.ts","../../../src/lib/core/config/doohbot-config.token.ts","../../../src/lib/core/config/doohbot-config.service.ts","../../../src/lib/core/utils/logger.service.ts","../../../src/lib/core/http/http.service.ts","../../../src/lib/core/environments/environment.ts","../../../src/lib/core/auth/storage.service.ts","../../../src/lib/core/auth/auth.service.ts","../../../src/lib/core/directives/draggable/draggable-dialog.directive.ts","../../../src/lib/core/directives/resizable/resizable-dialog.directive.ts","../../../src/lib/app/personalization/personalization.service.ts","../../../src/lib/core/services/theme.service.ts","../../../src/lib/core/http/http-stream.service.ts","../../../src/lib/app/chat/services/chat-api.service.ts","../../../src/lib/app/chat/services/chat-history.service.ts","../../../src/lib/core/models/doohbot-config.model.ts","../../../src/lib/app/chat/chat-ui-state.service.ts","../../../src/lib/app/chat/chat.service.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.html","../../../src/lib/app/login/login-form.component.ts","../../../src/lib/app/login/login-form.component.html","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.ts","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.html","../../../src/lib/const/html-entities.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.html","../../../src/lib/app/personalization/sections/terms/terms-section.component.ts","../../../src/lib/app/personalization/sections/terms/terms-section.component.html","../../../src/lib/app/personalization/sections/account/account-section.component.ts","../../../src/lib/app/personalization/sections/account/account-section.component.html","../../../src/lib/shared/dialog/dialog.utils.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.html","../../../src/lib/shared/snackbar/snackbar.component.ts","../../../src/lib/shared/snackbar/snackbar.component.html","../../../src/lib/shared/snackbar/snackbar.service.ts","../../../src/lib/app/personalization/personalization-dialog.component.ts","../../../src/lib/app/personalization/personalization-dialog.component.html","../../../src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.html","../../../src/lib/core/directives/fullscreen/fullscreen.directive.ts","../../../src/lib/core/services/license.service.ts","../../../src/lib/doohbot.component.ts","../../../src/lib/doohbot.component.html","../../../src/lib/core/config/doohbot-config.resolver.ts","../../../src/lib/core/interceptors/auth.interceptor.ts","../../../src/lib/doohbot.providers.ts","../../../src/public-api.ts","../../../src/adzen-doohbot.ts"],"sourcesContent":["export const doohbotConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // Application Constants Text\r\n appTitle: 'DoohBot',\r\n appSubtitle: 'Welcome to DoohBot',\r\n welcomeDescription:\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.',\r\n hintText: 'Please Enter Here',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n\r\n appLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n appTextLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n appHeaderLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n userAvatar:\r\n 'data:image/png;base64,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',\r\n botAvatar:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMMAAADDCAYAAAA/f6WqAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAyeSURBVHgB7d09bBzHFQfw95Y6HuOKKlPlBFiF4QChAAFxp1MhSqlEwaKQjnSRQFQKUWUqU2UqkUACUkihUxdINHTqSCaAzlUCxICoIrCLGFp36UwXge9zX2b29hSJuo+Z/brb3f8PMEzw9iTa3Hf7Zt6bGSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYjAly5drN21VhZ41IKuTJK5njl0dPdh8TTIRgyIlrv75dkR4/Ul9W33+Vj7nj3Tio77kEIzkEuaAC4QUNDQT/1SUpOc8IxkIw5MCV1dvr6l+V8VfJ0vKtjTWCkRAMOcDC182ukxsEIyEYcoCZFg2v/AXBSAgGgACCASCAYAAIIBgAAii6ZUh1ZXNxgZrvDZalNKrY9h6XO3L59DebtHDSqG+fUMEhGGacDoD5+fZdEtlUvyzDWaNQXGGutdvzO0UNDATDDAtaLHRluULpcVud8oUiBgTGDDPM69IWpRsIWqVcahWydQNPhhkVPBVe05R41L3w16d/PqYCwZNhRnkdXqKpmpvy358+BMOMYu5VaIpYUk/Ppg7BMKOYnKmmKEzykgrmDEEi/BVnQivk+B2lleDbrrrLjoWoPmn1WbO7cDxfap0kPJ06inu4//A5FQwG0DHTdYHyfOsR6UAYzy+AjVt9tvzpxgo7lPrMDjOtHxRwqegcQWz0DNAc9/6uvvzE4PJFmuPN8z//pfvvf/3z1bALvv36q2/Of3zxO3V7LlEKTwj1xDpRY4XfHz7dfUgFhCdDTPwnQqml8+wK2TlR05iXx01j6iCjHlW9EYNaZl4z/HtPRGRn2AsOk9vsLNSL3JaBMUNM+i0ToWZgFh0q6d6iC6MuOPiLn0rVRr1+dXXjEhkGw9H+3hbBUJhNioH+5GaRLQpNlvSAm2CqEAwx6PWMOkbHEubPCaYKaVIMHOI4dp2o6nHHLObseveN4L+xokYo+ufT+zDdz9s+THgyROQPbin6k0Ern2mt0wzRwanGIy9UIAzWS1R0Sqf+WZcSv75263e52noGwRCRdGiT4sJktOVLaCKuzeXzZ5rbNCbQRbxansY6CIaoHI7zBq6Gurk8eWV0HTsuGfInBXhy+pensQ6CIYLgxq1QjLwQKReXaFsXzCZep/J8MiRdb1IFfcAf61AOIBgiUDfuOsVMfRrfJUu6DqEqx2NvdDX1azXgFXKMb/Bh67KzCMEQBXMSOf5imFTpcH93W93wl0Xo3Uq2SEN//wDFtonQjhFSMN34yPByfzqSTFMgpvrhk93Q+6LqtKVU+m9lrjN3Yvo0eOdch74KmaeAjTdfqfEL92g7i9OuCIaQ9JQjGef3XGPxHqvB5guz6+mk1SmfS6PmEPRU6c7YKsWI2Vk/ePKnTHW+Ik0Kwba2oANBr08wGeQGFtOqOUyaPg0ri9OuCIYQLNsvXJWvN/SnPHti/kmZdM2B+qmRyfRpWFmbdkUwhMBiMePjyZsVY6zGAmQu8SlLmbwAKapMTbsiGCxdWb2zpG5q450j9GBy8LV+Qqhb0DV9r0ph4qtuDyGc/IKhLE27Ihgsqfzf/AZV05qnZ1XUp7FxqpRkCuP/+UKJD9D1Pq6UEQgGS+oGvWR8rcO1099rdxe2yVwlyUGoZdoWxnGWVs4hGCzoBfpk037Rli9Pfyu4ORpkKMm8vp+2mf8stlSx7x5lCILBBovFjcm1kYUn6Zlvw+LwWpKDUFXPuCFE8e/RJHQvCLbMQDAYMu3ifEN6I1OQVveDml3N4Ufj1MyWflIdPd29wCSfqRu43m/nENfi56P+pIB6j36vJzvckXO6PYQyBhVoQ5btF+7h091z4y5Yvnm7ZhFcDfXnXaYUqZ9viw3rBPrmz8OqNzwZDNkt7eTGpCucMbtdDJGbNulZhmAwYNt+4VFnZ9I1Op+2SUWSrjmcxuQZ/2x5WQuNDQHG8Ds5Hb7r9ahqkU+6xuca6A29TFMRdZ3eH0kVymqOmqVK+gbUGx+LyYWqlkI5gWA4RQeA5ziX9Blqord0FLuBlZq73zK9Vj2W9dPBpn+nqgplVSkxXV29UxNPnh99sZtIrUA/ua7e2qhP2jPW416mpk/HwQCaBm3MP6oxgaN/8VWKwHYwadcKPpSrxyg6NYv7pB3/cMVS64W6SYa3n6jp0yzOGo1S2GDwf9FzrSo7pJvuqhQHlTIc7u9ZzfpcvfnbTeK5BxQLPhaW7bjTqGtqJk1ETSDwYOGPk0jwTVvhgmFwboIaC6zFffZBmK3cg8U131P8Gnp8cVTAreXDKkQwDM5SZpF1Su70zBNVCzhLIcSQKo3kbzNPXNcLjLJWEU5bbgfQ744DWlUymhqJgkMPZPXOFcJcpQT0n36yrv78dRV0/sHnTlsFRs62hoxD7p4Mg+lQlQpVUzwCKvJB4urn3kp5ZVgjrWnarMhNMCzfuvO5ng5N/Qw0pnqrXf4sjlblICBMDx6JEdfyuJGwrcwHQ//wcOdZf0PclAgdM8nzZndhO+5+fZ3eLZSaK/3Zm2TGESO44tG9pOoWWZDpYOgHgr/9SoUS5g9EPXmsF8SkNRAdHF8l5KdPFUpBsOFYgwoo08GgKqTPKMHFL/0D/0Q9Bej+tG+QK6u/WWKZ2wxW2lUoOant2TRrMhsMli3VdnS/DUu91fnJ41m8KfwjcZl0GpXMB4EnO4df7KXaGDgLMhsMcc/N66eAI7LT4149K5XVN2lU/OOLQj4dshwMkSsHeSpI+eMnfXBK/7yICkVUxLFDJoMhGDi/prBmPA2Kyu+81dvlM18PPdWcsyY8E8Vr4Va/ZO6qGaH6Q5dySn+iqyna41Kp2VCfdw/CBISQFG5lXfGCgemBlPiB7tVXaVI9b41s/29EbK2pFDD0Da2q0y4VTGbHDMurG9/HVG129XqALI8bkmhE9Kh7IW8t2pNkdwD96e1tNVi0PvJpgsw0ssW5IGmIibt75FFmgyHyIHoyv5Gt3S4/n6VB9uCEHZXTryTVhxVmXUYeZLsCfXNjU48BKHH9k3emlUa9vS47hUbEQj4VtMw36lluxhWVm9R649MSToNGcbmj6gsF7V7NRQv3FNYCUGLrjf00yP9vqVKaVO2l1V24UcSepIHcrGfQYwivS1spNLKdFkvrczAG0r1WVUqTPhp3BhoRZ0Eu10An3sj2vhM1FXk5Sup0dXVDTwZUKA05r8CHlesNARJsZBsm9ObAiXbgBrLYiJi2wmwVk0Ya1eqUz4b5pF2+ufHS5pw4U9gZw05hguFtsTSyDSEi94/297Zs3pNIvQRpUCiF3Gt1cHxT3OuNgyneLZv39J9WFANxWehxEuuyi6KQT4Zh+p/Qcl3N6+sVXhUKyXYdQJSB8zTWZecZgmGIQRoVanxhsWQyqCm8IFvBdKh6CmTqNM1Zh2CYIJimvWuRRhkvmbSsnrsq0rYxDkgOgsFAsDX7a9PBtkmqZL3hsHgrh/sPzU8JBWs4xsqA/0ksFmc3G7SGlNTAncy5CITkIRgMOSQTz2l7y8QDCeM+MBGiQzAYsj2QsHymtT7qtSQOTIToEAw2xOLpwHR91EuqtrBO5ly0T6QDwWBBH0hocXlVT50Oe8Fm/YXNgYkQDYLBwqBybXq9NyQVCgKkQqba8iVBKhAMtqRnPKujngDvbVjg90QZ/13SwEEi6UEwWGp1P6hZXL54OlUKqtpG2OEaQWoQDJaC6m/D9Hq9k8Xga71ugcxTpJNmu4zaQooQDCGIRxZTnbIyqDlY1hbqaLtIF4IhhHavbFNzWNQ1B9vagl6QQ5CqOQJr7jf/aH740cWfqgHAJ0ZvYFrwhH5gYtMWDPdwf+8eQarwZAhJryGwuLzqkMVWNp5grDAFCIaQ+jUHcS3eUjG9kHtUqHMRZgWCIQIRij+vR21hahAMEbS7C7F/gqO2MD0Ihghsaw5G0H4xNQiGqCzaMybjGlKk6UEwRKTbM2zWOYwlvUj7tUI0CIaI+ktCY5kKxdLOKUMwxED9T6xRZFjaOW0IhhgE6xxcioA73n2CqUIwxESf0UChYeA8CxAMMfEPK/EkzMJ9F0+F2YBGvRh9+/VXBx9+dPGscQMf8TF35Fd4KswGBEPMdECc//jid+pG1+ctDN07KTg45A+tbnnjb/U//odgJmB7yQQFGxhXmZ2f+d/wvB/YoeNmZwELdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCH/gcLSoOevknsYwAAAABJRU5ErkJggg==',\r\n};\r\n","export const PredefinedMessages = [\r\n 'How do I create a new DOOH proposal in Doohclick?',\r\n // 'Can the buyer see internal notes I add in Doohclick?',\r\n // 'What happens after a buyer approves a proposal?',\r\n // 'Why would an SR hide the pipeline value in a proposal?',\r\n // 'Are additional services like ad formatting included in the base campaign cost?',\r\n 'How to create a proposal?',\r\n];\r\nexport const SuggestedMessages = [\r\n 'Hi! How can I help?',\r\n 'Check your activity?',\r\n 'Need account help?',\r\n 'Quick tips to start.',\r\n];\r\n","import { Component, input, output, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n //input\r\n buttonStyle = input<'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom'>('fab');\r\n isChatOpen = input(false);\r\n unreadCount = input<number>(0);\r\n\r\n //output \r\n toggle = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isSidebar = computed(() => {\r\n return this.buttonStyle().startsWith('sidebar');\r\n });\r\n\r\n sidebarPosition = computed((): 'top' | 'center' | 'bottom' => {\r\n if (!this.isSidebar()) return 'center';\r\n if (this.buttonStyle() === 'sidebar') return 'center';\r\n return this.buttonStyle().split('-')[1] as 'top' | 'center' | 'bottom';\r\n });\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n@if (buttonStyle() === 'fab' && !isChatOpen()) {\r\n<button class=\"chat-fab\" (click)=\"onToggle()\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"doohbotConst.appLogo\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n</button>\r\n}\r\n\r\n<!-- sidebar button -->\r\n@if (isSidebar() && !isChatOpen()) {\r\n<button class=\"chat-sidebar\" (click)=\"onToggle()\" [ngClass]=\"sidebarPosition()\">\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"doohbotConst.appTextLogo\" />\r\n\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n</button>\r\n}","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","export const AppEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import { signal } from '@angular/core';\r\n\r\nexport class Typewriter {\r\n private buffer = signal('');\r\n private queue = '';\r\n private typing = signal(false);\r\n private rafId: number | null = null;\r\n private lastTime = 0;\r\n\r\n constructor(private config: { msPerChar?: number } = {}) { }\r\n\r\n append(text: string) {\r\n if (!text) return;\r\n this.queue += text;\r\n if (!this.typing()) this.start();\r\n }\r\n\r\n private start() {\r\n this.typing.set(true);\r\n const msPerChar = this.config.msPerChar ?? 20;\r\n\r\n const tick = (time: number) => {\r\n if (!this.lastTime) this.lastTime = time;\r\n\r\n const delta = time - this.lastTime;\r\n const charsToAdd = Math.floor(delta / msPerChar);\r\n\r\n if (charsToAdd > 0 && this.queue.length) {\r\n const slice = this.queue.slice(0, charsToAdd);\r\n this.queue = this.queue.slice(charsToAdd);\r\n this.buffer.update(v => v + slice);\r\n this.lastTime = time;\r\n }\r\n\r\n if (!this.queue.length) {\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n this.rafId = null;\r\n return;\r\n }\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n }\r\n\r\n displayedText() {\r\n return this.buffer();\r\n }\r\n\r\n isTyping = this.typing;\r\n\r\n reset() {\r\n this.queue = '';\r\n this.buffer.set('');\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n if (this.rafId) cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport MarkdownIt from 'markdown-it';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MarkdownService {\r\n private md = new MarkdownIt({\r\n html: false, // Disable HTML tags for security\r\n linkify: true, // Auto-convert URLs to links\r\n typographer: true, // Smart quotes, dashes, etc.\r\n breaks: true, // ✅ Convert \\n to <br> (CRITICAL for line breaks)\r\n xhtmlOut: true, // Use XHTML-compatible output\r\n });\r\n\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n convert(markdown: string): SafeHtml {\r\n if (!markdown || markdown.trim() === '') {\r\n return '';\r\n }\r\n\r\n try {\r\n // marked.parse() is synchronous by default\r\n const html = this.md.render(markdown);\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n } catch (error) {\r\n console.error('Markdown parsing error:', error);\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n markdown.replace(/</g, '<').replace(/>/g, '>'),\r\n );\r\n }\r\n }\r\n}\r\n","import {\r\n Component, input, output, computed, effect\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { MarkdownService } from '../../../../core/services/markdown.service';\r\nimport { Typewriter } from '../../../../shared/utils/typewriter';\r\n\r\n@Component({\r\n selector: 'app-chat-message',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss']\r\n})\r\nexport class ChatMessageComponent {\r\n message = input.required<Message>();\r\n doohbotConst = input.required<any>();\r\n appEmoji = input<any>();\r\n\r\n copyMessage = output<Message>();\r\n\r\n private typewriter = new Typewriter({ msPerChar: 4 }); //! speed of typing\r\n private lastLength = 0;\r\n\r\n isTyping = this.typewriter.isTyping;\r\n\r\n displayHtml = computed(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender === 'user') return '';\r\n\r\n if (msg.completed || msg.isHistory) {\r\n return msg.textHtml || this.markdownService.convert(msg.text);\r\n }\r\n\r\n return this.markdownService.convert(this.typewriter.displayedText());\r\n });\r\n\r\n constructor(private markdownService: MarkdownService) {\r\n effect(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender !== 'model' || msg.isHistory) return;\r\n\r\n const text = msg.text ?? '';\r\n\r\n if (text.length > this.lastLength) {\r\n const delta = text.slice(this.lastLength);\r\n this.lastLength = text.length;\r\n this.typewriter.append(delta);\r\n }\r\n\r\n if (msg.completed) {\r\n this.lastLength = text.length;\r\n // this.typewriter.finish();\r\n }\r\n });\r\n }\r\n\r\n onCopy() {\r\n this.copyMessage.emit(this.message());\r\n }\r\n}\r\n","<div class=\"message\" [class.user]=\"message().sender === 'user'\" [class.assistant]=\"message().sender === 'model'\"\r\n [class.streaming]=\"!message().completed && message().sender === 'model'\">\r\n\r\n <!-- Message Bubble -->\r\n <div class=\"message-content\">\r\n <!-- User chat bubble -->\r\n @if (message().sender === 'user') {\r\n <div class=\"user-message-wrapper\">\r\n <div class=\"user\">\r\n <span>{{ message().text }}</span>\r\n </div>\r\n <button class=\"action-btn copy-btn user-copy\" (click)=\"onCopy()\" title=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Assistant chat bubble -->\r\n @if (message().sender === 'model') {\r\n <div class=\"assistant\">\r\n <!-- Content (Typewriter or Static) -->\r\n <!-- We use [innerHTML] for both typing and static states now, powered by displayHtml computed signal -->\r\n @if (message().text || message().textHtml) {\r\n <span class=\"markdown-content\" [innerHTML]=\"displayHtml()\"></span>\r\n }\r\n\r\n <!-- Loading state (no content yet) -->\r\n @if (!message().completed && (!message().text || message().text === '')) {\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n }\r\n\r\n <!-- Message Footer (only when completed) -->\r\n @if (message().completed) {\r\n <div class=\"message-footer\">\r\n <p class=\"footer-text\">This chat uses AI-generated content. Verify critical information.</p>\r\n <div class=\"message-actions\">\r\n <button class=\"action-btn copy-btn\" (click)=\"onCopy()\" title=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n <button class=\"action-btn more-btn\" title=\"More actions\">\r\n <mat-icon>more_horiz</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Avatar (User on Right) -->\r\n @if (message().sender === 'user') {\r\n <div class=\"avatar-container\">\r\n <img class=\"user-avatar\" [src]=\"doohbotConst().userAvatar\" alt=\"User Avatar\" />\r\n </div>\r\n }\r\n</div>","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n input,\r\n OnDestroy,\r\n output,\r\n TrackByFunction,\r\n ViewChild,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { AppEmoji } from '../../../../const/utf8';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips, MatIconModule, ChatMessageComponent],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n //inputs\r\n messages = input<Message[]>([]);\r\n isBotTyping = input(false);\r\n isStreaming = input(true);\r\n predefinedMessages = input<string[]>([]);\r\n userName = input('');\r\n isAuthenticated = input(false);\r\n isLoggingIn = input(false);\r\n trackByMessageId = input<TrackByFunction<Message>>((index, item) => item.id ?? index);\r\n\r\n //outputs\r\n suggestionClick = output<string>();\r\n loginClick = output<void>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n //const\r\n appEmoji = AppEmoji;\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isNearBottom: boolean = true;\r\n private readonly SCROLL_TOLERANCE = 20; // Increased tolerance for better stickiness\r\n\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => {\r\n // PROACTIVE SCROLLING:\r\n // While bot is typing or responding, we want to stay at the bottom.\r\n // We only skip if the user has scrolled up significantly (beyond tolerance).\r\n if (this.isNearBottom) {\r\n this.scrollToBottom('auto');\r\n }\r\n });\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n\r\n // Initial scroll\r\n // setTimeout(() => this.scrollToBottom('auto'), 200);\r\n }\r\n\r\n onScroll(): void {\r\n if (!this.chatMessagesContainer) return;\r\n const element = this.chatMessagesContainer.nativeElement;\r\n\r\n // Check if we are at the bottom within tolerance.\r\n // If bot is typing, we increase tolerance to make it harder to 'lose' the stickiness.\r\n const tolerance = this.isBotTyping() ? this.SCROLL_TOLERANCE * 2 : this.SCROLL_TOLERANCE;\r\n\r\n const atBottom =\r\n element.scrollHeight - element.scrollTop - element.clientHeight <=\r\n tolerance;\r\n\r\n this.isNearBottom = atBottom;\r\n }\r\n\r\n scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: behavior,\r\n });\r\n // If artificially scrolling, assume we are at bottom\r\n if (behavior === 'auto') {\r\n this.isNearBottom = true;\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n copyMessage(message: Message): void {\r\n if (!message.text) return;\r\n\r\n navigator.clipboard.writeText(message.text).then(() => {\r\n // Logger.info('Copied to clipboard');\r\n // SnackbarUtils.info('Copied to clipboard');\r\n\r\n message.copied = true;\r\n this.cdr.markForCheck(); // force UI update\r\n\r\n setTimeout(() => {\r\n message.copied = false;\r\n this.cdr.markForCheck(); // update again\r\n }, 800);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\" (scroll)=\"onScroll()\">\r\n <!-- Welcome Screen -->\r\n @if (messages().length === 0 && !isBotTyping()) {\r\n <div class=\"welcome-screen\">\r\n <img [src]=\"doohbotConst.appLogo\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n @if (userName() && isAuthenticated()) {\r\n <div class=\"marquee-container\">\r\n <h2 class=\"welcome-greeting marquee-text\">\r\n Hi, {{ userName() }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n }\r\n\r\n <h3>{{ doohbotConst.appSubtitle }}</h3>\r\n <p>{{ doohbotConst.welcomeDescription }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n @if (isAuthenticated()) {\r\n <app-chips [messages]=\"predefinedMessages()\" [disabled]=\"isBotTyping()\"\r\n (chipClick)=\"onPredefinedClick($event)\"></app-chips>\r\n }\r\n\r\n @if (!isAuthenticated()) {\r\n <div class=\"auth-buttons-container\" style=\"margin-top: 20px\">\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" [disabled]=\"isLoggingIn()\">\r\n {{ isLoggingIn() ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Chat Messages -->\r\n <app-chat-message *ngFor=\"let message of messages(); trackBy: trackByMessageId()\" [message]=\"message\"\r\n [doohbotConst]=\"doohbotConst\" [appEmoji]=\"appEmoji\" (copyMessage)=\"copyMessage($event)\">\r\n </app-chat-message>\r\n\r\n <!-- Standalone Typing Indicator (Fallback if no message added yet) -->\r\n @if (isBotTyping() && messages()[messages().length - 1]?.sender !== 'model') {\r\n <div class=\"message assistant\">\r\n <!-- <div class=\"avatar-container\">\r\n <img class=\"assistant-avatar\" [src]=\"doohbotConst.botAvatar\" alt=\"Bot Avatar\" />\r\n </div> -->\r\n <div class=\"message-content\">\r\n <div class=\"assistant\">\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n <!-- Scroll to Bottom Button -->\r\n @if (!isNearBottom) {\r\n <button class=\"scroll-bottom-btn\" (click)=\"scrollToBottom('smooth')\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n }\r\n</div>","import { Component, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n //input\r\n isBotTyping = input(false);\r\n\r\n //output\r\n send = output<string>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping()\" (keydown.enter)=\"\r\n !isBotTyping() && onSend(messageInput.value); !isBotTyping() && (messageInput.value = '')\r\n \" [placeholder]=\"doohbotConst.hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping()\" (click)=\"\r\n onSend(messageInput.value);\r\n messageInput.value = ''\r\n \">\r\n <mat-icon [class.disabled-icon]=\"isBotTyping()\">send</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface DialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n icon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule],\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss'],\r\n})\r\nexport class DialogComponent {\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n ) {\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Confirm';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'warn';\r\n this.data.icon = this.data.icon || 'warning';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <mat-icon class=\"dialog-icon\" [class.warn-icon]=\"data.confirmButtonColor === 'warn'\">\r\n {{ data.icon }}\r\n </mat-icon>\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\"\r\n (click)=\"onConfirm()\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface InputDialogData {\r\n title: string;\r\n message: string;\r\n initialValue: string;\r\n placeholder?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-input-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, FormsModule],\r\n templateUrl: './input-dialog.component.html',\r\n styleUrls: ['./input-dialog.component.scss'],\r\n})\r\nexport class InputDialogComponent {\r\n public value: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<InputDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: InputDialogData,\r\n ) {\r\n this.value = data.initialValue;\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Save';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.placeholder = this.data.placeholder || 'Enter value...';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'primary';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(null);\r\n }\r\n\r\n onConfirm(): void {\r\n if (this.value && this.value.trim()) {\r\n this.dialogRef.close(this.value.trim());\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n <div class=\"input-group\">\r\n <input type=\"text\" class=\"dialog-input\" [(ngModel)]=\"value\" [placeholder]=\"data.placeholder\"\r\n (keyup.enter)=\"onConfirm()\" focus=\"true\" />\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\">{{ data.cancelText }}</button>\r\n <button mat-flat-button class=\"confirm-btn\" [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\" [disabled]=\"!value.trim()\" (click)=\"onConfirm()\">\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { DialogComponent, DialogData } from './dialog.component';\r\nimport { InputDialogComponent, InputDialogData } from '../input-dialog/input-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DialogService {\r\n constructor(private dialog: MatDialog) { }\r\n\r\n /**\r\n * Opens a confirmation dialog with customizable options\r\n * @param data Configuration for the dialog\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n open(data: DialogData): Observable<boolean> {\r\n const dialogRef = this.dialog.open(DialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n\r\n /**\r\n * Convenience method for delete confirmation dialogs\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n confirmDelete(itemName: string = 'this item'): Observable<boolean> {\r\n return this.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Opens a dialog with an input field\r\n * @param data Configuration for the input dialog\r\n * @returns Observable that emits the input value if confirmed, null if cancelled\r\n */\r\n openInput(data: InputDialogData): Observable<string | null> {\r\n const dialogRef = this.dialog.open(InputDialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { ChatSessionDto, ChatSessionGroup } from '../../model/chat-session.model';\r\nimport { input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-chat-history-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-history-sidebar.component.html',\r\n styleUrls: ['./chat-history-sidebar.component.scss'],\r\n})\r\nexport class ChatHistorySidebarComponent {\r\n //inputs\r\n sessions = input<ChatSessionDto[]>([]);\r\n isOpen = input(false);\r\n userName = input('User');\r\n isLoading = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMore = input(false);\r\n processingSessionId = input<string | null>(null);\r\n isFullScreen = input(false);\r\n\r\n //outputs\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n closed = output<void>();\r\n loadMore = output<void>();\r\n refresh = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAll = output<void>();\r\n\r\n // Use computed to automatically regroup when sessions change\r\n chatHistory = computed(() => {\r\n // Access signals\r\n const sessionsList = this.sessions();\r\n return this.groupSessions(sessionsList);\r\n });\r\n\r\n constructor(private dialogService: DialogService) { }\r\n\r\n\r\n // Logic extracted to stand-alone method for computed usage\r\n private groupSessions(sessions: ChatSessionDto[]): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Deduplicate sessions by ID to prevent NG0955 error\r\n // Filter out sessions without IDs (new sessions not yet persisted)\r\n const sessionsWithIds = sessions.filter(s => s.response_id !== null);\r\n const uniqueSessionsMap = new Map<string, ChatSessionDto>();\r\n sessionsWithIds.forEach(s => uniqueSessionsMap.set(s.response_id!, s));\r\n const uniqueSessions = Array.from(uniqueSessionsMap.values());\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = uniqueSessions.sort(\r\n (a, b) => new Date(b.last_message_at).getTime() - new Date(a.last_message_at).getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.last_message_at);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSessionDto): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n\r\n onEditClick(event: Event, session: ChatSessionDto): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .openInput({\r\n title: 'Rename Conversation',\r\n message: 'Enter a new title for this conversation:',\r\n initialValue: session.title,\r\n placeholder: 'New title...',\r\n confirmText: 'Rename',\r\n })\r\n .subscribe((newTitle) => {\r\n if (newTitle !== null && newTitle.trim() !== '' && newTitle !== session.title && session.response_id) {\r\n this.sessionRenamed.emit({ sessionId: session.response_id, newTitle: newTitle.trim() });\r\n }\r\n });\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n if (!sessionId) return;\r\n event.stopPropagation();\r\n this.dialogService.confirmDelete('this conversation').subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n // this.chatHistory = this.groupedSessions();\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (scrollBottom < 100 && this.hasMoreSessions() && !this.isLoadingMore() && !this.isLoading()) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n\r\n /**\r\n * Handle clear all history\r\n */\r\n onClearAllClick(): void {\r\n this.dialogService\r\n .open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n })\r\n .subscribe((confirmed: boolean | undefined) => {\r\n if (confirmed) {\r\n this.deleteAll.emit();\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen()\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\">\r\n <h3 class=\"marquee-text\">{{ userName() }}'s Chat History</h3>\r\n </div>\r\n <button class=\"refresh-btn\" (click)=\"onRefresh()\" title=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <!-- <button class=\"clear-all-btn\" (click)=\"onClearAllClick()\" title=\"Clear all history\">\r\n <mat-icon>delete_sweep</mat-icon>\r\n </button> -->\r\n\r\n @if (!isFullScreen()) {\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n @if (isLoading()) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n }\r\n\r\n @if (!isLoading() && sessions().length === 0) {\r\n <div class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n }\r\n\r\n @if (!isLoading()) {\r\n @for (group of chatHistory(); track group.label) {\r\n <div class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n @for (session of group.sessions; track session.response_id) {\r\n <div class=\"session-item\" (click)=\"onSessionClick(session)\">\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.last_message_at) }} · {{ formatDate(session.last_message_at) }}\r\n </div>\r\n </div>\r\n <div class=\"session-actions\">\r\n <button class=\"edit-btn\" [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onEditClick($event, session)\" title=\"Edit title\">\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>edit</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n <button class=\"delete-btn\" [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onDeleteClick($event, session.response_id)\" title=\"Delete conversation\">\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>delete</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Loading more indicator -->\r\n @if (isLoadingMore()) {\r\n <div class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { SnackbarService } from './snackbar.service';\r\n\r\n/**\r\n * Utility class for common snackbar operations\r\n * Provides reusable snackbar configurations for consistency across the application\r\n */\r\nexport class SnackbarUtils {\r\n private static service: SnackbarService | null = null;\r\n\r\n /**\r\n * Initialize the utility with a SnackbarService instance\r\n * @param service The SnackbarService instance\r\n */\r\n static init(service: SnackbarService): void {\r\n this.service = service;\r\n }\r\n\r\n /**\r\n * Show a success snackbar\r\n * @param message The message to show\r\n */\r\n static success(message: string): void {\r\n this.service?.success(message);\r\n }\r\n\r\n /**\r\n * Show an error snackbar\r\n * @param message The message to show\r\n */\r\n static error(message: string): void {\r\n this.service?.error(message);\r\n }\r\n\r\n /**\r\n * Show a warning snackbar\r\n * @param message The message to show\r\n */\r\n static warn(message: string): void {\r\n this.service?.warn(message);\r\n }\r\n\r\n /**\r\n * Show an info snackbar\r\n * @param message The message to show\r\n */\r\n static info(message: string): void {\r\n this.service?.info(message);\r\n }\r\n}\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Default Doohbot configuration values.\r\n * Applied when no user overrides are provided.\r\n */\r\nexport const DEFAULT_DOOHBOT_CONFIG: DoohbotConfig = {\r\n // Runtime environment\r\n environment: 'development',\r\n\r\n // License file\r\n licenseFilePath: 'assets/doohbot_license.json',\r\n\r\n // Client-side encryption key (optional, fallback will be used)\r\n storageSecret: undefined,\r\n\r\n // Chat API mode (streaming by default)\r\n useNonStreamingChat: false, // true for non-streaming, false for streaming\r\n\r\n // API integration defaults\r\n api: {\r\n baseUrl: 'https://api.doohbot.com/api',\r\n apiKey: undefined,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n },\r\n\r\n // Theme / visual customization\r\n theme: {\r\n enableDrag: false,\r\n enableResize: false,\r\n buttonStyle: 'fab',\r\n fontFamily: 'Inter, Roboto, sans-serif',\r\n palette: 'doohbot',\r\n },\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Injection token for Doohbot configuration.\r\n * Used to inject user-provided or default config into services.\r\n */\r\nexport const DOOHBOT_CONFIG = new InjectionToken<DoohbotConfig>('DOOHBOT_CONFIG');\r\n","import { Inject, Injectable, Optional, signal, WritableSignal, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\nimport { DOOHBOT_CONFIG } from './doohbot-config.token';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { DoohbotApiConfig } from '../models/api-config.model';\r\n\r\n\r\n/**\r\n * Centralized service for managing Doohbot configuration.\r\n * Provides reactive access and runtime updates.\r\n * Singleton via providedIn: 'root'.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotConfigService implements OnDestroy {\r\n // Use DoohbotConfig for type-safe signal\r\n private configSignal: WritableSignal<DoohbotConfig>;\r\n\r\n // Legacy Observable support\r\n private readonly configSubject: BehaviorSubject<DoohbotConfig>;\r\n public readonly config$: Observable<DoohbotConfig>;\r\n\r\n\r\n /**\r\n * Current runtime environment for Doohbot.\r\n *\r\n * Drives environment-specific behavior such as:\r\n * - API behavior\r\n * - logging verbosity\r\n * - feature toggles\r\n * - safety defaults\r\n *\r\n * This value is mandatory and always resolved during bootstrap.\r\n */\r\n readonly environment = (): DoohbotConfig['environment'] => this.configSignal().environment;\r\n\r\n /**\r\n * Path to the public license file.\r\n * Returns an empty string if not configured.\r\n */\r\n readonly licenseFilePath = (): string => this.configSignal().licenseFilePath ?? '';\r\n\r\n /**\r\n * Secret used for encrypting persisted client-side data.\r\n * If not provided, default will be used.\r\n */\r\n readonly storageSecret = (): string => this.configSignal().storageSecret ?? '';\r\n\r\n /**\r\n * Chats use the `streaming` by default.\r\n * Pass `true` to use normal http calls for chat.\r\n */\r\n readonly useNonStreamingChat = (): boolean => this.configSignal().useNonStreamingChat ?? false;\r\n\r\n /**\r\n * Full API configuration object.\r\n * Undefined if API integration is not configured.\r\n */\r\n readonly api = (): DoohbotApiConfig | undefined => this.configSignal().api;\r\n\r\n /**\r\n * Theme customization configuration.\r\n * Undefined if no theme overrides are provided.\r\n */\r\n readonly theme = (): DoohbotThemeConfig | undefined => this.configSignal().theme;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(DOOHBOT_CONFIG)\r\n injectedConfig: Partial<DoohbotConfig> = {},\r\n ) {\r\n // Merge injected config with defaults\r\n const mergedConfig: DoohbotConfig = {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...injectedConfig,\r\n };\r\n\r\n this.validateConfig(mergedConfig);\r\n\r\n // Initialize state\r\n this.configSignal = signal(mergedConfig);\r\n this.configSubject = new BehaviorSubject<DoohbotConfig>(mergedConfig);\r\n this.config$ = this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Update configuration at runtime.\r\n * @param value Partial config updates\r\n */\r\n update(value: Partial<DoohbotConfig>): void {\r\n if ('environment' in value) {\r\n // TODO: If environment is truly immutable, consider using a separate EnvironmentProvider instead of burying it in config.\r\n throw new Error('environment cannot be changed at runtime');\r\n }\r\n\r\n const newConfig = { ...this.configSignal(), ...value };\r\n this.validateConfig(newConfig);\r\n\r\n this.configSignal.set(newConfig);\r\n this.configSubject.next(newConfig);\r\n }\r\n\r\n private validateConfig(config: DoohbotConfig): void {\r\n // environment\r\n if (!config.environment) {\r\n throw new Error('environment is required');\r\n }\r\n\r\n // license\r\n if (\r\n config.licenseFilePath &&\r\n typeof config.licenseFilePath !== 'string'\r\n ) {\r\n throw new Error('licenseFilePath must be a string');\r\n }\r\n\r\n // API config\r\n if (config.api) {\r\n const api = config.api;\r\n\r\n if (!api.baseUrl) {\r\n throw new Error('api.baseUrl is required when api config is provided');\r\n }\r\n\r\n if (api.retryAttempts !== undefined && api.retryAttempts < 0) {\r\n throw new Error('api.retryAttempts must be >= 0');\r\n }\r\n\r\n if (api.retryDelay !== undefined && api.retryDelay < 0) {\r\n throw new Error('api.retryDelay must be >= 0');\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubject.complete();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { DoohbotConfigService } from \"../config/doohbot-config.service\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Logger {\r\n private static instance: Logger | null = null;\r\n\r\n private prefix = '[Doohbot] ======> ';\r\n\r\n private styles = {\r\n info: 'color:#0995e6; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n };\r\n\r\n // TODO: Consider moving prefix and styles to a separate LoggerConfig or environment config to allow library consumers to customize them.\r\n constructor(private configService: DoohbotConfigService) {\r\n Logger.instance = this;\r\n }\r\n\r\n /** bind once */\r\n static init(instance: Logger): void {\r\n Logger.instance = instance;\r\n this.info('[Logger]: has been initialized!!!');\r\n }\r\n\r\n // internal guard\r\n private canLog(): boolean {\r\n return this.configService.environment() !== 'production';\r\n }\r\n\r\n // instance methods\r\n info(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n } catch {\r\n console.info(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return; try {\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n } catch {\r\n console.warn(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return; try {\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n } catch {\r\n console.error(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n // static facade\r\n private static get logger(): Logger {\r\n if (!Logger.instance) {\r\n // TODO: This error might be too aggressive if a library consumer accidentally uses Logger before bootstrap completes. \r\n // Consider a graceful fallback or a queue-based logger.\r\n throw new Error(\r\n 'LoggerService not initialized. Instantiate LoggerService during app bootstrap.'\r\n );\r\n }\r\n return Logger.instance;\r\n }\r\n\r\n static info(message: string, ...args: unknown[]): void {\r\n Logger.logger.info(message, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: unknown[]): void {\r\n Logger.logger.warn(message, ...args);\r\n }\r\n\r\n static error(message: string, ...args: unknown[]): void {\r\n Logger.logger.error(message, ...args);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { delay, retry, map, catchError, of, firstValueFrom } from 'rxjs';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n }\r\n\r\n get apiUrl(): string {\r\n const apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n Logger.info('HttpService: Initialized apiUrl', apiBaseUrl);\r\n return apiBaseUrl;\r\n }\r\n\r\n // TODO: Return type 'Promise<any>' is too broad. Consider using Promise<ApiResponse<T>> to enforce structure throughout the app.\r\n async get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n\r\n // Build Params\r\n const params = (nestedParam ? this.buildHttpParams({}, param, '') : param) as HttpParams;\r\n\r\n Logger.info(\"HttpService: get()\", url, params, headers);\r\n return await firstValueFrom(this.http\r\n .get(`${this.apiUrl}${url}`, {\r\n params: params,\r\n // withCredentials: true,\r\n headers,\r\n })\r\n .pipe(\r\n delay(100),\r\n retry(2),\r\n // TODO: Excessive mapping: response => response is redundant and can be removed.\r\n map((response: any) => response),\r\n catchError((error) => {\r\n // TODO: SECURITY/UX: Returning 'of(error)' converts an error into a successful resolution in the promise world.\r\n // This prevents callers from using try/catch effectively. Consider re-throwing or using an error wrapper.\r\n Logger.info(\"HttpService: get() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n // TODO: Use HttpParams.set() or HttpParams.append() instead of direct assignment to an object and casting.\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n async post(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n\r\n Logger.info(\"HttpService: post()\", url, param, headers);\r\n // TODO: param as HttpParams is likely incorrect for a POST request body which should be a JSON object. \r\n // This casting might lead to runtime errors if the backend expects application/json.\r\n return await firstValueFrom(this.http.post(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: post() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n async patch(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info(\"HttpService: patch()\", url, param, headers);\r\n return await firstValueFrom(this.http.patch(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: patch() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n async put(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info(\"HttpService: put()\", url, param, headers);\r\n return await firstValueFrom(\r\n this.http.put(`${this.apiUrl}${url}`, param, { headers }).pipe( \r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: put() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n async delete(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n Logger.info(\"HttpService: delete()\", url, param, headers);\r\n return await firstValueFrom(this.http.delete(`${this.apiUrl}${url}`, { body: param, headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: delete() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n}\r\n","// environment.ts\r\nexport const environment = {\r\n production: false,\r\n storageSecret: 'RcmDfQZ0AN2Zryn3pJ+HXNX4Nr7zQ6rV0UDsrCV9Jt5XzG4TW+1R3pIYOM03h77WMaZp8XnCBEQnelwGvuk3iQ==',\r\n};\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { environment } from '../environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n// TODO\r\nexport class StorageService {\r\n private readonly storageKey = 'doohbot_storage';\r\n private readonly secretKey: string;\r\n private readonly storage: Storage;\r\n\r\n constructor(@Inject(DOOHBOT_CONFIG) config: DoohbotConfig) {\r\n // Use config override if provided, otherwise fall back to environment\r\n this.secretKey = config.storageSecret ?? environment.storageSecret ?? '';\r\n\r\n this.storage = sessionStorage.getItem(this.storageKey) ? sessionStorage : localStorage;\r\n }\r\n\r\n /**\r\n * Store a value under the given key.\r\n */\r\n set<T>(key: string, value: T): void {\r\n const payload = this.readAll();\r\n payload[key] = value;\r\n\r\n this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n }\r\n\r\n /**\r\n * Retrieve a stored value by key.\r\n */\r\n get<T>(key: string): T | null {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return null;\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) return null;\r\n\r\n try {\r\n const parsed = JSON.parse(decrypted) as Record<string, unknown>;\r\n return (parsed[key] as T) ?? null;\r\n } catch {\r\n this.clear();\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a specific key from storage.\r\n */\r\n remove(key: string): void {\r\n const payload = this.readAll();\r\n delete payload[key];\r\n\r\n this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n }\r\n\r\n /**\r\n * Clear all Doohbot-related storage.\r\n */\r\n clear(): void {\r\n localStorage.removeItem(this.storageKey);\r\n sessionStorage.removeItem(this.storageKey);\r\n }\r\n\r\n /**\r\n * Validate storage integrity without mutating it.\r\n */\r\n isValid(): boolean {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return false;\r\n\r\n return this.decrypt(data) !== null;\r\n }\r\n\r\n private readAll(): Record<string, unknown> {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return {};\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) {\r\n this.clear();\r\n return {};\r\n }\r\n\r\n try {\r\n return JSON.parse(decrypted);\r\n } catch {\r\n this.clear();\r\n return {};\r\n }\r\n }\r\n\r\n private encrypt(plainText: string): string {\r\n return CryptoJS.AES.encrypt(plainText, this.secretKey).toString();\r\n }\r\n\r\n private decrypt(cipherText: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(cipherText, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // setRememberMe(rememberMe: boolean): void {\r\n // const currentData = this.storage.getItem(this.storageKey);\r\n // const targetStorage = rememberMe ? localStorage : sessionStorage;\r\n\r\n // // If storage type is changing, move data\r\n // if (this.storage !== targetStorage) {\r\n // if (currentData) {\r\n // targetStorage.setItem(this.storageKey, currentData);\r\n // this.storage.removeItem(this.storageKey);\r\n // }\r\n // this.storage = targetStorage;\r\n // }\r\n // }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n combineLatest,\r\n filter,\r\n finalize,\r\n from,\r\n map,\r\n Observable,\r\n of,\r\n shareReplay,\r\n switchMap,\r\n take,\r\n tap,\r\n distinctUntilChanged,\r\n} from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { StorageService } from './storage.service';\r\nimport { SnackbarUtils } from './../../shared/snackbar/snackbar.utils';\r\nimport { doohbotConst } from '../../const/doohbot-constant';\r\nimport { RefreshRequest } from './models/refresh-request.model';\r\nimport { HttpService } from '../http/http.service';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n private jwtHelper = new JwtHelperService();\r\n\r\n private isRefreshing = false;\r\n private refreshTokenSubject = new BehaviorSubject<AuthResult | null>(null);\r\n\r\n private readonly isAuthenticatedSubject = new BehaviorSubject<boolean>(false);\r\n private readonly federatedAuthTokenSubject = new BehaviorSubject<string | null>(null);\r\n private readonly rememberMeSubject = new BehaviorSubject<boolean | null>(null);\r\n private readonly licenseFileSubject = new BehaviorSubject<Map<string, string> | null>(null);\r\n private readonly licenseCodeSubject = new BehaviorSubject<string | null>(null);\r\n readonly isAuthenticated$ = this.isAuthenticatedSubject\r\n .asObservable()\r\n .pipe(distinctUntilChanged());\r\n\r\n private apiBaseUrl = '';\r\n\r\n // public authStatus$ = this.authStatusSubject.asObservable();\r\n // Auth and session getters\r\n\r\n /**\r\n * True if request is an auth endpoint\r\n */\r\n isAuthUrl(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const path = requestUrl.pathname.toLowerCase();\r\n\r\n Logger.info('isAuthUrl() host:', requestUrl.host);\r\n // TODO: This logging might be too verbose for production/frequent calls. Consider reducing log level or removing.\r\n Logger.info('isAuthUrl() path:', path);\r\n\r\n return ['/auth/login', '/auth/federated/login', '/auth/refresh', '/auth/logout'].some(\r\n (authPath) => path.endsWith(authPath),\r\n );\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * True if request goes to our backend API\r\n */\r\n isInternalApiRequest(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const apiUrl = new URL(this.apiBaseUrl);\r\n\r\n Logger.info('isInternalApiRequest() requestUrl host:', requestUrl.host);\r\n Logger.info('isInternalApiRequest() apiUrl host:', apiUrl.host);\r\n\r\n return requestUrl.host === apiUrl.host;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Sets current license file\r\n */\r\n // TODO: Consider defining these as regular methods instead of arrow functions for better stack traces and consistency, unless bound context is strictly required (which is automatic for class methods in Angular services anyway).\r\n readonly setLicenseFile = (data: Map<string, string> | null): void =>\r\n this.licenseFileSubject.next(data);\r\n\r\n /**\r\n * Gets current license file\r\n */\r\n readonly licenseFile = (): Map<string, string> | null => this.licenseFileSubject.value;\r\n\r\n /**\r\n * Sets current federated auth token\r\n */\r\n readonly setFederatedAuthToken = (token: string | null): void =>\r\n this.federatedAuthTokenSubject.next(token);\r\n\r\n /**\r\n * Gets current federated auth token\r\n */\r\n readonly federatedAuthToken = (): string | null => this.federatedAuthTokenSubject.value;\r\n\r\n /**\r\n * Sets current license code\r\n */\r\n readonly setLicenseCode = (code: string | null): void => this.licenseCodeSubject.next(code);\r\n\r\n /**\r\n * Gets current license code\r\n */\r\n readonly licenseCode = (): string | null => this.licenseCodeSubject.value;\r\n\r\n /**\r\n * Sets rememberMe\r\n */\r\n readonly setRememberMe = (value: boolean | false): void => this.rememberMeSubject.next(value);\r\n\r\n /**\r\n * Gets rememberMe\r\n */\r\n readonly rememberMe = (): boolean | false =>\r\n this.rememberMeSubject.value ?? this.getRememberMe() === 'true';\r\n\r\n /**\r\n * Gets current license key for active license code\r\n */\r\n readonly currentLicenseKey = (): string | null => {\r\n const code = this.licenseCodeSubject.value;\r\n const map = this.licenseFileSubject.value;\r\n return code && map ? (map.get(code) ?? null) : null;\r\n };\r\n\r\n /**\r\n * Resolved API base URL\r\n */\r\n readonly apiUrl = (): string => this.configService.api()?.baseUrl ?? '';\r\n\r\n /**\r\n * Logged-in user display name\r\n */\r\n readonly loggedInUserName = (): string => this.getUsername() || 'User';\r\n\r\n /**\r\n * Logged-in user avatar URL\r\n */\r\n readonly loggedInUserImageUrl = (): string | null => doohbotConst.userAvatar;\r\n\r\n /**\r\n * Logged-in user role\r\n */\r\n readonly loggedInUserRole = (): string => {\r\n const roles = this.getRoles();\r\n return Array.isArray(roles) && roles.length > 0 ? roles[0] : roles || 'User';\r\n };\r\n\r\n // State getters (Local Storage/Persistent)\r\n /**`user_id` of logged in user */\r\n readonly getUserId = (): string | null => this.storageService.get<string>('user_id');\r\n\r\n /**`username` of logged in user */\r\n readonly getUsername = (): string | null => this.storageService.get<string>('username');\r\n\r\n /**`rememberMe` of logged in user */\r\n readonly getRememberMe = (): string | null => this.storageService.get<string>('remember_me');\r\n\r\n /**`roles` of logged in user */\r\n readonly getRoles = (): string | null => this.storageService.get<string>('roles');\r\n\r\n /**`permissions` of logged in user */\r\n readonly getPermissions = (): string | null => this.storageService.get<string>('permissions');\r\n\r\n /**`organization_id` of logged in user */\r\n readonly getOrganizationId = (): string | null =>\r\n this.storageService.get<string>('organization_id');\r\n\r\n /**`company_id` of logged in user */\r\n readonly getCompanyId = (): string | null => this.storageService.get<string>('company_id');\r\n\r\n /**`office_id` of logged in user */\r\n readonly getOfficeId = (): string | null => this.storageService.get<string>('office_id');\r\n\r\n /**`access_token` of logged in user */\r\n readonly getAccessToken = (): string | null => this.storageService.get<string>('access_token');\r\n\r\n /**`refresh_token` of logged in user */\r\n readonly getRefreshToken = (): string | null => this.storageService.get<string>('refresh_token');\r\n\r\n /**\r\n * Gets if user is authenticated\r\n */\r\n readonly getIsAuthenticated = (): boolean => this.isAuthenticatedSubject.value ?? false;\r\n\r\n // UI State Signals\r\n public isLoggingIn = signal<boolean>(false);\r\n public authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n\r\n constructor(\r\n private http: HttpService,\r\n private storageService: StorageService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n }\r\n\r\n /**\r\n * Initializes the federated authentication flow.\r\n *\r\n * Validates all required prerequisites (configuration, license, tokens)\r\n * and triggers authentication only when the system is in a valid state.\r\n *\r\n * This method is idempotent and safe to call multiple times; authentication\r\n * will execute only once when all conditions are satisfied.\r\n */\r\n initFederatedAuthFlow() {\r\n combineLatest([\r\n this.federatedAuthTokenSubject,\r\n this.licenseFileSubject,\r\n this.licenseCodeSubject,\r\n ])\r\n .pipe(\r\n filter(\r\n ([federatedToken, licenseFile, licenseCode]) =>\r\n !!federatedToken && !!licenseFile && !!licenseCode,\r\n ),\r\n take(1),\r\n switchMap(() => {\r\n // Login if no accessToken\r\n const accessToken = this.getAccessToken();\r\n if (!accessToken) {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.federatedAuthTokenSubject.value!,\r\n remember_me: this.rememberMeSubject.value ?? this.getRememberMe() === 'true',\r\n };\r\n\r\n Logger.info('Federated login called.', loginRequest);\r\n return from(this.federatedLogin(loginRequest));\r\n }\r\n\r\n return of(false);\r\n }),\r\n )\r\n .subscribe((success) => {\r\n if (!success) {\r\n Logger.info('Federated login failed. User can proceed with normal login.');\r\n return;\r\n }\r\n // Restores authenticated state\r\n return this.authenticate();\r\n });\r\n }\r\n\r\n /**\r\n * Restores authenticated state with all prerequisites satisfied.\r\n * Handles authentication state for normal manual login.\r\n */\r\n initNormalLoginAuthState() {\r\n combineLatest([this.licenseFileSubject, this.licenseCodeSubject])\r\n .pipe(\r\n filter(([licenseFile, licenseCode]) => !!licenseFile && !!licenseCode),\r\n take(1),\r\n switchMap(() => {\r\n Logger.info('initNormalAuthFlow() called.');\r\n return this.authenticate();\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Authenticate user based on stored tokens or refresh tokens.\r\n */\r\n private authenticate(): Observable<void> {\r\n const accessToken = this.getAccessToken();\r\n\r\n //! No access token\r\n if (!accessToken) {\r\n //! For production ( Backend Validation )\r\n // TODO: Consider separating side-effects (next(false)) from the check logic.\r\n this.isAuthenticatedSubject.next(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access token valid\r\n if (!this.isTokenExpired()) {\r\n this.isAuthenticatedSubject.next(true);\r\n return of(void 0);\r\n }\r\n\r\n // Access Token expired -> try refresh\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access expired but refresh token exists → attempt refresh\r\n // Attempt refresh\r\n return this.refreshLogin().pipe(\r\n tap((result) => {\r\n if (!result) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n }\r\n }),\r\n map(() => void 0),\r\n );\r\n }\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n async federatedLogin(param: FederatedLoginRequest): Promise<boolean> {\r\n Logger.info('federatedLogin()', param);\r\n this.isLoggingIn.set(true);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n\r\n try {\r\n const result = await this.federateLoginHttpHelper(param);\r\n Logger.info('federatedLogin() result', result);\r\n if (result && result.success && result.data) {\r\n // Map federated result to something AuthService can handle\r\n // Federated result: { access_token: string, remember_me: boolean }\r\n const authResult = {\r\n access_token: result.data.access_token,\r\n refresh_token: param.remember_me ? result.data.refresh_token : '',\r\n };\r\n this.setSession(authResult, param.remember_me || false);\r\n\r\n Logger.info('Federated login successful, authenticated state set to true');\r\n this.authSuccess.set('Login successful!');\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n this.authError.set('Federated login failed.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Federated login failed:', error);\r\n this.authError.set('An error occurred during federated login.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(param: LoginRequest): Promise<boolean> {\r\n this.isLoggingIn.set(true);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n\r\n try {\r\n const result = await this.loginHttpHelper(param);\r\n // TODO: SECURITY WARNING: Ensure sensitive data (like tokens/passwords) is not logged here in production.\r\n Logger.info('>>>>>>>>>>>Login response<<<<<<<<<<:', result);\r\n\r\n if (result && result.success && result.data) {\r\n this.setSession(result.data, param.rememberMe);\r\n\r\n Logger.info('Login successful, authenticated state set to true');\r\n this.authSuccess.set('Login successful!');\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n SnackbarUtils.error('Login failed. Please check your credentials.');\r\n this.authError.set('Login failed. Please check your credentials.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Login failed:', error);\r\n this.authError.set('An error occurred during login.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Refresh login token. Concurrent calls wait for the first refresh to complete.\r\n */\r\n refreshLogin(): Observable<AuthResult | null> {\r\n try {\r\n if (this.isRefreshing) {\r\n return this.refreshTokenSubject.pipe(\r\n filter((t): t is AuthResult => t !== null),\r\n take(1),\r\n );\r\n }\r\n\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n return of(null);\r\n }\r\n\r\n this.isRefreshing = true;\r\n this.refreshTokenSubject.next(null);\r\n\r\n return from(\r\n // TODO: Use strong typing here instead of casting if possible. Ensure refreshLoginHttpHelper expects RefreshRequest.\r\n this.refreshLoginHttpHelper({\r\n refresh_token: refreshToken,\r\n } as RefreshRequest),\r\n ).pipe(\r\n map((result) => {\r\n const data = result?.data ?? null;\r\n\r\n if (!data?.access_token) {\r\n throw new Error('Refresh token invalid');\r\n }\r\n\r\n return data;\r\n }),\r\n tap((data) => {\r\n this.storageService.set('access_token', data.access_token);\r\n this.storageService.set('refresh_token', data.refresh_token);\r\n this.isAuthenticatedSubject.next(true);\r\n this.refreshTokenSubject.next(data);\r\n }),\r\n catchError(() => {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n this.refreshTokenSubject.next(null);\r\n return of(null);\r\n }),\r\n finalize(() => {\r\n this.isRefreshing = false;\r\n }),\r\n shareReplay(1),\r\n );\r\n } catch {\r\n throw new Error('Unable to authenticate user');\r\n }\r\n }\r\n\r\n /**\r\n * Logout logic enhanced with UI signals\r\n */\r\n async logout(refreshToken?: string): Promise<boolean> {\r\n const token = refreshToken ?? this.getRefreshToken();\r\n if (!token) return false;\r\n\r\n try {\r\n const result = await this.logoutHttpHelper(token);\r\n\r\n if (result?.success) {\r\n this.clear();\r\n SnackbarUtils.success('Logout successful!');\r\n return true;\r\n } else {\r\n // SnackbarUtils.error('Logout failed.');\r\n this.clear(); //TODO:\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Logout failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n // Http Helpers\r\n private async federateLoginHttpHelper(\r\n param: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n const header = this.buildLicenseHeader();\r\n Logger.info('federateLoginHttpHelper() header', header);\r\n return this.http.post('auth/federated/login', param, showLoader, header);\r\n }\r\n\r\n private loginHttpHelper(\r\n param?: LoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader, this.buildLicenseHeader());\r\n }\r\n\r\n // TODO: Change 'param?: object' to 'param?: RefreshRequest' for better type safety.\r\n private refreshLoginHttpHelper(\r\n param?: object,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader, this.buildLicenseHeader());\r\n }\r\n\r\n private logoutHttpHelper(refreshToken: string, showLoader = false): Promise<ApiResponse<void>> {\r\n // Explicitly set the library's access token to override any project token\r\n const accessToken = this.getAccessToken();\r\n let headers = this.buildLicenseHeader().set('X-Skip-Auth-Header', 'true');\r\n\r\n // Add the library's access token\r\n if (accessToken) {\r\n headers = headers.set('Authorization', `Bearer ${accessToken}`);\r\n }\r\n\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader, headers);\r\n }\r\n\r\n private buildLicenseHeader(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n // Attach license for auth endpoints (login, refresh, etc.)\r\n // TODO: Verify if the license key should be non-null. If it is required, throw an error or handle it.\r\n const licenseKey = this.currentLicenseKey();\r\n if (!licenseKey) {\r\n Logger.warn('License key missing — request sent without license header');\r\n return headers;\r\n }\r\n\r\n return headers.set('x-license-key', licenseKey);\r\n }\r\n\r\n // Utility\r\n setSession(session: AuthResult, rememberMe: boolean = true) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n\r\n // Set storage type based on rememberMe preference\r\n // this.storageService.setRememberMe(rememberMe);\r\n this.storageService.set('remember_me', rememberMe);\r\n this.storageService.set('access_token', session.access_token);\r\n this.storageService.set('refresh_token', session.refresh_token);\r\n this.storageService.set('user_id', user?.user_id);\r\n this.storageService.set('username', user?.username);\r\n this.storageService.set('roles', user?.roles);\r\n this.storageService.set('permissions', user?.permissions);\r\n this.storageService.set('organization_id', user?.organization_id);\r\n this.storageService.set('company_id', user?.company_id);\r\n this.storageService.set('office_id', user?.office_id);\r\n\r\n // Notify subscribers\r\n this.isAuthenticatedSubject.next(true);\r\n }\r\n\r\n private isTokenExpired(): boolean {\r\n let token = this.getAccessToken();\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clear() {\r\n const userId = this.getUserId();\r\n Logger.info('[Auth] Clearing auth:', { userId });\r\n\r\n // sessionStorage.clear();\r\n // localStorage.clear();\r\n\r\n this.storageService.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n this.refreshTokenSubject.next(null);\r\n // ENSURE authStatus$ emits unauthenticated\r\n this.isAuthenticatedSubject.next(false);\r\n\r\n Logger.info('[Auth] Auth cleared successfully');\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit, OnChanges {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateDragState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableDrag']) {\r\n this.updateDragState();\r\n }\r\n }\r\n\r\n private updateDragState() {\r\n if (this.enableDrag) {\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n } else {\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'default');\r\n }\r\n // We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?\r\n // Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableDrag) return;\r\n if (event.defaultPrevented) return; // Respect other handlers (like resize)\r\n\r\n if (!this.dragHandle) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // Strict check if handle is explicitly provided via selector, ensuring we only drag when clicking that specific handle\r\n if (\r\n this.dragHandleSelector &&\r\n target !== this.dragHandle &&\r\n !this.dragHandle.contains(target)\r\n ) {\r\n return;\r\n }\r\n\r\n // If using the host element as the handle (no selector), allow dragging from children\r\n // BUT exclude specific interactive elements to ensure usability\r\n if (!this.dragHandleSelector) {\r\n // Check if target is a resize handle (has class or data-dir)\r\n if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle'))\r\n return;\r\n\r\n if (!this.dragHandle.contains(target)) return;\r\n\r\n // Prevent dragging when interacting with controls\r\n const tagName = target.tagName;\r\n if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName)) return;\r\n\r\n // Optional: explicit opt-out class\r\n if (target.classList.contains('no-drag')) return;\r\n }\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy, OnChanges {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.updateResizeState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableResize']) {\r\n this.updateResizeState();\r\n }\r\n }\r\n\r\n private updateResizeState() {\r\n if (this.enableResize) {\r\n if (this.resizeHandles.length === 0) {\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n } else {\r\n this.removeResizeHandles();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n const currentPosition = getComputedStyle(element).position;\r\n\r\n if (currentPosition !== 'fixed' && currentPosition !== 'absolute') {\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n }\r\n\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.addClass(handle, 'doohbot-resize-handle');\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '15px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '20px');\r\n this.renderer.setStyle(handle, 'height', '20px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableResize) return;\r\n if (event.defaultPrevented) return; // Respect other handlers\r\n\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Injectable, signal, inject, effect } from '@angular/core';\r\nimport { StorageService } from '../../core/auth/storage.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { HttpService } from '../../core/http/http.service';\r\nimport { ApiResponse } from '../../core/models/api-response.model';\r\n\r\nexport interface Characteristics {\r\n warm: string;\r\n enthusiastic: string;\r\n headersAndLists: string;\r\n emoji: string;\r\n}\r\n\r\nexport interface AboutYou {\r\n nickname: string;\r\n occupation: string;\r\n}\r\n\r\nexport interface CustomInstructions {\r\n instructions?: string;\r\n preferences?: string;\r\n user_context_id?: string;\r\n}\r\n\r\nexport interface AppearanceSettings {\r\n theme: 'light' | 'dark' | 'auto';\r\n language: string;\r\n}\r\n\r\nexport interface PersonalizationSettings {\r\n customInstructions: CustomInstructions;\r\n appearance: AppearanceSettings;\r\n meta: {\r\n version: number;\r\n lastUpdated: number;\r\n };\r\n}\r\n\r\nconst BASE_STORAGE_KEY = 'app.personalization.v1';\r\n\r\nconst DEFAULT_SETTINGS: PersonalizationSettings = {\r\n customInstructions: { instructions: '', preferences: '' },\r\n appearance: {\r\n theme: 'auto',\r\n language: 'en',\r\n },\r\n meta: {\r\n version: 1,\r\n lastUpdated: Date.now(),\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PersonalizationService {\r\n private storage = inject(StorageService);\r\n private authService = inject(AuthService);\r\n\r\n // State Signals\r\n private _settings = signal<PersonalizationSettings>(DEFAULT_SETTINGS);\r\n public settings = this._settings.asReadonly();\r\n\r\n constructor(\r\n private http: HttpService,\r\n\r\n ) {\r\n // Reload settings when auth status changes (user logins or logouts)\r\n effect(\r\n () => {\r\n // const status = this.authStatus();\r\n this._settings.set(this.loadSettings());\r\n },\r\n { allowSignalWrites: true }, // TODO\r\n );\r\n // Automatically persist changes when settings signal updates\r\n effect(() => {\r\n const currentSettings = this._settings();\r\n this.saveSettings(currentSettings);\r\n });\r\n }\r\n\r\n private getStorageKey(): string {\r\n const userId = this.authService.getUserId();\r\n return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;\r\n }\r\n\r\n /**\r\n * Update custom instructions\r\n */\r\n updateInstructions(instructions: Partial<CustomInstructions>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n customInstructions: {\r\n instructions: instructions.instructions ?? '',\r\n preferences: instructions.preferences ?? '',\r\n user_context_id: instructions.user_context_id ?? s.customInstructions.user_context_id,\r\n },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n\r\n /**\r\n * Update appearance settings\r\n */\r\n updateAppearance(appearance: Partial<AppearanceSettings>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n appearance: { ...s.appearance, ...appearance },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Reset all personalization to defaults\r\n */\r\n resetToDefaults() {\r\n this._settings.set({\r\n ...DEFAULT_SETTINGS,\r\n meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },\r\n });\r\n }\r\n\r\n async saveCustomInstructions(data: CustomInstructions) {\r\n try {\r\n const current = this._settings().customInstructions;\r\n\r\n let res: ApiResponse<CustomInstructions> | null = null;\r\n\r\n if (current?.user_context_id) {\r\n // Update existing record\r\n res = await this.http.put(\r\n `users-context/`,\r\n data,\r\n true // showLoader\r\n );\r\n } else {\r\n // Create new record\r\n res = await this.http.post('users-context/', data, true);\r\n }\r\n\r\n if (res?.success && res.data) {\r\n await this.updateInstructions({\r\n instructions: res.data.instructions ?? current?.instructions ?? '',\r\n preferences: res.data.preferences ?? current?.preferences ?? '',\r\n user_context_id: res.data.user_context_id ?? current?.user_context_id,\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Failed saving custom instructions', e);\r\n }\r\n }\r\n\r\n loadCustomInstructions() {\r\n this.getCustomInstructionHttpHelper(true)\r\n .then(res => {\r\n if (res?.success && res.data) {\r\n this.updateInstructions({\r\n instructions: res.data.instructions ?? '',\r\n preferences: res.data.preferences ?? '',\r\n user_context_id: res.data.user_context_id,\r\n });\r\n }\r\n })\r\n .catch(e => {\r\n console.error('Failed loading user custom instructions', e);\r\n });\r\n }\r\n\r\n\r\n getCustomInstructionHttpHelper(showLoader = false): Promise<ApiResponse<CustomInstructions>> {\r\n const userId = this.authService.getUserId();\r\n return this.http.get(`users-context/${userId}`, undefined, false, showLoader);\r\n }\r\n\r\n private loadSettings(): PersonalizationSettings {\r\n try {\r\n const key = this.getStorageKey();\r\n // StorageService.get handles decryption/parsing\r\n const saved = this.storage.get(key) as any;\r\n if (saved) {\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n ...saved,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n ...(saved.appearance || {}),\r\n },\r\n };\r\n }\r\n } catch (e) {\r\n console.error('Failed to load personalization settings', e);\r\n }\r\n\r\n // Return defaults\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n },\r\n };\r\n }\r\n\r\n private saveSettings(settings: PersonalizationSettings) {\r\n const key = this.getStorageKey();\r\n this.storage.set(key, settings);\r\n }\r\n}\r\n","import { effect, Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { PersonalizationService } from '../../app/personalization/personalization.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n // TODO: Use a single signal for Theme state and derive sub-states (like 'activeTheme') using computed().\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n private personalization: PersonalizationService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n // Sync theme and primary color with PersonalizationService\r\n effect(\r\n () => {\r\n const settings = this.personalization.settings();\r\n const mode = settings.appearance.theme;\r\n\r\n // Update theme mode\r\n this._theme.set(mode);\r\n this.updateActiveTheme(mode);\r\n\r\n // Apply palette from CONFIG if present, or fallback to 'doohbot'\r\n const configPalette = this.configService.theme()?.palette;\r\n this.applyPaletteToGlobal(configPalette || 'doohbot');\r\n\r\n // Update primary color globally from CONFIG (only if explicitly set in user's config)\r\n const configPrimaryColor = this.configService.theme()?.primaryColor;\r\n if (configPrimaryColor) {\r\n this.applyPrimaryColorToGlobal(configPrimaryColor);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n // Separate effect to handle re-application of config when activeTheme changes\r\n effect(() => {\r\n // const currentTheme = this._activeTheme();\r\n const config = this._currentConfig();\r\n if (this.rootElement && config) {\r\n this.applyCssVariables(this.rootElement, config);\r\n }\r\n });\r\n }\r\n\r\n private _currentConfig = signal<DoohbotThemeConfig | undefined>(undefined);\r\n private rootElement: HTMLElement | null = null;\r\n\r\n public setThemeConfig(config: DoohbotThemeConfig, rootElement: HTMLElement) {\r\n this._currentConfig.set(config);\r\n this.rootElement = rootElement;\r\n // Initial apply\r\n this.applyCssVariables(rootElement, config);\r\n }\r\n\r\n public applyPrimaryColorToGlobal(colorInput: string) {\r\n if (!colorInput) return;\r\n\r\n let color = colorInput;\r\n\r\n //! If 'default', do not apply anything. Let CSS fallback handle it.\r\n if (color === 'default') return;\r\n\r\n if (color.includes(',')) {\r\n const parts = color.split(',').map((p) => p.trim());\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n }\r\n\r\n const targetElement = this.rootElement || document.documentElement;\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const onPrimary = this.getContrastColor(color);\r\n\r\n // Standard Material 3 tokens\r\n targetElement.style.setProperty('--mat-sys-primary', color);\r\n targetElement.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n\r\n // Primary Container (using semi-transparent primary as a fallback if no specific logic)\r\n const primaryContainer = `${color}33`; // 20% opacity\r\n targetElement.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n targetElement.style.setProperty('--mat-sys-on-primary-container', color);\r\n\r\n overlayContainer.style.setProperty('--mat-sys-primary', color);\r\n overlayContainer.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n overlayContainer.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n\r\n // Update internal legacy/utility variables\r\n targetElement.style.setProperty('--primary-color', color);\r\n targetElement.style.setProperty('--primary-color-rgb', this.hexToRgb(color));\r\n targetElement.style.setProperty('--user-message-color', color);\r\n targetElement.style.setProperty('--user-text-color', onPrimary);\r\n\r\n overlayContainer.style.setProperty('--primary-color', color);\r\n overlayContainer.style.setProperty('--primary-color-rgb', this.hexToRgb(color));\r\n }\r\n\r\n /**\r\n * Helper to convert hex to comma-separated RGB\r\n */\r\n private hexToRgb(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n return `${r}, ${g}, ${b}`;\r\n }\r\n\r\n /**\r\n * Simple luminance-based contrast calculation\r\n * Returns #ffffff for dark colors and #000000 for light colors\r\n */\r\n private getContrastColor(hex: string): string {\r\n if (!hex || hex.length < 6) return '#ffffff';\r\n\r\n // Remove # if present\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n\r\n // Calculate luminance (standard formula)\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n // TODO: Contrast calculation could be more precise using WCAG 2.1 relative luminance formulas.\r\n return luminance > 0.6 ? '#000000' : '#ffffff';\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this.personalization.updateAppearance({ theme: mode });\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fallback to system preference\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n const overlayContainer = this.overlay.getContainerElement();\r\n // No longer applying to document.documentElement to avoid leaking to host app.\r\n // DoohbotComponent handles applying the theme class to its own host element.\r\n\r\n // We rely on DoohbotComponent to add/remove classes on the host element.\r\n\r\n // Also apply to overlay container (for menus/dialogs)\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n // app-doohbot .db-theme-<palette>\r\n private applyPaletteToGlobal(palette: 'doohbot' | 'aqua' | 'candy' | 'forest' | 'midnight' | 'sunset' | 'slate') {\r\n const targetElement = this.rootElement || document.documentElement;\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Remove all possible theme classes\r\n const paletteClasses = ['db-theme-doohbot', 'db-theme-aqua', 'db-theme-candy', 'db-theme-forest', 'db-theme-midnight', 'db-theme-sunset', 'db-theme-slate'];\r\n\r\n const applyToElement = (el: HTMLElement) => {\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(el, cls));\r\n this.renderer.addClass(el, `db-theme-${palette}`);\r\n };\r\n\r\n applyToElement(targetElement);\r\n applyToElement(overlayContainer);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n /**\r\n * @deprecated Manual CSS variable application is now handled via theme.css tokens\r\n */\r\n public applyCssVariables(element: HTMLElement, config: DoohbotThemeConfig | undefined) {\r\n if (!config) return;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variableName: string) => {\r\n if (input) {\r\n const parts = input.split(',').map((p) => p.trim());\r\n const colorToUse = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n // Apply to Component Host\r\n element.style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Apply to Overlay Container (for Dialogs/Menus which exist outside host)\r\n this.overlay.getContainerElement().style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Secondary mapping for specific variables that have derived states\r\n // if (variableName === 'primary-color') {\r\n // element.style.setProperty('--user-message-color', colorToUse);\r\n // element.style.setProperty('--mat-sys-primary', colorToUse);\r\n // const onPrimary = this.getContrastColor(colorToUse);\r\n // element.style.setProperty('--user-text-color', onPrimary);\r\n // element.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n // }\r\n }\r\n };\r\n\r\n // Font\r\n if (config.fontFamily) {\r\n element.style.setProperty('--font-family', config.fontFamily);\r\n element.style.setProperty('--db-font-family', config.fontFamily);\r\n }\r\n\r\n // Primary & Secondary\r\n // Handled globally via PersonalizationService/applyPrimaryColorToGlobal to allow user overrides\r\n // applyColor(config.primaryColor, 'primary-color');\r\n applyColor(config.secondaryColor, 'secondary-color');\r\n\r\n // Backgrounds\r\n applyColor(config.backgroundColor, 'background-color');\r\n\r\n // Ensure chat input also follows dual mode if provided, or defaults?\r\n // User only asked for background color \"of the entire app\".\r\n applyColor(config.chatInputColor, 'chat-input-color');\r\n\r\n // Text Colors\r\n applyColor(config.textAltColor, 'text-alt-color');\r\n applyColor(config.textColor, 'text-color');\r\n applyColor(config.secondaryTextColor, 'secondary-text-color');\r\n applyColor(config.hintTextColor, 'hint-text-color');\r\n\r\n // Button Colors\r\n applyColor(config.buttonColor, 'button-color');\r\n\r\n // Message Colors\r\n applyColor(config.userMessageColor, 'user-message-color');\r\n applyColor(config.botMessageColor, 'bot-message-color');\r\n\r\n // Message Text Colors\r\n applyColor(config.userTextColor, 'user-text-color');\r\n applyColor(config.botTextColor, 'bot-text-color');\r\n\r\n // Borders\r\n applyColor(config.borderColor, 'border-color');\r\n applyColor(config.borderShadowColor, 'border-shadow-color');\r\n applyColor(config.borderTopColor, 'border-top-color');\r\n\r\n // Indicators\r\n applyColor(config.typingIndicatorColor, 'typing-indicator-color');\r\n\r\n // Utility Colors\r\n applyColor(config.white, 'white');\r\n applyColor(config.black, 'black');\r\n applyColor(config.grey, 'grey');\r\n applyColor(config.red, 'red');\r\n applyColor(config.yellow, 'yellow');\r\n applyColor(config.orange, 'orange');\r\n applyColor(config.green, 'green');\r\n applyColor(config.blue, 'blue');\r\n }\r\n}\r\n","import { Logger } from './../utils/logger.service';\r\nimport { Injectable, NgZone } from '@angular/core';\r\nimport { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { StorageService } from '../auth/storage.service';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n constructor(\r\n private ngZone: NgZone,\r\n private tokenStorage: StorageService,\r\n private http: HttpClient,\r\n ) { }\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n // TODO: Returning an Observable wrapper around Angular's HttpClient progress events is appropriate,\r\n // but ensures the manual line-splitting logic handles all UTF-8 characters and multi-line data correctly.\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n // Note: Authorization header is added automatically by AuthInterceptor\r\n let requestHeaders = new HttpHeaders({\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n });\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach((key) => {\r\n requestHeaders = requestHeaders.set(key, headers[key]);\r\n });\r\n }\r\n\r\n const req = this.http.request('POST', url, {\r\n body,\r\n headers: requestHeaders,\r\n reportProgress: true,\r\n observe: 'events',\r\n responseType: 'text',\r\n });\r\n\r\n let lastLoaded = 0;\r\n\r\n const sub = req.subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.DownloadProgress) {\r\n // Process the new chunk of data\r\n const fullText = (event as any).partialText;\r\n if (!fullText) return;\r\n\r\n const newText = fullText.slice(lastLoaded);\r\n lastLoaded = fullText.length;\r\n\r\n const lines = newText.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.trim() === '') continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n // TODO: ngZone.run() usage within a tight loop (SSE stream) can be expensive. \r\n // Consider using discrete signals or a more optimized zone strategy.\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.response_id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n Logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n } else if (event.type === HttpEventType.Response) {\r\n this.ngZone.run(() => observer.complete());\r\n }\r\n },\r\n error: (err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n },\r\n complete: () => {\r\n this.ngZone.run(() => observer.complete());\r\n },\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n}\r\n","import { Logger } from './../../../core/utils/logger.service';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest, ChatMessage } from '../model/chat-history.model';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n Logger.info('ChatApiService: Initialized');\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Promise<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.http.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions', request, showLoader);\r\n }\r\n\r\n getChatSession(\r\n chatSessionId: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatMessage[]>> {\r\n return this.http.get(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n // }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.clearChatHistory(\r\n // { chat_session_ids: [chatSessionId], delete_all: false },\r\n // showLoader,\r\n // );\r\n // }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Promise<ApiResponse<void>> {\r\n const body = { chat_session_ids: [chatSessionId], delete_all: false };\r\n return this.http.delete('chats/sessions', body, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<void>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n clearChatHistory(request?: object, showLoader = false): Promise<ApiResponse<void>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ChatApiService } from './chat-api.service';\r\nimport { ChatSessionDto } from '../model/chat-session.model';\r\nimport { Message } from '../../../core/models/message';\r\nimport { SnackbarUtils } from '../../../shared/snackbar/snackbar.utils';\r\nimport { ChatSessionResponse, ChatMessage } from '../model/chat-history.model';\r\nimport { Logger } from '../../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private chatApiService = inject(ChatApiService);\r\n\r\n // History State Signals\r\n public sessions = signal<ChatSessionDto[]>([]);\r\n public isLoading = signal<boolean>(false);\r\n public isLoadingMore = signal<boolean>(false);\r\n public hasMore = signal<boolean>(true);\r\n public historyOffset = signal<number>(0);\r\n public isCacheValid = signal<boolean>(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n public mapSessionResponseToSession(\r\n sessionResponse: ChatSessionResponse,\r\n userId: string,\r\n ): ChatSessionDto {\r\n // Use last_message_at or created_at or current time\r\n const timestamp = sessionResponse.last_message_at\r\n ? new Date(sessionResponse.last_message_at)\r\n : sessionResponse.created_at\r\n ? new Date(sessionResponse.created_at)\r\n : new Date();\r\n\r\n Logger.info('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session if they exist\r\n let messages: Message[] = [];\r\n if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {\r\n messages = sessionResponse.messages.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n\r\n // Use response_id as primary ID, fallback to chat_session_id\r\n const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';\r\n\r\n return {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all chat sessions for a specific user\r\n */\r\n async loadSessions(userId: string, forceRefresh = false): Promise<void> {\r\n Logger.info('loadSessions called', { userId, forceRefresh });\r\n\r\n if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {\r\n Logger.info('Cache is valid. Skipping API call.');\r\n return;\r\n }\r\n\r\n this.isLoading.set(true);\r\n this.historyOffset.set(0);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset: 0 });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set(remoteSessions);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(remoteSessions.length);\r\n this.isCacheValid.set(true);\r\n\r\n Logger.info(`Loaded ${remoteSessions.length} sessions. Cache valid: true`);\r\n } else {\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load history');\r\n Logger.error('ChatHistoryService: Failed to load history', err);\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreSessions(userId: string): Promise<void> {\r\n if (!this.hasMore() || this.isLoadingMore()) return;\r\n\r\n const offset = this.historyOffset();\r\n this.isLoadingMore.set(true);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set([...this.sessions(), ...remoteSessions]);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(offset + remoteSessions.length);\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load more history');\r\n Logger.error('ChatHistoryService: Failed to load more history', err);\r\n } finally {\r\n this.isLoadingMore.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load messages for a specific session\r\n */\r\n async loadSessionMessages(sessionId: string): Promise<Message[]> {\r\n try {\r\n const result = await this.chatApiService.getChatSession(sessionId);\r\n\r\n if (result.success && result.data) {\r\n // Interleave user and assistant messages\r\n const messages: ChatMessage[] = [];\r\n const users = result.data.filter((m) => m.role === 'user');\r\n const assistants = result.data.filter((m) => m.role === 'model');\r\n const maxLength = Math.max(users.length, assistants.length);\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n if (users[i]) messages.push(users[i]);\r\n if (assistants[i]) messages.push(assistants[i]);\r\n }\r\n\r\n return messages.map((msg) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load messages');\r\n Logger.error('ChatHistoryService: Failed to load messages', err);\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n async deleteSession(sessionId: string, userId: string): Promise<void> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.deleteChatSession(sessionId);\r\n if (result?.success) {\r\n this.sessions.update((prev) => prev.filter((s) => s.response_id !== sessionId));\r\n SnackbarUtils.success('Conversation deleted successfully');\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to delete conversation');\r\n Logger.error('ChatHistoryService: Failed to delete session', err);\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all history\r\n */\r\n async deleteAllHistory(userId: string): Promise<void> {\r\n this.isLoading.set(true);\r\n try {\r\n const result = await this.chatApiService.clearChatHistory({ delete_all: true });\r\n if (result?.success) {\r\n this.sessions.set([]);\r\n this.isCacheValid.set(false);\r\n SnackbarUtils.success('Chat history cleared');\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to clear history');\r\n Logger.error('ChatHistoryService: Failed to clear history', err);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Update session title\r\n */\r\n async updateSessionTitle(sessionId: string, newTitle: string, userId: string): Promise<boolean> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.updateChatTitle(sessionId, newTitle);\r\n const success = !!result?.success;\r\n\r\n if (success) {\r\n this.sessions.update((prev) =>\r\n prev.map((s) => (s.response_id === sessionId ? { ...s, title: newTitle } : s)),\r\n );\r\n SnackbarUtils.success('Title updated successfully');\r\n }\r\n return success;\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to update title');\r\n Logger.error('ChatHistoryService: Failed to update title', err);\r\n return false;\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n invalidateCache(): void {\r\n // TODO\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMore.set(true);\r\n }\r\n\r\n /**\r\n * Clear all history state\r\n */\r\n clearState(): void {\r\n this.sessions.set([]);\r\n this.isLoading.set(false);\r\n this.isLoadingMore.set(false);\r\n this.hasMore.set(true);\r\n this.historyOffset.set(0);\r\n this.isCacheValid.set(false);\r\n this.processingSessionId.set(null);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Advanced configuration for DoohBot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","import { Injectable, signal, computed, effect, Signal } from '@angular/core';\r\nimport { Message } from '../../core/models/message';\r\n\r\n/**\r\n * ChatUIStateService - Centralized UI state management\r\n *\r\n * Manages all UI-related state for the chat component including:\r\n * - Chat window open/close state\r\n * - History sidebar visibility\r\n * - Unread message tracking\r\n * - Fullscreen state\r\n *\r\n * This service uses Angular signals for reactive state management,\r\n * allowing components to subscribe to state changes efficiently.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatUIStateService {\r\n //! ===================== UI STATE SIGNALS============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Reference to current messages (injected from outside)\r\n */\r\n private messagesSignal: Signal<Message[]> = signal<Message[]>([]);\r\n\r\n //! ===================== COMPUTED SIGNALS ======================\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messagesSignal();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'model');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messagesSignal();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n // TODO: allowSignalWrites: true is a design smell in Angular. \r\n // It's better to trigger 'markAsRead' explicitly via events or a dedicated method call when the Relevant UI state changes.\r\n { allowSignalWrites: true },\r\n );\r\n\r\n //! =================== PUBLIC METHODS ===========================\r\n\r\n /**\r\n * Set the messages signal reference from an external source\r\n * This allows the UI state service to track messages from MessageService\r\n */\r\n setMessagesSignal(messagesSignal: Signal<Message[]>): void {\r\n this.messagesSignal = messagesSignal;\r\n }\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const messages = this.messagesSignal();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n}\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSessionDto } from './model/chat-session.model';\r\nimport { ChatHistoryService } from './services/chat-history.service';\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { SnackbarUtils } from '../../shared/snackbar/snackbar.utils';\r\nimport { ChatApiError } from '../../core/models/api-request.model';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport { ChatRequest } from './model/chat-request.model';\r\nimport { ChatStreamMessage } from './model/chat-stream-message.model';\r\nimport { AuthService } from './../../core/auth/auth.service';\r\nimport { ChatUIStateService } from './chat-ui-state.service';\r\nimport { DoohbotConfigService } from '../../core/config/doohbot-config.service';\r\nimport { Logger } from '../../core/utils/logger.service';\r\nimport { MarkdownService } from '../../core/services/markdown.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private apiService = inject(ChatApiService);\r\n private authService = inject(AuthService);\r\n private configService = inject(DoohbotConfigService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private chatUIStateService = inject(ChatUIStateService);\r\n private markdownService = inject(MarkdownService);\r\n private chatSessions = this.chatHistoryService.sessions;\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n public showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'model');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n // Active session\r\n private activeSession: ChatSessionDto | null = null;\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n\r\n //! Controls whether to use Streaming API (default) or Standard API\r\n // public isStreaming = computed(() => !this.configService.api);\r\n public isStreaming = computed(() => !this.configService.useNonStreamingChat());\r\n\r\n // TODO: Use specific ChatStreamMessage[] type for messagesStream.\r\n messagesStream: Array<ChatStreamMessage> = [];\r\n currentResponse = '';\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n Logger.info('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Create a new chat session\r\n */\r\n createSession(userId: string, sessionId: string): ChatSessionDto {\r\n return {\r\n response_id: sessionId, // Backend will assign ID after first message\r\n last_message_at: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n userId,\r\n };\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(sessionId?: string): void {\r\n const userId = this.authService.getUserId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n\r\n this.activeSession = this.createSession(userId, sessionId || '');\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSessionDto): void {\r\n Logger.info(\r\n '[ChatService] Loading session:',\r\n session.response_id,\r\n 'Messages:',\r\n session.messages.length,\r\n );\r\n this.activeSession = session;\r\n // Load session messages and convert markdown for completed model messages\r\n this.messages.set(\r\n session.messages.map((m) =>\r\n m.sender === 'model' && m.completed\r\n ? {\r\n ...m,\r\n textHtml: this.markdownService.convert(m.text),\r\n }\r\n : m,\r\n ),\r\n );\r\n Logger.info('[ChatService] Messages signal updated. Current count:', this.messages().length);\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSessionDto | null {\r\n return this.activeSession;\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n }\r\n\r\n /**\r\n * Continue a chat session\r\n */\r\n public async continueSession(sessionId: string): Promise<void> {\r\n Logger.info(`[ChatService] continuing session: ${sessionId}`);\r\n const result = await this.chatHistoryService.loadSessionMessages(sessionId);\r\n const loadedMessages = result || [];\r\n const sessionFromList = this.chatSessions().find((s) => s.response_id === sessionId);\r\n\r\n if (sessionFromList) {\r\n sessionFromList.messages = loadedMessages;\r\n this.loadSession(sessionFromList);\r\n } else {\r\n const timestamp =\r\n loadedMessages.length > 0\r\n ? loadedMessages[loadedMessages.length - 1].timestamp || new Date()\r\n : new Date();\r\n\r\n const userId = this.authService.getUserId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n const newSession: ChatSessionDto = {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: 'Previous Conversation',\r\n messages: loadedMessages,\r\n userId,\r\n };\r\n this.loadSession(newSession);\r\n }\r\n this.chatUIStateService.openChat();\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string, maxLength: number = 4000): Promise<void> {\r\n const trimmedText = text.trim();\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > maxLength) {\r\n SnackbarUtils.error('Message too long.');\r\n return;\r\n }\r\n\r\n const requestSession = this.activeSession;\r\n\r\n this.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n this.isLoadingApi.set(true);\r\n\r\n try {\r\n const request = this.buildChatRequest(trimmedText);\r\n\r\n if (this.isStreaming()) {\r\n // STREAMING HANDLES MODEL MESSAGE ITSELF\r\n await this.stream(request);\r\n } else {\r\n // NON-STREAMING RETURNS FULL TEXT\r\n const response = await this.ask(request);\r\n\r\n if (this.activeSession === requestSession && response) {\r\n this.addMessage({\r\n sender: 'model',\r\n text: response,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n });\r\n }\r\n }\r\n } finally {\r\n if (this.activeSession === requestSession) {\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a unique message ID to prevent collisions\r\n */\r\n private generateMessageId(): string {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Builds a chat request payload with the given user text and optional active session\r\n * @param {string} userInput - The text provided by the user\r\n * @returns {ChatRequest} - A chat request payload with the user text and optional active session\r\n * @memberof ChatService\r\n */\r\n\r\n private buildChatRequest(userText: string): ChatRequest {\r\n const request: ChatRequest = {\r\n query: userText,\r\n organization_id: this.authService.getOrganizationId() || '',\r\n prompt_mode: this.promptMode(),\r\n };\r\n\r\n // Continue conversation if active session exists and has a backend ID\r\n if (this.activeSession?.response_id) {\r\n request.response_id = this.activeSession.response_id;\r\n Logger.info('>>>> conversation continued:', this.activeSession.response_id);\r\n } else {\r\n Logger.info('>>>> new conversation started');\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Send chat message using standard endpoint and return the response content.\r\n */\r\n private async ask(request: ChatRequest): Promise<string> {\r\n Logger.info('>>>>Using Standard Chat Endpoint<<<<');\r\n\r\n const currentSession = this.activeSession;\r\n\r\n try {\r\n const response = await this.apiService.sendMessage(request, true); // returns Promise<ApiResponse<ChatResponse>>\r\n\r\n if (this.activeSession === currentSession) {\r\n this.isLoadingApi.set(false);\r\n }\r\n\r\n if (response?.success && response.data) {\r\n if (\r\n this.activeSession === currentSession &&\r\n this.activeSession &&\r\n !this.activeSession.response_id\r\n ) {\r\n // First message response - capture the real session ID\r\n this.activeSession.response_id = response.data.id;\r\n // Invalidate cache to ensure history list updates\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n return response.data.content || this.getFallbackError();\r\n } else {\r\n return this.getFallbackError();\r\n }\r\n } catch (error) {\r\n Logger.error('Ask error:', error);\r\n\r\n if (this.activeSession === currentSession) {\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n }\r\n\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n private async stream(request: ChatRequest): Promise<void> {\r\n Logger.info('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n const assistantMessage: Message = {\r\n id: this.generateMessageId(),\r\n sender: 'model',\r\n text: '',\r\n chunks: [],\r\n timestamp: new Date(),\r\n completed: false,\r\n isHistory: false,\r\n showSuggestions: false,\r\n };\r\n\r\n const requestSession = this.activeSession;\r\n const streamComplete$ = new Subject<void>();\r\n let hasStarted = false;\r\n\r\n this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n if (!hasStarted) {\r\n hasStarted = true;\r\n this.isBotTyping.set(false);\r\n\r\n this.addMessage(assistantMessage);\r\n\r\n // capture backend session id once\r\n if (this.activeSession && !this.activeSession.response_id && chunk.response_id) {\r\n this.activeSession.response_id = chunk.response_id;\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n }\r\n\r\n if (!chunk.content) return;\r\n\r\n const newText = assistantMessage.text + chunk.content;\r\n assistantMessage.text = newText;\r\n\r\n const html = this.markdownService.convert(newText);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id ? { ...m, text: newText, textHtml: html } : m,\r\n ),\r\n );\r\n },\r\n complete: () => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) => (m.id === assistantMessage.id ? { ...m, completed: true } : m)),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n error: () => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n const fallback = this.getFallbackError();\r\n const html = this.markdownService.convert(fallback);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? { ...m, text: fallback, textHtml: html, completed: true }\r\n : m,\r\n ),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n });\r\n\r\n await lastValueFrom(streamComplete$);\r\n }\r\n}\r\n","import { Component, input, output, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\nimport { ChatService } from '../../chat.service';\r\nimport { ChatUIStateService } from '../../chat-ui-state.service';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-header',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatMenuModule],\r\n templateUrl: './chat-header.component.html',\r\n styleUrls: ['./chat-header.component.scss'],\r\n})\r\nexport class ChatHeaderComponent {\r\n //inputs\r\n isAuthenticated = input(false);\r\n isFullScreen = input(false);\r\n settingsMenu = input<any>();\r\n isNewChatDisabled = input(false);\r\n\r\n //outputs\r\n toggleChat = output<void>();\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n clearChat = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public themeService = inject(ThemeService);\r\n public chatService = inject(ChatService);\r\n private uiState = inject(ChatUIStateService);\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onStartNewConversation() {\r\n // Logger.warn('Starting new conversation...');\r\n this.chatService.startNewSession();\r\n this.uiState.closeHistorySidebar();\r\n }\r\n}\r\n","<div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" [src]=\" doohbotConst.appLogo\" alt=\"Logo\" />\r\n <h2>{{ doohbotConst.appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- History Button -->\r\n\r\n <!-- add chat Button -->\r\n @if (isAuthenticated()) {\r\n <button class=\"header-button\" (click)=\"onStartNewConversation()\" title=\"Start new conversation\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- history Button -->\r\n @if (isAuthenticated() && !isFullScreen()) {\r\n <button class=\"header-button\" (click)=\"onToggleHistorySidebar()\" title=\"Chat History\">\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- more Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>minimize</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatIconModule],\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n})\r\nexport class LoginFormComponent {\r\n @Input() isLoggingIn: boolean = false;\r\n\r\n @Output() loginSubmit = new EventEmitter<{\r\n username: string;\r\n password: string;\r\n rememberMe: boolean;\r\n }>();\r\n @Output() cancel = new EventEmitter<void>();\r\n\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showPassword = false;\r\n public rememberMe = false;\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onLoginSubmit() {\r\n if (this.loginUsername && this.loginPassword) {\r\n this.loginSubmit.emit({\r\n username: this.loginUsername.toLowerCase(),\r\n password: this.loginPassword,\r\n rememberMe: this.rememberMe,\r\n });\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n>\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button type=\"submit\" class=\"auth-btn primary\" [disabled]=\"loginForm.invalid || isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chat-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chat-footer.component.html',\r\n styleUrls: ['./chat-footer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChatFooterComponent {\r\n showDisclaimer = input(false);\r\n}\r\n","@if (showDisclaimer()) {\r\n<div class=\"chat-footer-container\">\r\n <p class=\"disclaimer\">AI-generated content may not be accurate.</p>\r\n</div>\r\n}","export const AppEntity = {\r\n amp: '&',\r\n lt: '<',\r\n gt: '>',\r\n quot: '"',\r\n apos: ''',\r\n at: '@',\r\n};\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { AppEntity } from '../../../../const/html-entities';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-preferences-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule, MatFormFieldModule, MatSelectModule],\r\n templateUrl: './preferences-section.component.html',\r\n styleUrls: ['./preferences-section.component.scss'],\r\n})\r\nexport class PreferencesSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() defaultColor: string = 'doohbot';\r\n @Input() username: string = 'User';\r\n @Input() userImageUrl: string | null = null;\r\n @Input() userRole: string = 'Doohbot User';\r\n\r\n appEntity = AppEntity;\r\n\r\n get initials(): string {\r\n return this.username ? this.username.charAt(0).toUpperCase() : 'U';\r\n }\r\n\r\n @Output() onThemeSelect = new EventEmitter<'light' | 'dark' | 'auto'>();\r\n @Output() onLanguageSelect = new EventEmitter<string>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onReset = new EventEmitter<void>();\r\n\r\n public languages = [\r\n { code: 'en', label: 'English' },\r\n { code: 'es', label: 'Spanish' },\r\n { code: 'fr', label: 'French' },\r\n { code: 'de', label: 'German' },\r\n { code: 'it', label: 'Italian' },\r\n { code: 'pt', label: 'Portuguese' },\r\n { code: 'zh', label: 'Chinese' },\r\n { code: 'ja', label: 'Japanese' },\r\n { code: 'ko', label: 'Korean' },\r\n { code: 'ar', label: 'Arabic' },\r\n { code: 'hi', label: 'Hindi' },\r\n ];\r\n\r\n // Color and Style helpers removed\r\n\r\n getThemeIcon(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'light_mode';\r\n case 'dark': return 'dark_mode';\r\n default: return 'brightness_auto';\r\n }\r\n }\r\n\r\n getThemeLabel(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'Light Mode';\r\n case 'dark': return 'Dark Mode';\r\n default: return 'System';\r\n }\r\n }\r\n\r\n getLanguageLabel(code: string): string {\r\n return this.languages.find(l => l.code === code)?.label || 'Select';\r\n }\r\n\r\n // Style and Picker helpers removed\r\n}\r\n","<div class=\"preferences-container\">\r\n <header class=\"pane-header\">\r\n <h1>General & Profile</h1>\r\n <p>Manage your profile and customize how your assistant looks.</p>\r\n </header>\r\n\r\n <div class=\"profile-card\">\r\n <div class=\"avatar-section\">\r\n <div class=\"letter-avatar\" [class.has-image]=\"!!userImageUrl\">\r\n @if (userImageUrl) {\r\n <img [src]=\"userImageUrl\" [alt]=\"username\" class=\"profile-img\" />\r\n } @else {\r\n {{ initials }}\r\n }\r\n </div>\r\n <div class=\"user-main-info\">\r\n <h2>{{ username }}</h2>\r\n <p class=\"role-badge\">{{ userRole }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-grid\">\r\n <div class=\"info-item\">\r\n <label>Full Name</label>\r\n <div class=\"info-value\">{{ username }}</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Email Address</label>\r\n <div class=\"info-value\">user@adzen.tech</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Organization</label>\r\n <div class=\"info-value\">Adzen Tech Private Limited</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Member Since</label>\r\n <div class=\"info-value\">January 2026</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Appearance Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Appearance</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select [value]=\"settings.appearance.theme\" (selectionChange)=\"onThemeSelect.emit($event.value)\">\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getThemeIcon(settings.appearance.theme) }}</mat-icon>\r\n <span>{{ getThemeLabel(settings.appearance.theme) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"light\">\r\n <div class=\"option-content\">\r\n <mat-icon>light_mode</mat-icon>\r\n <span>Light Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"dark\">\r\n <div class=\"option-content\">\r\n <mat-icon>dark_mode</mat-icon>\r\n <span>Dark Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"auto\">\r\n <div class=\"option-content\">\r\n <mat-icon>brightness_auto</mat-icon>\r\n <span>System</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Language Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Language</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select [value]=\"settings.appearance.language\" (selectionChange)=\"onLanguageSelect.emit($event.value)\">\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <span>{{ getLanguageLabel(settings.appearance.language) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n @for (lang of languages; track lang.code) {\r\n <mat-option [value]=\"lang.code\">\r\n {{ lang.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Voice Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Voice</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Cove</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Data Controls Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Data controls</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Manage</button>\r\n </div>\r\n </div>-->\r\n </div>\r\n\r\n <div class=\"section-actions\">\r\n <button mat-button class=\"pill-btn\" (click)=\"onReset.emit()\">Reset to defaults</button>\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" (click)=\"onSave.emit()\">\r\n Apply Changes\r\n </button>\r\n </div>\r\n</div>","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-terms-section',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './terms-section.component.html',\r\n styleUrls: ['./terms-section.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TermsSectionComponent { }\r\n","<div class=\"terms-container\">\r\n <header class=\"pane-header\">\r\n <h1>Terms and Conditions</h1>\r\n <!-- <p class=\"last-updated\">Last updated: January 9, 2026</p> -->\r\n </header>\r\n\r\n <div class=\"terms-card\">\r\n <div class=\"terms-content\">\r\n <section>\r\n <h4>1. Acceptance of Terms</h4>\r\n <p>By using Doohbot, you agree to comply with and be bound by these terms and conditions. Please read\r\n them\r\n carefully.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>2. Privacy & Data</h4>\r\n <p>We value your privacy. Your chat history and personalization settings are stored locally or securely\r\n on\r\n our servers to improve your experience.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>3. Usage Guidelines</h4>\r\n <p>Doohbot is intended for professional use within the Doohclick ecosystem. Misuse or automated scraping\r\n is\r\n strictly prohibited.</p>\r\n </section>\r\n\r\n <div class=\"full-terms-link\">\r\n <a href=\"#\">View Full Terms and Conditions →</a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, inject, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\nexport interface ActiveSession {\r\n id: string;\r\n device: string;\r\n location: string;\r\n created: string;\r\n updated: string;\r\n isCurrent?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-account-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatButtonModule, MatTooltipModule, MatMenuModule],\r\n templateUrl: './account-section.component.html',\r\n styleUrls: ['./account-section.component.scss']\r\n})\r\nexport class AccountSectionComponent {\r\n // private dialogService = inject(DialogService);\r\n private authService = inject(AuthService);\r\n // private cd = inject(ChangeDetectorRef);\r\n\r\n @Input() organizationId: string = '';\r\n public isCopied = false;\r\n\r\n constructor(\r\n private dialogService: DialogService,\r\n private cd: ChangeDetectorRef) { }\r\n\r\n ngOnInit() {\r\n if (!this.organizationId) {\r\n this.organizationId = this.authService.getOrganizationId() || '';\r\n }\r\n }\r\n\r\n @Output() onDeleteAllHistory = new EventEmitter<void>();\r\n @Output() onLogout = new EventEmitter<void>();\r\n @Output() onLogoutAll = new EventEmitter<void>();\r\n @Output() onLogoutSession = new EventEmitter<string>();\r\n @Output() onDeleteAccount = new EventEmitter<void>();\r\n\r\n public confirmLogout() {\r\n this.dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogout.emit();\r\n });\r\n }\r\n\r\n public sessions: ActiveSession[] = [\r\n {\r\n id: 'session-1',\r\n device: 'Chrome (Windows)',\r\n location: 'Kathmandu, Bagmati Province, NP',\r\n created: 'Jan 9, 2026, 9:21 AM',\r\n updated: 'Jan 9, 2026, 9:21 AM',\r\n isCurrent: true\r\n }\r\n ];\r\n\r\n copyOrgId() {\r\n const orgId = this.authService.getOrganizationId();\r\n if (orgId) {\r\n navigator.clipboard.writeText(orgId);\r\n this.isCopied = true;\r\n this.cd.detectChanges();\r\n\r\n setTimeout(() => {\r\n this.isCopied = false;\r\n this.cd.detectChanges();\r\n }, 800);\r\n }\r\n }\r\n\r\n confirmLogoutAll() {\r\n this.dialogService.open({\r\n title: 'Log out of all devices',\r\n message: 'Are you sure you want to log out of all active devices? You will be signed out everywhere except here.',\r\n confirmText: 'Log out all',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutAll.emit();\r\n });\r\n }\r\n\r\n confirmLogoutSession(session: ActiveSession) {\r\n this.dialogService.open({\r\n title: 'Log out of session',\r\n message: `Are you sure you want to log out from ${session.device} at ${session.location}?`,\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutSession.emit(session.id);\r\n });\r\n }\r\n\r\n confirmDeleteAllHistory() {\r\n this.dialogService.open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAllHistory.emit();\r\n });\r\n }\r\n\r\n confirmDeleteAccount() {\r\n this.dialogService.open({\r\n title: 'Delete Your Account',\r\n message: 'This will permanently delete your account and all associated data. This action is irreversible. Are you absolutely sure?',\r\n confirmText: 'Delete Account',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'person_remove'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAccount.emit();\r\n });\r\n }\r\n}\r\n","<div class=\"account-container\">\r\n <header class=\"pane-header\">\r\n <h1>Account Settings</h1>\r\n <p>Manage your account details and personal information.</p>\r\n </header>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Logout row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Log out</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn primary\" (click)=\"confirmLogout()\">Logout</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Delete all chats row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Delete all chats</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmDeleteAllHistory()\">Delete all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Export data row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Export data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Export</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Org ID row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Organization ID</span>\r\n <span class=\"row-sublabel\">Used for workspace identification</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <code class=\"org-id\">{{ organizationId }}</code>\r\n <button mat-icon-button (click)=\"copyOrgId()\" [matTooltip]=\"isCopied ? 'Copied!' : 'Copy ID'\">\r\n <mat-icon>{{ isCopied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Logout all row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Global Logout</span>\r\n <span class=\"row-sublabel\">Sign out from all active devices</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmLogoutAll()\">Logout all</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Delete account row -->\r\n <!-- <div class=\"settings-row no-border\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label danger-text\">Delete account</span>\r\n <span class=\"row-sublabel\">Permanently delete your profile and data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger-filled\" (click)=\"confirmDeleteAccount()\">Delete Account</button>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Active Sessions Section -->\r\n <!-- <div class=\"sessions-section\">\r\n <h3>Active sessions</h3>\r\n <div class=\"sessions-table-container\">\r\n <table class=\"sessions-table\">\r\n <thead>\r\n <tr>\r\n <th>Device</th>\r\n <th>Location</th>\r\n <th>Created</th>\r\n <th>Updated</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (session of sessions; track session.id) {\r\n <tr [class.current]=\"session.isCurrent\">\r\n <td>\r\n <div class=\"device-cell\">\r\n <mat-icon>{{ session.device.includes('Windows') ? 'laptop' : 'smartphone' }}</mat-icon>\r\n <div class=\"device-info\">\r\n <span class=\"device-name\">{{ session.device }}</span>\r\n @if (session.isCurrent) {\r\n <span class=\"current-badge\">Current</span>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n <td>{{ session.location }}</td>\r\n <td>{{ session.created }}</td>\r\n <td>{{ session.updated }}</td>\r\n <td class=\"action-cell\">\r\n @if (!session.isCurrent) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"sessionMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #sessionMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item (click)=\"confirmLogoutSession(session)\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Log out of session</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div> -->\r\n</div>","import { DialogService } from './dialog.service';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Utility class for common dialog operations\r\n * Provides reusable dialog configurations for consistency across the application\r\n */\r\nexport class DialogUtils {\r\n /**\r\n * Show a logout confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmLogout(\r\n dialogService: DialogService,\r\n confirmButtonColor: 'primary' | 'accent' | 'warn' = 'warn'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to logout?',\r\n confirmText: 'Logout',\r\n cancelText: 'Cancel',\r\n icon: 'logout',\r\n confirmButtonColor: confirmButtonColor,\r\n });\r\n }\r\n\r\n /**\r\n * Show a reset confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Optional name of what is being reset (default: 'preferences')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmReset(\r\n dialogService: DialogService,\r\n itemName: string = 'preferences'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Reset to Defaults',\r\n message: `Are you sure you want to reset ${itemName} to default settings? This action cannot be undone.`,\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n icon: 'restart_alt',\r\n confirmButtonColor: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Show a delete confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDelete(\r\n dialogService: DialogService,\r\n itemName: string = 'this item'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Show a clear all confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of what is being cleared (e.g., 'chat history', 'all sessions')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmClearAll(\r\n dialogService: DialogService,\r\n itemName: string = 'all items'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Clear All',\r\n message: `Are you sure you want to clear ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n });\r\n }\r\n\r\n /**\r\n * Show a discard changes confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDiscardChanges(dialogService: DialogService): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Discard Changes',\r\n message: 'You have unsaved changes. Are you sure you want to discard them?',\r\n confirmText: 'Discard',\r\n cancelText: 'Keep Editing',\r\n confirmButtonColor: 'warn',\r\n icon: 'warning',\r\n });\r\n }\r\n}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-instruction-section',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatButtonModule],\r\n templateUrl: './instruction-section.component.html',\r\n styleUrls: ['./instruction-section.component.scss'],\r\n})\r\nexport class InstructionSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() hasChanges = false;\r\n @Output() onSave = new EventEmitter<void>();\r\n}","<div class=\"instruction-container\">\r\n <header class=\"pane-header\">\r\n <h1>Personalization</h1>\r\n <p>Tell us more about yourself and how you want the assistant to respond.</p>\r\n </header>\r\n\r\n <div class=\"instruction-card\">\r\n <div class=\"instruction-fields\">\r\n <div class=\"field-item\">\r\n <label>What should the assistant know about you?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.preferences\"\r\n placeholder=\"e.g. I prefer code examples in TypeScript...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"field-item\">\r\n <label>How should the assistant respond?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.instructions\"\r\n placeholder=\"e.g. Be concise and use bullet points...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"section-actions\">\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" [disabled]=\"!hasChanges\" (click)=\"onSave.emit()\">\r\n Save\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule, CommonModule],\r\n})\r\nexport class SnackBar implements OnInit {\r\n // private snackBarRef = inject(MatSnackBarRef);\r\n // private data = inject(MAT_SNACK_BAR_DATA);\r\n\r\n public message: string | null = null;\r\n public type: SnackBarError = 'error';\r\n\r\n constructor(\r\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\r\n private snackBarRef: MatSnackBarRef<any>\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.message = this.data.message;\r\n this.type = this.data.type || 'error';\r\n }\r\n\r\n close() {\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n get icon(): string {\r\n switch (this.type) {\r\n case 'success':\r\n return 'check_circle';\r\n case 'error':\r\n return 'error';\r\n case 'warn':\r\n return 'warning';\r\n case 'info':\r\n return 'info';\r\n default:\r\n return 'info';\r\n }\r\n }\r\n}\r\n","<div class=\"snackbar-message\" [ngClass]=\"'type-' + type\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">{{ icon }}</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\nimport { SnackBar } from './snackbar.component';\r\nimport { SnackbarUtils } from './snackbar.utils';\r\n\r\nexport interface SnackbarConfig {\r\n message: string;\r\n duration?: number;\r\n type: SnackBarError;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnackbarService {\r\n // private snackBar = inject(MatSnackBar);\r\n\r\n constructor(private snackBar: MatSnackBar) {\r\n SnackbarUtils.init(this);\r\n }\r\n\r\n // Generic show method\r\n private show(message: string, duration: number, type: SnackBarError) {\r\n this.snackBar.openFromComponent(SnackBar, {\r\n duration: duration,\r\n data: { message, type },\r\n horizontalPosition: 'end',\r\n verticalPosition: 'bottom',\r\n panelClass: [`snackbar-${type}`]\r\n });\r\n }\r\n\r\n // Convenience methods\r\n success(message: string, duration: number = 3000) {\r\n this.show(message, duration, 'success');\r\n }\r\n\r\n warn(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'warn');\r\n }\r\n\r\n error(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'error');\r\n }\r\n\r\n info(message: string, duration: number = 4000) {\r\n this.show(message, duration, 'info');\r\n }\r\n\r\n clear() {\r\n this.snackBar.dismiss();\r\n }\r\n}\r\n","import { Component, inject, OnDestroy, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';\r\nimport { TermsSectionComponent } from './sections/terms/terms-section.component';\r\nimport { AccountSectionComponent } from './sections/account/account-section.component';\r\nimport { ChatHistoryService } from '../chat/services/chat-history.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { PersonalizationService, PersonalizationSettings } from './personalization.service';\r\nimport { DialogService } from '../../shared/dialog/dialog.service';\r\nimport { DialogUtils } from '../../shared/dialog/dialog.utils';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\nimport { InstructionSectionComponent } from './sections/instruction/instruction-section.component';\r\n\r\n@Component({\r\n selector: 'app-personalization-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTabsModule,\r\n MatSlideToggleModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n PreferencesSectionComponent,\r\n InstructionSectionComponent,\r\n TermsSectionComponent,\r\n AccountSectionComponent,\r\n ],\r\n templateUrl: './personalization-dialog.component.html',\r\n styleUrls: ['./personalization-dialog.component.scss'],\r\n})\r\nexport class PersonalizationDialogComponent implements OnDestroy {\r\n // private dialogRef = inject(MatDialogRef<PersonalizationDialogComponent>);\r\n // private dialogService = inject(DialogService);\r\n public personalization = inject(PersonalizationService);\r\n private authService = inject(AuthService);\r\n private chatHistory = inject(ChatHistoryService);\r\n // private snackbar = inject(SnackbarService);\r\n\r\n // Local copy of settings for editing\r\n public settings: PersonalizationSettings = JSON.parse(\r\n JSON.stringify(this.personalization.settings()),\r\n );\r\n\r\n public activeSection = 'preferences';\r\n\r\n public sections = [\r\n { id: 'preferences', label: 'General', icon: 'tune', type: 'item' },\r\n { id: 'general', label: 'Personalization', icon: 'settings_suggest', type: 'item' },\r\n { id: 'account_settings', label: 'Account & Security', icon: 'manage_accounts', type: 'item' },\r\n { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },\r\n ];\r\n\r\n // colorTokens removed\r\n\r\n private themeService = inject(ThemeService);\r\n private isSaved = false;\r\n\r\n constructor(\r\n private dialogRef: MatDialogRef<PersonalizationDialogComponent>,\r\n private dialogService: DialogService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n effect(() => {\r\n const s = this.personalization.settings();\r\n this.settings = structuredClone(s);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.personalization.loadCustomInstructions();\r\n }\r\n\r\n onSave() {\r\n if (this.activeSection === 'preferences') {\r\n this.isSaved = true;\r\n this.personalization.updateAppearance(this.settings.appearance);\r\n // Re-apply to ensure consistency (effect handles it, but just in case)\r\n this.snackbar.success('Appearance settings saved');\r\n } else if (this.activeSection === 'general') {\r\n this.personalization.saveCustomInstructions(this.settings.customInstructions);\r\n this.snackbar.success('Settings saved');\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close(false);\r\n // ngOnDestroy will handle revert\r\n }\r\n\r\n ngOnDestroy() {\r\n // No color revert needed since primaryColor is config-driven\r\n }\r\n\r\n onReset() {\r\n DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Only reset the current section\r\n if (this.activeSection === 'preferences') {\r\n // Reset only appearance settings to defaults\r\n this.personalization.resetToDefaults();\r\n // Re-clone settings to update UI\r\n this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));\r\n }\r\n }\r\n });\r\n }\r\n\r\n selectTheme(theme: 'light' | 'dark' | 'auto') {\r\n this.settings.appearance.theme = theme;\r\n }\r\n\r\n selectLanguage(language: string) {\r\n this.settings.appearance.language = language;\r\n }\r\n\r\n selectSection(sectionId: string) {\r\n if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {\r\n this.activeSection = sectionId;\r\n }\r\n }\r\n\r\n get hasChanges(): boolean {\r\n if (this.activeSection === 'preferences') return this.hasPreferencesChanges();\r\n if (this.activeSection === 'general') return this.hasInstructionChanges();\r\n return false;\r\n }\r\n\r\n hasPreferencesChanges(): boolean {\r\n const original = this.personalization.settings().appearance;\r\n const current = this.settings.appearance;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n hasInstructionChanges(): boolean {\r\n const original = this.personalization.settings().customInstructions;\r\n const current = this.settings.customInstructions;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n get username(): string {\r\n return this.authService.loggedInUserName();\r\n }\r\n\r\n get userImageUrl(): string | null {\r\n return this.authService.loggedInUserImageUrl();\r\n }\r\n\r\n get userRole(): string {\r\n return this.authService.loggedInUserRole();\r\n }\r\n\r\n // Color helpers removed\r\n\r\n async deleteAllHistory() {\r\n const userId = this.authService.getUserId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n }\r\n\r\n logoutAllDevices() {\r\n console.log('Logging out of all devices...');\r\n // Implement service call when API is ready\r\n }\r\n\r\n logout() {\r\n this.authService.logout();\r\n this.dialogRef.close(true);\r\n }\r\n\r\n deleteAccount() {\r\n console.log('Deleting account...');\r\n // Implement service call when API is ready\r\n }\r\n}\r\n","<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-content-body\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div class=\"nav-item\" [class.active]=\"activeSection === section.id\" (click)=\"selectSection(section.id)\">\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section [settings]=\"settings\" [username]=\"username\" [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\" (onThemeSelect)=\"selectTheme($event)\" (onLanguageSelect)=\"selectLanguage($event)\"\r\n (onSave)=\"onSave()\" (onReset)=\"onReset()\">\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Security Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section (onDeleteAllHistory)=\"deleteAllHistory()\" (onLogout)=\"logout()\"\r\n (onLogoutAll)=\"logoutAllDevices()\" (onDeleteAccount)=\"deleteAccount()\"></app-account-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-instruction-section [settings]=\"settings\" [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"></app-instruction-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </div>\r\n</div>","import {\r\n Component,\r\n input,\r\n output,\r\n TrackByFunction,\r\n OnDestroy,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { ChatHeaderComponent } from '../chat-header/chat-header.component';\r\nimport { LoginFormComponent } from '../../../login/login-form.component';\r\nimport { ChatFooterComponent } from '../chat-footer/chat-footer.component';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { ChatSessionDto } from '../../model/chat-session.model';\r\nimport { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';\r\nimport { LoginRequest } from 'projects/doohbot/src/lib/core/auth/models/login-request.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ChatHistorySidebarComponent,\r\n ChatHeaderComponent,\r\n LoginFormComponent,\r\n ChatFooterComponent,\r\n FormsModule,\r\n MatDialogModule,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy {\r\n //inputs\r\n isChatOpen = input(false);\r\n enableDrag = input(false);\r\n enableResize = input(false);\r\n isFullScreen = input(false);\r\n isStreaming = input(true);\r\n messages = input<Message[]>([]);\r\n isBotTyping = input(false);\r\n suggestedMessages = input<string[]>([]);\r\n predefinedMessages = input<string[]>([]);\r\n userName = input('');\r\n trackByMessageId = input<TrackByFunction<Message>>((index, item) => item.id ?? index);\r\n messageError = input<string | null>(null);\r\n showSuggestionChips = input(false);\r\n isHistorySidebarOpen = input(false);\r\n chatSessions = input<ChatSessionDto[]>([]);\r\n chatHistoryUserName = input('User');\r\n\r\n // auth inputs\r\n isLoggingIn = input(false);\r\n authError = input<string | null>(null);\r\n authSuccess = input<string | null>(null);\r\n isLoadingSessions = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMoreSessions = input(false);\r\n processingSessionId = input<string | null>(null);\r\n themeConfig = input<DoohbotThemeConfig | undefined>();\r\n buttonStyle = input('fab');\r\n\r\n //outputs\r\n toggleChat = output<void>();\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n openSettings = output<void>();\r\n suggestionClick = output<string>();\r\n send = output<string>();\r\n clearMessageError = output<void>();\r\n clearChat = output<void>();\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n loadMoreSessions = output<void>();\r\n refreshSessions = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAllSessions = output<void>();\r\n\r\n // auth outputs\r\n loginSubmit = output<LoginRequest>();\r\n logout = output<void>();\r\n //signal\r\n public isAuthenticated = signal(false);\r\n\r\n //services\r\n public themeService = inject(ThemeService);\r\n public authService = inject(AuthService);\r\n\r\n // UI state\r\n public showLoginForm = signal(false);\r\n\r\n public canDrag = computed(() => {\r\n return this.enableDrag() && this.buttonStyle() === 'fab' && !this.isFullScreen();\r\n });\r\n\r\n public canResize = computed(() => {\r\n return this.enableResize() && this.buttonStyle() === 'fab' && !this.isFullScreen();\r\n });\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private destroyRef: DestroyRef,\r\n ) {\r\n // Reaction for auth/login state changes\r\n let isFirstRun = true;\r\n effect(\r\n () => {\r\n const authenticated = this.isAuthenticated();\r\n const loggingIn = this.isLoggingIn();\r\n\r\n if (isFirstRun) {\r\n untracked(() => {\r\n isFirstRun = false;\r\n });\r\n return;\r\n }\r\n\r\n // Handle authentication or logging in status changes\r\n if (authenticated || loggingIn) {\r\n this.showLoginForm.set(false);\r\n } else {\r\n // Only show login if we were trying to log in and failed/stopped (transition to !loggingIn),\r\n // and we are not authenticated.\r\n this.showLoginForm.set(true);\r\n }\r\n },\r\n { allowSignalWrites: true }, //TODO\r\n );\r\n }\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onLoginClick() {\r\n this.showLoginForm.set(true);\r\n }\r\n\r\n onLoginSubmit(param: LoginRequest) {\r\n this.loginSubmit.emit(param);\r\n }\r\n\r\n onCancelLogin() {\r\n this.showLoginForm.set(false);\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onOpenPersonalization() {\r\n this.dialog.open(PersonalizationDialogComponent, {\r\n width: '1100px',\r\n height: '700px',\r\n maxWidth: '95vw',\r\n panelClass: 'personalization-dialog-panel',\r\n });\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearAuthError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n\r\n onLogout() {\r\n this.logout.emit();\r\n }\r\n\r\n onSessionSelected(session: ChatSessionDto) {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onSessionDeleted(sessionId: string) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n\r\n onSessionRenamed(event: { sessionId: string; newTitle: string }) {\r\n this.sessionRenamed.emit(event);\r\n }\r\n\r\n onDeleteAllSessions() {\r\n this.deleteAllSessions.emit();\r\n }\r\n\r\n onPopoutShown(win: Window) {\r\n // Apply theme classes\r\n const activeTheme = this.themeService.activeTheme();\r\n // Logger.info('Popout shown, applying theme:', activeTheme);\r\n\r\n const body = win.document.body;\r\n // We cannot use renderer easily on another document without custom renderer factory,\r\n // but native DOM manipulation is fine here since it's a separate window object.\r\n body.classList.remove('light-theme', 'dark-theme');\r\n body.classList.add(activeTheme);\r\n\r\n // Apply CSS variables\r\n this.themeService.applyCssVariables(body, this.themeConfig());\r\n }\r\n\r\n ngOnInit() {\r\n // Initialization logic if needed\r\n\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n this.isAuthenticated.set(value);\r\n // Logger.info('Is Authenticated:', value);\r\n });\r\n }\r\n\r\n ngOnDestroy() { }\r\n}\r\n","@if (isChatOpen()) {\r\n<div draggableDialog [enableDrag]=\"canDrag()\" resizableDialog [enableResize]=\"canResize()\" class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen()\" [class.layout-sidebar]=\"buttonStyle().includes('sidebar')\">\r\n <!-- chat window header -->\r\n <app-chat-header [isAuthenticated]=\"isAuthenticated()\" [isFullScreen]=\"isFullScreen()\" [settingsMenu]=\"settingsMenu\"\r\n [isNewChatDisabled]=\"messages().length === 0\" (toggleChat)=\"onToggleChat()\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\" (toggleHistorySidebar)=\"onToggleHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"></app-chat-header>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [class.sidebar-closed]=\"(!isHistorySidebarOpen() && !isFullScreen()) || (isFullScreen() && !isAuthenticated())\"\r\n [sessions]=\"chatSessions()\" [isOpen]=\"isHistorySidebarOpen() || (isFullScreen() && isAuthenticated())\"\r\n [userName]=\"chatHistoryUserName()\" [isLoading]=\"isLoadingSessions()\" [hasMoreSessions]=\"hasMoreSessions()\"\r\n [isLoadingMore]=\"isLoadingMoreSessions()\" [isFullScreen]=\"isFullScreen()\"\r\n [processingSessionId]=\"processingSessionId()\" (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\" (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\" (sessionRenamed)=\"onSessionRenamed($event)\" (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onToggleHistorySidebar()\">\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen() && !isFullScreen()\">\r\n <!-- Messages / Welcome Screen -->\r\n @if (!showLoginForm()) {\r\n <app-message-list [messages]=\"messages()\" [isBotTyping]=\"isBotTyping()\" [isStreaming]=\"isStreaming()\"\r\n [predefinedMessages]=\"predefinedMessages()\" [userName]=\"userName()\" [isAuthenticated]=\"isAuthenticated()\"\r\n [isLoggingIn]=\"isLoggingIn()\" [trackByMessageId]=\"trackByMessageId()\"\r\n (suggestionClick)=\"onSuggestionClick($event)\" (loginClick)=\"onLoginClick()\"></app-message-list>\r\n }\r\n\r\n @if (showSuggestionChips() && isAuthenticated()) {\r\n <app-chips [messages]=\"suggestedMessages()\" [disabled]=\"isBotTyping()\"\r\n (chipClick)=\"onSuggestionClick($event)\"></app-chips>\r\n }\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n @if (isAuthenticated()) {\r\n <app-message-input [isBotTyping]=\"isBotTyping()\" (send)=\"onSend($event)\"></app-message-input>\r\n }\r\n\r\n <!-- Login Form -->\r\n @if (showLoginForm() && !isAuthenticated()) {\r\n <app-login-form [isLoggingIn]=\"isLoggingIn()\" (loginSubmit)=\"onLoginSubmit($event)\"\r\n (cancel)=\"onCancelLogin()\"></app-login-form>\r\n }\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <!-- <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar> -->\r\n\r\n <!-- footer -->\r\n <app-chat-footer [showDisclaimer]=\"messages().length > 0\"></app-chat-footer>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Personalization -->\r\n @if (isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onOpenPersonalization()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>settings_suggest</mat-icon>\r\n <span>Personalization</span>\r\n </button>\r\n }\r\n\r\n <!-- Change Theme -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen() ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n @if (isAuthenticated() && messages().length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon> clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onLogout()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n})\r\nexport class FullscreenDirective {\r\n private isFullScreen = false;\r\n private preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n @Input() fullscreenTarget: string = '.chat-window';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n public toggle(): void {\r\n const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);\r\n if (!targetEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: targetEl.style.width,\r\n height: targetEl.style.height,\r\n left: targetEl.style.left,\r\n top: targetEl.style.top,\r\n };\r\n\r\n targetEl.style.width = '';\r\n targetEl.style.height = '';\r\n targetEl.style.left = '';\r\n targetEl.style.top = '';\r\n targetEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n targetEl.style.width = this.preFullscreenState.width;\r\n targetEl.style.height = this.preFullscreenState.height;\r\n targetEl.style.left = this.preFullscreenState.left;\r\n targetEl.style.top = this.preFullscreenState.top;\r\n targetEl.style.transform = ''; // Clear transform to allow CSS transitions/classes\r\n }\r\n }\r\n }\r\n\r\n public getFullscreenState(): boolean {\r\n return this.isFullScreen;\r\n }\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LicenseService {\r\n constructor(\r\n private http: HttpClient,\r\n @Inject(DOOHBOT_CONFIG) private config: DoohbotConfig,\r\n ) { }\r\n\r\n /**\r\n * Loads license file from a public asset URL.\r\n * Library-safe: works only with HTTP-accessible paths.\r\n */\r\n async loadLicenseFile(): Promise<Map<string, string> | undefined> {\r\n const licenseUrl = this.config.licenseFilePath;\r\n\r\n if (!licenseUrl) {\r\n Logger.warn('[LicenseService] No licenseFilePath provided');\r\n return undefined;\r\n }\r\n\r\n try {\r\n const data = await firstValueFrom(this.http.get<Record<string, string>>(licenseUrl));\r\n\r\n if (!data || typeof data !== 'object') {\r\n throw new Error('Invalid license file');\r\n }\r\n\r\n return new Map(Object.entries(data));\r\n } catch (error) {\r\n Logger.error('[LicenseService] Failed to load license file:', licenseUrl, error);\r\n return undefined;\r\n }\r\n }\r\n\r\n // async loadLicenseFile(filePath?: string): Promise<void> {\r\n // try {\r\n // const finalPath = filePath || this.configService.licenseFilePath;\r\n\r\n // const data = await firstValueFrom(this.http.get<any>(finalPath));\r\n // if (!data) {\r\n // throw new Error('Empty license file');\r\n // }\r\n\r\n // this.processFlatMapLicense(data);\r\n\r\n // // // Detection: Hierarchical Format (subjectId/licenses array)\r\n // // if (data.licenses && Array.isArray(data.licenses)) {\r\n // // this.processHierarchicalLicense(data);\r\n // // }\r\n // // // Detection: Flat Map Format (packageId: key)\r\n // // else {\r\n // // this.processFlatMapLicense(data);\r\n // // }\r\n // } catch (error) {\r\n // // Industry pattern: Silent loading for optional registry files\r\n // Logger.info(\r\n // '[LicenseService] No external license file found or failed to load. Falling back to AppConst.',\r\n // );\r\n // this.licenses.set(null);\r\n // }\r\n // }\r\n\r\n // private processFlatMapLicense(data: Record<string, string>): void {\r\n // // Flat-map format: { \"tenantName\": \"license_key\" }\r\n // // Convert each entry to: tenant:tenantName -> { doohbot: license_key }\r\n\r\n // // const subjectMap = new Map<string, LicensePackage>();\r\n // // Object.entries(data).forEach(([tenantName, licenseCode]) => {\r\n // // const tenantKey = `tenant:${tenantName}`;\r\n // // subjectMap.set(tenantKey, {\r\n // // doohbot: licenseCode,\r\n // // });\r\n // // });\r\n\r\n // const licenseKey = data[]\r\n // this.licenses.set();\r\n // // this.registry.set({\r\n // // accountId: 'FLAT_MAP_REGISTRY',\r\n // // subjectLicenses: subjectMap,\r\n // // });\r\n\r\n // Logger.info(`[LicenseService] Flat-map registry loaded with ${subjectMap.size} tenant(s)`);\r\n // }\r\n\r\n // private processHierarchicalLicense(data: LicenseFileContent): void {\r\n // const subjectMap = new Map<string, LicensePackage>();\r\n\r\n // data.licenses.forEach((license) => {\r\n // const key = `${license.subjectType}:${license.subjectId}`;\r\n // subjectMap.set(key, license.packages);\r\n // });\r\n\r\n // this.registry.set({\r\n // accountId: data.accountId,\r\n // subjectLicenses: subjectMap,\r\n // });\r\n\r\n // Logger.info(`[LicenseService] Hierarchical Registry loaded for account: ${data.accountId}`);\r\n // }\r\n\r\n /**\r\n * Resolve the correct license key based on context and requested package\r\n * @param context The current licensing context (tenant, user, roles)\r\n * @param packageId The ID of the package requesting a license\r\n * @returns The resolved license key, or null if unauthorized\r\n */\r\n // resolveLicenseCode(context: LicensingContext, packageId: string): string | null {\r\n // // Hierarchical Registry (Most Specific)\r\n // const keyFromRegistry = this.resolveFromRegistry(context, packageId);\r\n // if (keyFromRegistry) return keyFromRegistry;\r\n\r\n // Logger.warn(\r\n // `[LicenseService] No license found for package: ${packageId} and user: ${context.principalId}`,\r\n // );\r\n // return null;\r\n // }\r\n\r\n // private resolveFromRegistry(context: LicensingContext, packageId: string): string | null {\r\n // const reg = this.registry();\r\n // if (!reg) return null;\r\n\r\n // // Strict Account Check\r\n // if (reg.accountId !== 'EXTERNAL_OVERRIDE' && reg.accountId !== context.tenantId) {\r\n // Logger.error(\r\n // `[LicenseService] Account mismatch! Registry: ${reg.accountId}, Context: ${context.tenantId}`,\r\n // );\r\n // return null;\r\n // }\r\n\r\n // const subjectsToSearch = [\r\n // `user:${context.principalId}`,\r\n // ...(context.roles?.map((r) => `role:${r}`) || []),\r\n // `tenant:${context.tenantId}`,\r\n // 'tenant:default', // Fallback for flat-map external files\r\n // ];\r\n\r\n // for (const subjectKey of subjectsToSearch) {\r\n // const packages = reg.subjectLicenses.get(subjectKey);\r\n // if (packages && packages[packageId]) {\r\n // Logger.debug(`[LicenseService] Resolved key for ${packageId} via Registry (${subjectKey})`);\r\n // return packages[packageId];\r\n // }\r\n // }\r\n // return null;\r\n // }\r\n\r\n /**\r\n * Resolves the license key for the current tenant.\r\n */\r\n // resolveTenantLicenseCode(tenancyName?: string): string | null {\r\n // const activeTenancy = tenancyName || this.configService.tenancyName;\r\n\r\n // if (!activeTenancy) {\r\n // Logger.warn('[LicenseService] No tenancy name found.');\r\n // return null;\r\n // }\r\n\r\n // const reg = this.registry();\r\n // if (!reg) {\r\n // Logger.error('[LicenseService] License registry not loaded.');\r\n // return null;\r\n // }\r\n\r\n // const tenantLicenses = reg.subjectLicenses.get(`tenant:${activeTenancy}`);\r\n // const licenseCode = tenantLicenses?.['doohbot'] || null;\r\n\r\n // if (licenseCode) {\r\n // Logger.info(`[LicenseService] Resolved Doohbot license for: ${activeTenancy}`);\r\n // } else {\r\n // Logger.warn(`[LicenseService] No license key found for tenant: ${activeTenancy}`);\r\n // }\r\n\r\n // return licenseCode;\r\n // }\r\n\r\n /**\r\n * Check if a registry is currently loaded\r\n */\r\n // isRegistryLoaded(): boolean {\r\n // return this.registry() !== null;\r\n // }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Renderer2,\r\n signal,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { doohbotConst } from './const/doohbot-constant';\r\nimport { LoginRequest } from './core/auth/models/login-request.model';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { PredefinedMessages, SuggestedMessages } from './predefined_messages';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { FullscreenDirective } from './core/directives/fullscreen/fullscreen.directive';\r\nimport { ChatHistoryService } from './app/chat/services/chat-history.service';\r\nimport { ChatUIStateService } from './app/chat/chat-ui-state.service';\r\nimport { ChatSessionDto } from './app/chat/model/chat-session.model';\r\nimport { ChatService } from './app/chat/chat.service';\r\nimport { DialogService } from './shared/dialog/dialog.service';\r\nimport { DialogUtils } from './shared/dialog/dialog.utils';\r\nimport { PersonalizationService } from './app/personalization/personalization.service';\r\nimport { LicenseService } from './core/services/license.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { Message } from './core/models/message';\r\nimport { SnackbarUtils } from './shared/snackbar/snackbar.utils';\r\nimport { SnackbarService } from './shared/snackbar/snackbar.service';\r\n\r\n/**\r\n * Doohbot Main Component\r\n * Root component of the Doohbot library\r\n */\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DoohbotComponent implements OnInit, OnDestroy {\r\n /**\r\n * Federated authentication token from the host application.\r\n *\r\n * Used for SSO / federated login. The token must be issued by a\r\n * trusted issuer configured in the Doohbot admin panel.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [federatedAuthToken]=\"authToken\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() federatedAuthToken?: string;\r\n\r\n /**\r\n * Whether the user session should be persisted across browser restarts.\r\n *\r\n * When `true`, Doohbot stores auth state in `localStorage`.\r\n * When `false`, `sessionStorage` is used instead.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [rememberMe]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() rememberMe?: boolean;\r\n\r\n /**\r\n * License file json object.\r\n *\r\n * Required only when the `licenseFilePath` is not passed from `provideDoohbot()`.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseFile]=\"licenseFile\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseFile?: Map<string, string>;\r\n\r\n /**\r\n * License code used to activate licensed features.\r\n *\r\n * Required only when multiple licenses are configured.\r\n * Can change dynamically per tenant, user, or role.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseCode]=\"licenseCode\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseCode?: string;\r\n\r\n // UI State signals\r\n public isChatOpen = signal(false);\r\n public isHistorySidebarOpen = signal(false);\r\n public isFullScreen = signal(false);\r\n // TODO: Refactor 'any' to specific types (e.g., Signal<number> or number) for better type safety.\r\n public unreadCount: any;\r\n\r\n // Chat State signals\r\n public messages = signal<Message[]>([]);\r\n public isBotTyping = signal(false);\r\n // TODO: Use a more descriptive type for streaming state.\r\n public isStreaming: any;\r\n // TODO: Use a typed Error model instead of 'any'.\r\n public messageError: any;\r\n // TODO: Define a boolean or Signal<boolean> type.\r\n public showSuggestionChips: any;\r\n public chatSessions = signal<ChatSessionDto[]>([]);\r\n public hasMoreHistory = signal(false);\r\n public isLoadingMore = signal(false);\r\n public isLoadingSessions = signal(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n // Auth State signals\r\n public isAuthenticated = signal<boolean>(false);\r\n public isLoggingIn = signal(false);\r\n public authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n\r\n private destroyIsAuthenticated$ = new Subject<void>();\r\n\r\n // Personalization\r\n // TODO: Avoid 'any' for styles. Use a typed object or CSS record.\r\n public activeButtonStyle: any;\r\n\r\n // Configuration exposure for template\r\n public get enableDrag(): boolean {\r\n return this.configService?.theme()?.enableDrag ?? false;\r\n }\r\n\r\n public get enableResize(): boolean {\r\n return this.configService?.theme()?.enableResize ?? false;\r\n }\r\n\r\n public userName = signal<string>('User');\r\n public predefinedMessages = signal<string[]>(PredefinedMessages);\r\n public suggestedMessages = signal<string[]>(SuggestedMessages);\r\n public maxMessageLength = signal<number>(1000);\r\n\r\n // Constants\r\n readonly doohbotConst = doohbotConst;\r\n\r\n // Context cleanup\r\n // TODO: Consider moving context management into a dedicated ContextService to decouple it from the UI component.\r\n private contextCleanup?: () => void;\r\n\r\n // ========================= Component refs ======================\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n @ViewChild(FullscreenDirective) fullscreenDirective!: FullscreenDirective;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n private dialogService: DialogService,\r\n private snackbarService: SnackbarService,\r\n private chatHistory: ChatHistoryService,\r\n private uiState: ChatUIStateService,\r\n private themeService: ThemeService,\r\n private authService: AuthService,\r\n private chatService: ChatService,\r\n private personalizationService: PersonalizationService,\r\n private licenseService: LicenseService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n // Theme management effect\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n\r\n // Apply theme configuration from global config\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n // Apply palette class to host for robust variable inheritance (only to library for global styles)\r\n const paletteClasses = ['db-theme-doohbot', 'db-theme-aqua', 'db-theme-candy', 'db-theme-forest', 'db-theme-midnight', 'db-theme-sunset', 'db-theme-slate'];\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(host, cls));\r\n const palette = themeConfig.palette || 'doohbot';\r\n this.renderer.addClass(host, `db-theme-${palette}`);\r\n }\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n Logger.info('Initializing DoohbotComponent');\r\n\r\n this.initVariableState();\r\n\r\n // Button style is now handled directly via configService.theme()\r\n\r\n // License\r\n if (!this.licenseFile) {\r\n // Resolve using licenseFilePath\r\n this.licenseFile = await this.licenseService.loadLicenseFile();\r\n }\r\n if (this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n Logger.info('licenseFile changed', this.licenseFile);\r\n }\r\n\r\n // Apply theme from global configuration early to register root element\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n this.themeService.setThemeConfig(themeConfig, this.elementRef.nativeElement);\r\n }\r\n\r\n // Init federated auth\r\n this.authService.initFederatedAuthFlow();\r\n this.authService.initNormalLoginAuthState();\r\n\r\n // Auth state\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntil(this.destroyIsAuthenticated$))\r\n .subscribe((value) => {\r\n this.isAuthenticated.set(value);\r\n if (value) {\r\n this.initializeUI();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['licenseFile'] && this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n Logger.info('licenseFile changed', this.licenseFile);\r\n }\r\n\r\n if (changes['licenseCode'] && this.licenseCode) {\r\n this.authService.setLicenseCode(this.licenseCode);\r\n Logger.info('licenseCode changed', this.licenseCode);\r\n }\r\n\r\n if (changes['federatedAuthToken'] && this.federatedAuthToken) {\r\n this.authService.setFederatedAuthToken(this.federatedAuthToken);\r\n Logger.info('federatedAuthToken changed', this.federatedAuthToken);\r\n }\r\n\r\n if (changes['rememberMe'] && this.rememberMe) {\r\n this.authService.setRememberMe(this.rememberMe);\r\n Logger.info('rememberMe changed', this.rememberMe);\r\n }\r\n }\r\n\r\n initVariableState() {\r\n // UI State signals\r\n this.isChatOpen = this.uiState.isChatOpen;\r\n this.isHistorySidebarOpen = this.uiState.isHistorySidebarOpen;\r\n this.isFullScreen = this.uiState.isFullScreen;\r\n this.unreadCount = this.uiState.unreadCount;\r\n\r\n // Chat State signals\r\n this.messages = this.chatService.messages;\r\n this.isBotTyping = this.chatService.isBotTyping;\r\n this.isStreaming = this.chatService.isStreaming;\r\n this.messageError = computed(() => this.chatService.apiError()?.message || null);\r\n this.showSuggestionChips = this.chatService.showSuggestionChips;\r\n this.chatSessions = this.chatHistory.sessions;\r\n this.hasMoreHistory = this.chatHistory.hasMore;\r\n this.isLoadingMore = this.chatHistory.isLoadingMore;\r\n this.isLoadingSessions = this.chatHistory.isLoading;\r\n this.processingSessionId = this.chatHistory.processingSessionId;\r\n\r\n // Auth State signals\r\n // this.isAuthenticated = this.chatFacade.isAuthenticated;\r\n // TODO\r\n this.isLoggingIn = this.authService.isLoggingIn;\r\n this.authError = this.authService.authError;\r\n this.authSuccess = this.authService.authSuccess;\r\n // TODO\r\n // Personalization\r\n this.activeButtonStyle = computed(() => this.configService.theme()?.buttonStyle || 'fab');\r\n\r\n // Setup messages signal ref for UI state service\r\n this.uiState.setMessagesSignal(this.chatService.messages);\r\n }\r\n\r\n private initializeUI() {\r\n // TODO\r\n // Apply theme from global configuration\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n this.themeService.setThemeConfig(themeConfig, this.elementRef.nativeElement);\r\n }\r\n\r\n // Set user metadata\r\n this.userAvatarUrl();\r\n this.updateUserName();\r\n\r\n // Start new session\r\n this.chatService.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n if (!this.contextCleanup) {\r\n // TODO\r\n this.uiState.resetLastRead();\r\n }\r\n }\r\n\r\n //! ====================== AUTHENTICATION ==================\r\n onLogin(param: LoginRequest): void {\r\n this.authService.login(param);\r\n }\r\n\r\n performLogout() {\r\n this.dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to logout?',\r\n icon: 'logout',\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.authService.logout();\r\n });\r\n }\r\n\r\n //! ====================== CHAT OPERATIONS =====================\r\n\r\n toggleChat(): void {\r\n this.uiState.toggleChat();\r\n }\r\n\r\n async sendMessage(text: string): Promise<void> {\r\n await this.chatService.sendMessage(text, this.maxMessageLength());\r\n // Invalidate cache after sending message\r\n // TODO\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n clearChat(): void {\r\n const userId = this.authService.getUserId() || '';\r\n this.chatService.clearMessages();\r\n }\r\n\r\n clearMessageError(): void {\r\n // TODO\r\n this.chatService.apiError.set(null);\r\n }\r\n\r\n //! ===================== SESSION MANAGEMENT =======================\r\n\r\n toggleHistorySidebar(): void {\r\n const isNowOpen = !this.uiState.isHistorySidebarOpen();\r\n if (isNowOpen) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n }\r\n this.uiState.toggleHistorySidebar();\r\n }\r\n\r\n loadChatSession(session: ChatSessionDto): void {\r\n if (!session.response_id) {\r\n return;\r\n }\r\n Logger.info(`Session selected: ${session.response_id}. continuing session...`);\r\n this.chatService.continueSession(session.response_id);\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n async deleteSession(sessionId: string): Promise<void> {\r\n Logger.info(`Deleting session: ${sessionId}`);\r\n const userId = this.authService.getUserId() || '';\r\n\r\n await this.chatHistory.deleteSession(sessionId, userId.toString());\r\n // Invalidate cache after deletion\r\n this.chatHistory.invalidateCache();\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === sessionId) {\r\n Logger.info('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n\r\n // this.chatHistory.deleteSession(sessionId, userId.toString()).subscribe(() => {\r\n // // Invalidate cache after deletion\r\n // this.chatHistory.invalidateCache();\r\n\r\n // // If deleted session is currently active, start a new one\r\n // const activeSession = this.chatService.getActiveSession();\r\n // if (activeSession?.id === sessionId) {\r\n // Logger.info('Active session was deleted, starting a new one.');\r\n // this.chatService.startNewSession();\r\n // }\r\n // });\r\n }\r\n\r\n async deleteAllSessions(): Promise<void> {\r\n Logger.info('Deleting all chat sessions');\r\n const userId = this.authService.getUserId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n this.chatService.clearMessages();\r\n\r\n // this.chatHistory.deleteAllHistory(userId.toString()).subscribe({\r\n // next: () => {\r\n // this.chatService.clearMessages();\r\n // },\r\n // });\r\n }\r\n\r\n async renameSession(event: { sessionId: string; newTitle: string }): Promise<void> {\r\n Logger.info(`Renaming session ${event.sessionId} to ${event.newTitle}`);\r\n const userId = this.authService.getUserId() || '';\r\n const result = await this.chatHistory.updateSessionTitle(\r\n event.sessionId,\r\n event.newTitle,\r\n userId.toString(),\r\n );\r\n if (result) {\r\n // If updated session is currently active, update its title in ChatService\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === event.sessionId) {\r\n activeSession.title = event.newTitle;\r\n }\r\n }\r\n }\r\n\r\n private async loadUserSessions(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Initiating loadUserSessions for user: ${userId}`);\r\n // TODO\r\n await this.chatHistory.loadSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreHistory(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Loading more sessions for user: ${userId}`);\r\n // TODO\r\n await this.chatHistory.loadMoreSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Manually refresh history\r\n */\r\n async refreshHistory(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Refreshing sessions for user: ${userId}`);\r\n this.chatHistory.invalidateCache();\r\n // TODO\r\n await this.chatHistory.loadSessions(userId, true); // force refresh\r\n }\r\n\r\n //! ======================== FULLSCREEN =====================\r\n\r\n toggleFullScreen(): void {\r\n if (this.fullscreenDirective) {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.getFullscreenState();\r\n this.uiState.setFullscreen(isFullscreen);\r\n\r\n if (isFullscreen) {\r\n this.refreshHistory();\r\n }\r\n }\r\n }\r\n\r\n //! ================== UTILITY METHODS =======================\r\n\r\n // TODO: Using id || index for trackBy is a good start, but ensure 'item' is properly typed to avoid runtime 'any' issues.\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n /**\r\n * Resolve and update the username from all available sources\r\n */\r\n public updateUserName() {\r\n if (!this.isAuthenticated()) {\r\n this.userName.set('');\r\n return;\r\n }\r\n this.userName.set(this.authService.loggedInUserName());\r\n // Logger.info('User name updated:', this.userName());\r\n\r\n // const loggedInName = this.authService.getLoggedInUserName();\r\n // const contextName = this.userContext?.userName;\r\n // const configName = this.configService?.config.authToken ? 'User' : ''; // simplified username logic\r\n\r\n // if (configName) {\r\n // this.userName = configName;\r\n // } else if (loggedInName) {\r\n // this.userName = loggedInName;\r\n // } else {\r\n // this.userName.set('User');\r\n // }\r\n\r\n Logger.info('Resolved userName:', this.userName);\r\n }\r\n\r\n userAvatarUrl(): string {\r\n return doohbotConst.userAvatar;\r\n }\r\n\r\n ngOnDestroy() {\r\n Logger.info('🎯 DOOHBOT COMPONENT DESTROYED');\r\n this.destroyIsAuthenticated$.next();\r\n this.destroyIsAuthenticated$.complete();\r\n\r\n // Clean up subscriptions\r\n if (this.contextCleanup) {\r\n this.contextCleanup();\r\n }\r\n }\r\n}\r\n","<app-chat-button [buttonStyle]=\"activeButtonStyle()\" [isChatOpen]=\"isChatOpen()\" [unreadCount]=\"unreadCount()\"\r\n (toggle)=\"toggleChat()\">\r\n</app-chat-button>\r\n\r\n@if (isChatOpen()) {\r\n<app-chat-window appFullscreen [isChatOpen]=\"isChatOpen()\" [enableDrag]=\"enableDrag\" [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\" [messages]=\"messages()\" [isBotTyping]=\"isBotTyping()\" [isStreaming]=\"isStreaming()\"\r\n [predefinedMessages]=\"predefinedMessages()\" [suggestedMessages]=\"suggestedMessages()\" [userName]=\"userName()\"\r\n [trackByMessageId]=\"trackByMessageId\" [messageError]=\"messageError()\" [showSuggestionChips]=\"showSuggestionChips()\"\r\n [buttonStyle]=\"activeButtonStyle()\" [isHistorySidebarOpen]=\"isHistorySidebarOpen()\" [chatSessions]=\"chatSessions()\"\r\n [isLoadingSessions]=\"isLoadingSessions()\" [processingSessionId]=\"processingSessionId()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\" [isLoadingMoreSessions]=\"isLoadingMore()\" [chatHistoryUserName]=\"userName()\"\r\n [isLoggingIn]=\"isLoggingIn()\" [authError]=\"authError()\" [authSuccess]=\"authSuccess()\" (toggleChat)=\"toggleChat()\"\r\n (loginSubmit)=\"onLogin($event)\" (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\" (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\" (sessionRenamed)=\"renameSession($event)\"\r\n (loadMoreSessions)=\"loadMoreHistory()\" (refreshSessions)=\"refreshHistory()\" (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\" (clearMessageError)=\"clearMessageError()\" (clearChat)=\"clearChat()\"\r\n (deleteAllSessions)=\"deleteAllSessions()\" (logout)=\"performLogout()\"></app-chat-window>\r\n}\r\n\r\n<!-- Skeleton Loader while auth is unknown or refreshing -->\r\n<!-- @if (isChatOpen() && (authStatus() === 'expired')) {\r\n<div class=\"auth-loading-skeleton\">\r\n <div class=\"skeleton-header\"></div>\r\n <div class=\"skeleton-messages\"></div>\r\n <div class=\"skeleton-input\"></div>\r\n</div>\r\n} -->","import { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\n\r\n/**\r\n * Merges user-provided config overrides with defaults.\r\n *\r\n * @param overrides - Partial config to override defaults\r\n * @returns Fully resolved DoohbotConfig object\r\n */\r\nexport function resolveDoohbotConfig(overrides?: Partial<DoohbotConfig>): DoohbotConfig {\r\n return {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...overrides,\r\n };\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, switchMap } from 'rxjs/operators';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(private authService: AuthService) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authReq = this.addAuthHeader(req);\r\n\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !this.authService.isAuthUrl(authReq.url)\r\n ) {\r\n Logger.error('[AuthInterceptor] 401 detected, attempting refresh');\r\n\r\n // Refresh if expired/unauthenticated during http request\r\n return this.authService.refreshLogin().pipe(\r\n switchMap((result) => {\r\n if (!result?.access_token) {\r\n Logger.error('[AuthInterceptor] Refresh failed, clearing auth');\r\n this.authService.clear();\r\n return throwError(() => error);\r\n }\r\n\r\n Logger.info('[AuthInterceptor] Token refreshed, retrying request');\r\n return next.handle(this.addAuthHeader(req));\r\n }),\r\n catchError((refreshErr) => {\r\n Logger.error('[AuthInterceptor] Refresh error', refreshErr);\r\n this.authService.clear();\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private addAuthHeader(req: HttpRequest<any>): HttpRequest<any> {\r\n if (this.authService.isAuthUrl(req.url)) return req;\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) return req;\r\n\r\n return req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n }\r\n}\r\n","import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';\r\nimport { DOOHBOT_CONFIG, DoohbotConfig } from '../public-api';\r\nimport { resolveDoohbotConfig } from './core/config/doohbot-config.resolver';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\n\r\n/**\r\n * Provides all necessary Doohbot dependencies for standalone Angular applications.\r\n *\r\n * This provider:\r\n * - Registers the Doohbot configuration via dependency injection\r\n * - Registers HTTP interceptors required for authentication and licensing\r\n * - Does NOT provide `HttpClientModule` — the host application must provide it\r\n *\r\n * Use this when you want Doohbot to manage authentication, licensing,\r\n * and API integration automatically.\r\n *\r\n * @param config Partial configuration. Missing values are resolved using library defaults.\r\n * @returns EnvironmentProviders for use with `bootstrapApplication`\r\n *\r\n * @example\r\n * ```ts\r\n * // main.ts\r\n * import { bootstrapApplication } from '@angular/platform-browser';\r\n * import { importProvidersFrom } from '@angular/core';\r\n * import { HttpClientModule } from '@angular/common/http';\r\n * import { AppComponent } from './app/app.component';\r\n * import { provideDoohbot } from 'doohbot';\r\n *\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * importProvidersFrom(HttpClientModule),\r\n * provideDoohbot({\r\n * environment: 'production',\r\n * licenseFilePath: 'assets/doohbot_license.json',\r\n * // Optional api configuration if want to use your own api\r\n * api: {\r\n * apiBaseUrl: 'https://api.doohbot.com/',\r\n * apiKey: 'your-api-key',\r\n * },\r\n * // Optional theme configuration if want to match doohbot to your application theme\r\n * theme: {\r\n * buttonStyle: 'fab',\r\n * primaryColor: '#4f46e5',\r\n * backgroundColor: '#ffffff',\r\n * textColor: '#111827',\r\n * fontFamily: 'Inter, Roboto, sans-serif',\r\n * enableDrag: true,\r\n * enableResize: true\r\n * }\r\n * }),\r\n * ],\r\n * }).catch(console.error);\r\n * ```\r\n */\r\nexport function provideDoohbot(config: Partial<DoohbotConfig> = {}) {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: DOOHBOT_CONFIG,\r\n useValue: resolveDoohbotConfig(config),\r\n },\r\n DoohbotConfigService,\r\n\r\n // Init logger\r\n Logger,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [Logger],\r\n useFactory: (logger: Logger) => () => {\r\n Logger.init(logger);\r\n },\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ]);\r\n}\r\n","/**\r\n * public-api.ts\r\n * Main public API surface of the Doohbot library.\r\n * Exports all necessary modules, components, services, and models.\r\n * Consumers should only import from this file.\r\n */\r\n\r\n// Components\r\nexport { DoohbotComponent } from './lib/doohbot.component';\r\nexport { DoohbotConfigService } from './lib/core/config/doohbot-config.service';\r\nexport { Logger } from './lib/core/utils/logger.service';\r\n\r\n// Providers\r\nexport { provideDoohbot } from './lib/doohbot.providers';\r\n\r\n// Configuration\r\nexport type { DoohbotConfig } from './lib/core/config/doohbot-config.model';\r\nexport type { DoohbotApiConfig } from './lib/core/models/api-config.model';\r\nexport type { DoohbotThemeConfig } from './lib/core/models/theme-config.model';\r\nexport { DOOHBOT_CONFIG } from './lib/core/config/doohbot-config.token';\r\nexport { resolveDoohbotConfig } from './lib/core/config/doohbot-config.resolver';\r\nexport { doohbotConst } from './lib/const/doohbot-constant';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.MarkdownService","i2","i3","i1.DialogService","i1.DoohbotConfigService","i2.DoohbotConfigService","i1.HttpService","i2.StorageService","i3.DoohbotConfigService","i2.PersonalizationService","i1.StorageService","i2.HttpStreamService","i4","i2.DialogService","i3.SnackbarService","i2.SnackbarService","i3.ChatHistoryService","i4.ChatUIStateService","i5.ThemeService","i6.AuthService","i7.ChatService","i8.PersonalizationService","i9.LicenseService","i10.DoohbotConfigService","catchError","switchMap","i1.AuthService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,MAAM,YAAY,GAAG;;;;;;;;;;;;;;AAkB1B,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,WAAW,EAAE,oBAAoB;AACjC,IAAA,kBAAkB,EAChB,8JAA8J;AAChK,IAAA,QAAQ,EAAE,mBAAmB;;;AAM7B,IAAA,OAAO,EACL,4tEAA4tE;AAC9tE,IAAA,WAAW,EACT,o5KAAo5K;AACt5K,IAAA,aAAa,EACX,g+OAAg+O;AACl+O,IAAA,UAAU,EACR,43GAA43G;AAC93G,IAAA,SAAS,EACP,43IAA43I;;;ACrCz3I,MAAM,kBAAkB,GAAG;IAChC,mDAAmD;;;;;IAKnD,2BAA2B;CAC5B;AACM,MAAM,iBAAiB,GAAG;IAC/B,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;CACvB;;MCDY,mBAAmB,CAAA;AAPhC,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAuD,KAAK,uDAAC;AAChF,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,CAAC,uDAAC;;QAG9B,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;QAGd,IAAA,CAAA,YAAY,GAAG,YAAY;AAEpC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YACxB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;AACjD,QAAA,CAAC,qDAAC;AAEF,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAkC;AAC3D,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAAE,gBAAA,OAAO,QAAQ;AACtC,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;AAAE,gBAAA,OAAO,QAAQ;AACrD,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgC;AACxE,QAAA,CAAC,2DAAC;AAKH,IAAA;IAHC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;+GAxBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZhC,k9BA0BC,EAAA,MAAA,EAAA,CAAA,sjDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlBW,YAAY,4HAAE,aAAa,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI1B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,k9BAAA,EAAA,MAAA,EAAA,CAAA,sjDAAA,CAAA,EAAA;;;MEE3B,KAAK,CAAA;AAPlB,IAAA,WAAA,GAAA;AAQW,QAAA,IAAA,CAAA,QAAQ,GAAa,EAAE,CAAC;QACxB,IAAA,CAAA,QAAQ,GAAG,KAAK;AACf,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAU,CAAC;AAMlD,IAAA;AAJC,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;+GARW,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVlB,kPASA,EAAA,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,YAAY,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,KAAK,EAAA,UAAA,EAAA,CAAA;kBAPjB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,kPAAA,EAAA,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA;;sBAKtB;;sBACA;;sBACA;;;AEbI,MAAM,QAAQ,GAAG;AACtB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,QAAQ,EAAE,kBAAkB;CAC7B;;MCNY,UAAU,CAAA;AAOnB,IAAA,WAAA,CAAoB,SAAiC,EAAE,EAAA;QAAnC,IAAA,CAAA,MAAM,GAAN,MAAM;AANlB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,kDAAC;QACnB,IAAA,CAAA,KAAK,GAAG,EAAE;AACV,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;QACtB,IAAA,CAAA,KAAK,GAAkB,IAAI;QAC3B,IAAA,CAAA,QAAQ,GAAG,CAAC;AA4CpB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,MAAM;IA1CqC;AAE3D,IAAA,MAAM,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;IACpC;IAEQ,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE;AAE7C,QAAA,MAAM,IAAI,GAAG,CAAC,IAAY,KAAI;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AAExC,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;YAEhD,IAAI,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACrC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;gBAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;YACxB;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;gBACjB;YACJ;AAEA,YAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAC5C,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC;IAC5C;IAEA,aAAa,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACxB;IAIA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACrB;AACH;;MCtDY,eAAe,CAAA;AAS1B,IAAA,WAAA,CAAoB,SAAuB,EAAA;QAAvB,IAAA,CAAA,SAAS,GAAT,SAAS;QARrB,IAAA,CAAA,EAAE,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;IAE4C;AAE9C,IAAA,OAAO,CAAC,QAAgB,EAAA;QACtB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrC,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;QACrD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;YAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAC3C,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CACrD;QACH;IACF;+GA1BW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCUY,oBAAoB,CAAA;AAwB7B,IAAA,WAAA,CAAoB,eAAgC,EAAA;QAAhC,IAAA,CAAA,eAAe,GAAf,eAAe;AAvBnC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAW;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAO;QACpC,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;QAEvB,IAAA,CAAA,WAAW,GAAG,MAAM,EAAW;AAEvB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAA,CAAA,UAAU,GAAG,CAAC;AAEtB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AAEnC,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACxB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAE1B,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;AAAE,gBAAA,OAAO,EAAE;YAEpC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,EAAE;AAChC,gBAAA,OAAO,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACjE;AAEA,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;AACxE,QAAA,CAAC,uDAAC;QAGE,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;YAE1B,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS;gBAAE;AAE7C,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;YAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC;AAEA,YAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACf,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM;;YAEjC;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,MAAM,GAAA;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACzC;+GA/CS,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBjC,urFA4DM,EAAA,MAAA,EAAA,CAAA,iqHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhDQ,YAAY,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI5B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,urFAAA,EAAA,MAAA,EAAA,CAAA,iqHAAA,CAAA,EAAA;;;MEgB7B,oBAAoB,CAAA;AAyB/B,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;;AAvBvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAY,EAAE,oDAAC;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;AAC1B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,IAAI,uDAAC;AACzB,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAW,EAAE,8DAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AACpB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;AAC9B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;AAC1B,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAA2B,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,4DAAC;;QAGrF,IAAA,CAAA,eAAe,GAAG,MAAM,EAAU;QAClC,IAAA,CAAA,UAAU,GAAG,MAAM,EAAQ;;QAM3B,IAAA,CAAA,QAAQ,GAAG,QAAQ;QACV,IAAA,CAAA,YAAY,GAAG,YAAY;QAEpC,IAAA,CAAA,YAAY,GAAY,IAAI;AACX,QAAA,IAAA,CAAA,gBAAgB,GAAG,EAAE,CAAC;IAEO;IAE9C,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AAEjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAK;;;;AAIhD,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;AACtE,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,aAAa,EAAE,IAAI;AACpB,SAAA,CAAC;;;IAIJ;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;;;QAIxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB;AAExF,QAAA,MAAM,QAAQ,GACZ,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;AAC/D,YAAA,SAAS;AAEX,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;IAC9B;IAEA,cAAc,CAAC,WAA2B,QAAQ,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;QAC1D,SAAS,CAAC,QAAQ,CAAC;YACjB,GAAG,EAAE,SAAS,CAAC,YAAY;AAC3B,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;;AAEF,QAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;AAEA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,WAAW,CAAC,OAAgB,EAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE;AAEnB,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAK;;;AAIpD,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAExB,UAAU,CAAC,MAAK;AACd,gBAAA,OAAO,CAAC,MAAM,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;QACpC;IACF;+GAxGW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BjC,69EAkEM,EAAA,MAAA,EAAA,CAAA,4qHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1CM,YAAY,4JAAE,KAAK,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIvD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAAA,69EAAA,EAAA,MAAA,EAAA,CAAA,4qHAAA,CAAA,EAAA;;sBAmBlE,SAAS;uBAAC,cAAc;;;ME/Bd,qBAAqB,CAAA;AAPlC,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;;QAG1B,IAAA,CAAA,IAAI,GAAG,MAAM,EAAU;;QAGd,IAAA,CAAA,YAAY,GAAG,YAAY;AAQrC,IAAA;AALC,IAAA,MAAM,CAAC,IAAY,EAAA;AACjB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB;IACF;+GAfW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZlC,glBAcM,EAAA,MAAA,EAAA,CAAA,+3BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNM,YAAY,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI1B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,glBAAA,EAAA,MAAA,EAAA,CAAA,+3BAAA,CAAA,EAAA;;;MEc3B,eAAe,CAAA;IAC1B,WAAA,CACS,SAAwC,EACf,IAAgB,EAAA;QADzC,IAAA,CAAA,SAAS,GAAT,SAAS;QACgB,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAGpC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS;IAC9C;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;IAC7B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B;AAlBW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,gDAGhB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAHd,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB5B,y+BA6BA,EAAA,MAAA,EAAA,CAAA,qoDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXY,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI5D,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,y+BAAA,EAAA,MAAA,EAAA,CAAA,qoDAAA,CAAA,EAAA;;0BAOrE,MAAM;2BAAC,eAAe;;;MEFd,oBAAoB,CAAA;IAG7B,WAAA,CACW,SAA6C,EACpB,IAAqB,EAAA;QAD9C,IAAA,CAAA,SAAS,GAAT,SAAS;QACgB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAEpC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY;;AAE9B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,gBAAgB;AACjE,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,SAAS;IAC5E;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9B;IAEA,SAAS,GAAA;QACL,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C;IACJ;AAvBS,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,gDAKjB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGALlB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBjC,++BAiBM,EAAA,MAAA,EAAA,CAAA,8gCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEQ,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI5D,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACI,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,++BAAA,EAAA,MAAA,EAAA,CAAA,8gCAAA,CAAA,EAAA;;0BASjE,MAAM;2BAAC,eAAe;;;MEnBlB,aAAa,CAAA;AACxB,IAAA,WAAA,CAAoB,MAAiB,EAAA;QAAjB,IAAA,CAAA,MAAM,GAAN,MAAM;IAAe;AAEzC;;;;AAIG;AACH,IAAA,IAAI,CAAC,IAAgB,EAAA;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;AAClD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC;AAEF,QAAA,OAAO,SAAS,CAAC,WAAW,EAAE;IAChC;AAEA;;;;AAIG;IACH,aAAa,CAAC,WAAmB,WAAW,EAAA;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC;AACf,YAAA,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,CAAA,gCAAA,EAAmC,QAAQ,CAAA,+BAAA,CAAiC;AACrF,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,gBAAgB;AACvB,SAAA,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,IAAqB,EAAA;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;AACvD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC;AAEF,QAAA,OAAO,SAAS,CAAC,WAAW,EAAE;IAChC;+GAnDW,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCeY,2BAA2B,CAAA;AA2BtC,IAAA,WAAA,CAAoB,aAA4B,EAAA;QAA5B,IAAA,CAAA,aAAa,GAAb,aAAa;;AAzBjC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAmB,EAAE,oDAAC;AACtC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,kDAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,MAAM,oDAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,qDAAC;AACxB,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;AAC9B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,KAAK,yDAAC;AAC5B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAgB,IAAI,+DAAC;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;;QAG3B,IAAA,CAAA,eAAe,GAAG,MAAM,EAAkB;QAC1C,IAAA,CAAA,cAAc,GAAG,MAAM,EAAU;QACjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAQ;QACzB,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;QACxB,IAAA,CAAA,cAAc,GAAG,MAAM,EAA2C;QAClE,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;;AAG1B,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;;AAE1B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE;AACpC,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AACzC,QAAA,CAAC,uDAAC;IAEkD;;AAI5C,IAAA,aAAa,CAAC,QAA0B,EAAA;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,MAAM,GAAuB;AACjC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;SACjC;;;AAID,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC;AACpE,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA0B;AAC3D,QAAA,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAY,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;;AAG7D,QAAA,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CACxF;AAED,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YACjC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YACrD,MAAM,eAAe,GAAG,IAAI,IAAI,CAC9B,WAAW,CAAC,WAAW,EAAE,EACzB,WAAW,CAAC,QAAQ,EAAE,EACtB,WAAW,CAAC,OAAO,EAAE,CACtB;YAED,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE;gBACjD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,SAAS,CAAC,OAAO,EAAE,EAAE;gBAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;gBACzD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO;gBACL,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD;AAEA,IAAA,cAAc,CAAC,OAAuB,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;IAGA,WAAW,CAAC,KAAY,EAAE,OAAuB,EAAA;QAC/C,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC;AACF,aAAA,SAAS,CAAC;AACT,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,OAAO,EAAE,0CAA0C;YACnD,YAAY,EAAE,OAAO,CAAC,KAAK;AAC3B,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,WAAW,EAAE,QAAQ;SACtB;AACA,aAAA,SAAS,CAAC,CAAC,QAAQ,KAAI;YACtB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE;gBACpG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACzF;AACF,QAAA,CAAC,CAAC;IACN;IAEA,aAAa,CAAC,KAAY,EAAE,SAAiB,EAAA;AAC3C,QAAA,IAAI,CAAC,SAAS;YAAE;QAChB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,KAAI;YAC5E,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;;YAErC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACf,SAAA,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;;AAGzC,QAAA,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;QAC5D,IAAI,YAAY,GAAG,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAC9F,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB;IACF;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CAAC;AACJ,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EAAE,iFAAiF;AAC1F,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,cAAc;SACrB;AACA,aAAA,SAAS,CAAC,CAAC,SAA8B,KAAI;YAC5C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YACvB;AACF,QAAA,CAAC,CAAC;IACN;+GA9KW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAI,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBxC,kiGAiFM,EAAA,MAAA,EAAA,CAAA,82JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9DM,YAAY,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI1B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,kiGAAA,EAAA,MAAA,EAAA,CAAA,82JAAA,CAAA,EAAA;;;AEjBxC;;;AAGG;MACU,aAAa,CAAA;aACP,IAAA,CAAA,OAAO,GAA2B,IAAI,CAAC;AAEtD;;;AAGG;IACH,OAAO,IAAI,CAAC,OAAwB,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;IAC1B;AAEA;;;AAGG;IACH,OAAO,OAAO,CAAC,OAAe,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IAClC;AAEA;;;AAGG;IACH,OAAO,KAAK,CAAC,OAAe,EAAA;AACxB,QAAA,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IAChC;AAEA;;;AAGG;IACH,OAAO,IAAI,CAAC,OAAe,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IAC/B;AAEA;;;AAGG;IACH,OAAO,IAAI,CAAC,OAAe,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IAC/B;;;AC7CJ;;;AAGG;AACI,MAAM,sBAAsB,GAAkB;;AAEnD,IAAA,WAAW,EAAE,aAAa;;AAG1B,IAAA,eAAe,EAAE,6BAA6B;;AAG9C,IAAA,aAAa,EAAE,SAAS;;IAGxB,mBAAmB,EAAE,KAAK;;AAG1B,IAAA,GAAG,EAAE;AACH,QAAA,OAAO,EAAE,6BAA6B;AACtC,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,UAAU,EAAE,IAAI;AACjB,KAAA;;AAGD,IAAA,KAAK,EAAE;AACL,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,UAAU,EAAE,2BAA2B;AACvC,QAAA,OAAO,EAAE,SAAS;AACnB,KAAA;CACF;;ACjCD;;;AAGG;MACU,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB;;ACEhF;;;;AAIG;MAIU,oBAAoB,CAAA;AAoD/B,IAAA,WAAA,CAGE,iBAAyC,EAAE,EAAA;AA9C7C;;;;;;;;;;AAUG;QACM,IAAA,CAAA,WAAW,GAAG,MAAoC,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW;AAE1F;;;AAGG;AACM,QAAA,IAAA,CAAA,eAAe,GAAG,MAAc,IAAI,CAAC,YAAY,EAAE,CAAC,eAAe,IAAI,EAAE;AAElF;;;AAGG;AACM,QAAA,IAAA,CAAA,aAAa,GAAG,MAAc,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,IAAI,EAAE;AAE9E;;;AAGG;AACM,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAe,IAAI,CAAC,YAAY,EAAE,CAAC,mBAAmB,IAAI,KAAK;AAE9F;;;AAGG;QACM,IAAA,CAAA,GAAG,GAAG,MAAoC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG;AAE1E;;;AAGG;QACM,IAAA,CAAA,KAAK,GAAG,MAAsC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK;;AAQ9E,QAAA,MAAM,YAAY,GAAkB;AAClC,YAAA,GAAG,sBAAsB;AACzB,YAAA,GAAG,cAAc;SAClB;AAED,QAAA,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;;AAGjC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,wDAAC;QACxC,IAAI,CAAC,aAAa,GAAG,IAAI,eAAe,CAAgB,YAAY,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAClD;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,KAA6B,EAAA;AAClC,QAAA,IAAI,aAAa,IAAI,KAAK,EAAE;;AAE1B,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;QAC7D;AAEA,QAAA,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,KAAK,EAAE;AACtD,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AAE9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;AAEQ,IAAA,cAAc,CAAC,MAAqB,EAAA;;AAE1C,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QAC5C;;QAGA,IACE,MAAM,CAAC,eAAe;AACtB,YAAA,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,EAC1C;AACA,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;QACrD;;AAGA,QAAA,IAAI,MAAM,CAAC,GAAG,EAAE;AACd,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG;AAEtB,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;YACxE;AAEA,YAAA,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE;AAC5D,gBAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;YACnD;AAEA,YAAA,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;AACtD,gBAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;YAChD;QACF;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;IAC/B;AA1HW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBAsDrB,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAtDb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAsDI;;0BACA,MAAM;2BAAC,cAAc;;;MCnEb,MAAM,CAAA;aACF,IAAA,CAAA,QAAQ,GAAkB,IAAlB,CAAuB;;AAW9C,IAAA,WAAA,CAAoB,aAAmC,EAAA;QAAnC,IAAA,CAAA,aAAa,GAAb,aAAa;QATzB,IAAA,CAAA,MAAM,GAAG,oBAAoB;AAE7B,QAAA,IAAA,CAAA,MAAM,GAAG;AACf,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,IAAI,EAAE,gCAAgC;AACtC,YAAA,KAAK,EAAE,gCAAgC;SACxC;AAIC,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;IACxB;;IAGA,OAAO,IAAI,CAAC,QAAgB,EAAA;AAC1B,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC;IAChD;;IAGQ,MAAM,GAAA;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,YAAY;IAC1D;;AAGA,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI;YACF,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QACxE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC7C;IACF;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AAAQ,QAAA,IAAI;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;QACxE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC7C;IACF;AAEA,IAAA,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AAAQ,QAAA,IAAI;YAC9B,OAAO,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;QAC1E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC9C;IACF;;AAGQ,IAAA,WAAW,MAAM,GAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;;;AAGpB,YAAA,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF;QACH;QACA,OAAO,MAAM,CAAC,QAAQ;IACxB;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACtC;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACtC;AAEA,IAAA,OAAO,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC;+GA3EW,MAAM,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAN,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAM,cADO,MAAM,EAAA,CAAA,CAAA;;4FACnB,MAAM,EAAA,UAAA,EAAA,CAAA;kBADlB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCMrB,WAAW,CAAA;IAEtB,WAAA,CACU,IAAgB,EAChB,aAAmC,EAAA;QADnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,aAAa,GAAb,aAAa;IAEvB;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;AAC1D,QAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,UAAU,CAAC;AAC1D,QAAA,OAAO,UAAU;IACnB;;AAGA,IAAA,MAAM,GAAG,CACP,GAAW,EACX,KAAc,EACd,WAAW,GAAG,KAAK,EACnB,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,IAAI,EACd,OAAqB,EAAA;;QAIrB,MAAM,MAAM,IAAI,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAe;QAExF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC;AACvD,QAAA,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC;aAC9B,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,EAAE,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM;;YAEd,OAAO;SACR;aACA,IAAI,CACH,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC;;AAER,QAAA,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;;;AAGnB,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CAAC;IACN;;AAGQ,IAAA,eAAe,CAAC,MAAW,EAAE,IAAS,EAAE,WAAmB,EAAA;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE;AAChE,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAC;YAClE;iBAAO;AACL,gBAAA,MAAM,CAAC,CAAA,EAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,IAAI,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QAE/E,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;;;QAGvD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACvG,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACtD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CAAC;IACJ;IAEA,MAAM,KAAK,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QAChF,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACxD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACxG,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC;AACvD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CAAC;IACJ;IACE,MAAM,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QAChF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACtD,OAAO,MAAM,cAAc,CAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5D,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC;AACrD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CAAC;IACJ;IAEA,MAAM,MAAM,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAA;QACjF,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,GAAG,KAAmB;QAE5B,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QACzD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACjG,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,QAAQ,CAAC,EAChC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH,CAAC;IACJ;+GAnHW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAL,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAM,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACRD;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,aAAa,EAAE,0FAA0F;CAC1G;;ACKD;MACa,cAAc,CAAA;AAKzB,IAAA,WAAA,CAAoC,MAAqB,EAAA;QAJxC,IAAA,CAAA,UAAU,GAAG,iBAAiB;;AAM7C,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,WAAW,CAAC,aAAa,IAAI,EAAE;AAExE,QAAA,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,GAAG,YAAY;IACxF;AAEA;;AAEG;IACH,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAA;AAC1B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;QAEpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E;AAEA;;AAEG;AACH,IAAA,GAAG,CAAI,GAAW,EAAA;AAChB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AAE3B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B;AAC/D,YAAA,OAAQ,MAAM,CAAC,GAAG,CAAO,IAAI,IAAI;QACnC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC;QAEnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,QAAA,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;IAC5C;AAEA;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;QAEvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI;IACpC;IAEQ,OAAO,GAAA;AACb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,SAAS,EAAE;YACd,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9B;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;IACF;AAEQ,IAAA,OAAO,CAAC,SAAiB,EAAA;AAC/B,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IACnE;AAEQ,IAAA,OAAO,CAAC,UAAkB,EAAA;AAChC,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;AAC9D,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,OAAO,SAAS,IAAI,IAAI;QAC1B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAnGW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,kBAKL,cAAc,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AALvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAHb,MAAM,EAAA,CAAA,CAAA;;4FAGP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAOc,MAAM;2BAAC,cAAc;;;MCmBvB,WAAW,CAAA;;;AAoBtB;;AAEG;AACH,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE;YAE9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,IAAI,CAAC;;AAEjD,YAAA,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;YAEtC,OAAO,CAAC,aAAa,EAAE,uBAAuB,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,IAAI,CACnF,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACtC;QACH;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;AACH,IAAA,oBAAoB,CAAC,GAAW,EAAA;AAC9B,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAEvC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,UAAU,CAAC,IAAI,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC;AAE/D,YAAA,OAAO,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QACxC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAwHA,IAAA,WAAA,CACU,IAAiB,EACjB,cAA8B,EAC9B,aAAmC,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,aAAa,GAAb,aAAa;AAjLf,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,gBAAgB,EAAE;QAElC,IAAA,CAAA,YAAY,GAAG,KAAK;AACpB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAoB,IAAI,CAAC;AAEzD,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC5D,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AACpE,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,eAAe,CAAiB,IAAI,CAAC;AAC7D,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,eAAe,CAA6B,IAAI,CAAC;AAC1E,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;QACrE,IAAA,CAAA,gBAAgB,GAAG,IAAI,CAAC;AAC9B,aAAA,YAAY;AACZ,aAAA,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAEvB,IAAA,CAAA,UAAU,GAAG,EAAE;AA0CvB;;AAEG;;AAEM,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,IAAgC,KACzD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEpC;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,MAAkC,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAEtF;;AAEG;AACM,QAAA,IAAA,CAAA,qBAAqB,GAAG,CAAC,KAAoB,KACpD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;AAE5C;;AAEG;QACM,IAAA,CAAA,kBAAkB,GAAG,MAAqB,IAAI,CAAC,yBAAyB,CAAC,KAAK;AAEvF;;AAEG;AACM,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,IAAmB,KAAW,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AAE3F;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAEzE;;AAEG;AACM,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAsB,KAAW,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;AAE7F;;AAEG;AACM,QAAA,IAAA,CAAA,UAAU,GAAG,MACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;AAEjE;;AAEG;QACM,IAAA,CAAA,iBAAiB,GAAG,MAAoB;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAC1C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;YACzC,OAAO,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI;AACrD,QAAA,CAAC;AAED;;AAEG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,MAAc,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;AAEvE;;AAEG;QACM,IAAA,CAAA,gBAAgB,GAAG,MAAc,IAAI,CAAC,WAAW,EAAE,IAAI,MAAM;AAEtE;;AAEG;AACM,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAqB,YAAY,CAAC,UAAU;AAE5E;;AAEG;QACM,IAAA,CAAA,gBAAgB,GAAG,MAAa;AACvC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM;AAC9E,QAAA,CAAC;;;AAIQ,QAAA,IAAA,CAAA,SAAS,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,SAAS,CAAC;;AAG3E,QAAA,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,UAAU,CAAC;;AAG9E,QAAA,IAAA,CAAA,aAAa,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,aAAa,CAAC;;AAGnF,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,OAAO,CAAC;;AAGxE,QAAA,IAAA,CAAA,cAAc,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,aAAa,CAAC;;AAGpF,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,iBAAiB,CAAC;;AAG3C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,YAAY,CAAC;;AAGjF,QAAA,IAAA,CAAA,WAAW,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,WAAW,CAAC;;AAG/E,QAAA,IAAA,CAAA,cAAc,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,cAAc,CAAC;;AAGrF,QAAA,IAAA,CAAA,eAAe,GAAG,MAAqB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAS,eAAe,CAAC;AAEhG;;AAEG;QACM,IAAA,CAAA,kBAAkB,GAAG,MAAe,IAAI,CAAC,sBAAsB,CAAC,KAAK,IAAI,KAAK;;AAGhF,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;AACpC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AACvC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAgB,IAAI,uDAAC;AAO9C,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,EAAE;IAC3D;AAEA;;;;;;;;AAQG;IACH,qBAAqB,GAAA;AACnB,QAAA,aAAa,CAAC;AACZ,YAAA,IAAI,CAAC,yBAAyB;AAC9B,YAAA,IAAI,CAAC,kBAAkB;AACvB,YAAA,IAAI,CAAC,kBAAkB;SACxB;AACE,aAAA,IAAI,CACH,MAAM,CACJ,CAAC,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,KACzC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CACrD,EACD,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,MAAK;;AAEb,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE;YACzC,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,MAAM,YAAY,GAA0B;AAC1C,oBAAA,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,KAAM;AACnD,oBAAA,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;iBAC7E;AAED,gBAAA,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC;gBACpD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAChD;AAEA,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;AAClB,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;YACrB,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC;gBAC1E;YACF;;AAEA,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;AAC5B,QAAA,CAAC,CAAC;IACN;AAEA;;;AAGG;IACH,wBAAwB,GAAA;QACtB,aAAa,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC;AAC7D,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,EACtE,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,MAAK;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAC3C,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;AAC5B,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;IAChB;AAEA;;AAEG;IACK,YAAY,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE;;QAGzC,IAAI,CAAC,WAAW,EAAE;;;AAGhB,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;AACtC,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C,IAAI,CAAC,YAAY,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB;;;AAIA,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAC7B,GAAG,CAAC,CAAC,MAAM,KAAI;YACb,IAAI,CAAC,MAAM,EAAE;gBACX,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC;QACF,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAClB;IACH;AAEA;;AAEG;IACH,MAAM,cAAc,CAAC,KAA4B,EAAA;AAC/C,QAAA,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAE1B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACxD,YAAA,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC;YAC9C,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;;;AAG3C,gBAAA,MAAM,UAAU,GAAG;AACjB,oBAAA,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;AACtC,oBAAA,aAAa,EAAE,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE;iBAClE;gBACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC;AAEvD,gBAAA,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC;AAC1E,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACzC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC;AAC7C,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAC9C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2CAA2C,CAAC;AAC/D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,MAAM,KAAK,CAAC,KAAmB,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAE1B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;;AAEhD,YAAA,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,MAAM,CAAC;YAE3D,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;gBAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC;AAE9C,gBAAA,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC;AAChE,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACzC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,aAAa,CAAC,KAAK,CAAC,8CAA8C,CAAC;AACnE,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,8CAA8C,CAAC;AAClE,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iCAAiC,CAAC;AACrD,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI;AACF,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAClC,MAAM,CAAC,CAAC,CAAC,KAAsB,CAAC,KAAK,IAAI,CAAC,EAC1C,IAAI,CAAC,CAAC,CAAC,CACR;YACH;AAEA,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;YAC3C,IAAI,CAAC,YAAY,EAAE;gBACjB,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;YACjB;AAEA,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnC,YAAA,OAAO,IAAI;;YAET,IAAI,CAAC,sBAAsB,CAAC;AAC1B,gBAAA,aAAa,EAAE,YAAY;aACV,CAAC,CACrB,CAAC,IAAI,CACJ,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,gBAAA,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI;AAEjC,gBAAA,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE;AACvB,oBAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;gBAC1C;AAEA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,IAAI,KAAI;gBACX,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;gBAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC;AAC5D,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;AACtC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,YAAA,CAAC,CAAC,EACF,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,YAAA,CAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AAC3B,YAAA,CAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;QACH;AAAE,QAAA,MAAM;AACN,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAChD;IACF;AAEA;;AAEG;IACH,MAAM,MAAM,CAAC,YAAqB,EAAA;QAChC,MAAM,KAAK,GAAG,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE;AACpD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AAExB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAEjD,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;gBACnB,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC;AAC3C,gBAAA,OAAO,IAAI;YACb;iBAAO;;AAEL,gBAAA,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;AACpC,YAAA,OAAO,KAAK;QACd;IACF;;AAGQ,IAAA,MAAM,uBAAuB,CACnC,KAA4B,EAC5B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACxC,QAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,MAAM,CAAC;AACvD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;IAC1E;AAEQ,IAAA,eAAe,CACrB,KAAoB,EACpB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnF;;AAGQ,IAAA,sBAAsB,CAC5B,KAAc,EACd,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACrF;AAEQ,IAAA,gBAAgB,CAAC,YAAoB,EAAE,UAAU,GAAG,KAAK,EAAA;;AAE/D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE;AACzC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC;;QAGzE,IAAI,WAAW,EAAE;YACf,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,WAAW,CAAA,CAAE,CAAC;QACjE;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC;IAC5F;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE;;;AAG/B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC3C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC;AACxE,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC;IACjD;;AAGA,IAAA,UAAU,CAAC,OAAmB,EAAE,UAAA,GAAsB,IAAI,EAAA;AACxD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC;;;QAI7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC;QAC/D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,eAAe,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;;AAGrD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACjC,IAAI,KAAK,EAAE;YACT,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;QAC7C;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;QAC/B,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC;;;AAKhD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEnC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;AAEvC,QAAA,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC;IACjD;IAEA,YAAY,GAAA;AACV,QAAA,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;IACjC;+GAniBW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MClBY,wBAAwB,CAAA;IAYnC,WAAA,CACU,EAAc,EACd,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAbV,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,OAAO,GAAG,CAAC;QACX,IAAA,CAAA,OAAO,GAAG,CAAC;QAGV,IAAA,CAAA,UAAU,GAAG,KAAK;IAOxB;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;YACzB,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAChF;iBAAO;gBACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;YAC1C;AACA,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;YAC3D;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;YAC9D;;;QAGF;IACF;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,KAAK,CAAC,gBAAgB;AAAE,YAAA,OAAO;QAEnC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;;QAG1C,IACE,IAAI,CAAC,kBAAkB;YACvB,MAAM,KAAK,IAAI,CAAC,UAAU;YAC1B,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EACjC;YACA;QACF;;;AAIA,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;;AAE5B,YAAA,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;gBACvF;YAEF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;;AAGvC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,YAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE;;AAGlF,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE;QAC5C;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAE1C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,wBAAwB,EAAE;IAClC;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QAEtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAC1C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAE1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,EAAE,CAAC,aAAa,EACrB,WAAW,EACX,CAAA,UAAA,EAAa,IAAI,CAAC,OAAO,CAAA,IAAA,EAAO,IAAI,CAAC,OAAO,CAAA,GAAA,CAAK,CAClD;IACH;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;+GA1GW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAQE,KAAK;uBAAC,YAAY;;sBAClB;;sBAsCA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBA2CpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAc7C,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAE;;;ACtHtC;MAiBa,wBAAwB,CAAA;IAenC,WAAA,CACU,EAA2B,EAC3B,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAhBV,IAAA,CAAA,aAAa,GAAkB,EAAE;QACjC,IAAA,CAAA,YAAY,GAAkB,IAAI;QAClC,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,QAAQ,GAAG,CAAC;QAEX,IAAA,CAAA,YAAY,GAAG,KAAK;;AAGrB,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAK7D;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;YAC3B,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBACnC,IAAI,CAAC,QAAQ,EAAE;gBACf,IAAI,CAAC,mBAAmB,EAAE;YAC5B;QACF;aAAO;YACL,IAAI,CAAC,mBAAmB,EAAE;QAC5B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,QAAQ,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACrC,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ;QAE1D,IAAI,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,UAAU,EAAE;YACjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;QACzD;QAEA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC;IAC5D;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC;AAC3D,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC;;AAGpD,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;gBAC3E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;YAC3E;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;gBAC5C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;gBAC3E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;YAC1E;AACA,YAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS,CAAC;gBACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBACzE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC5E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC1E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;YAC7E;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AACxD,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1D,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QACxB,IAAI,KAAK,CAAC,gBAAgB;AAAE,YAAA,OAAO;AAEnC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,wBAAwB,EAAE;AAEhC,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAE1D,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;;QAG7D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1C;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAExB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAEtC,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU;AAC9B,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW;AAChC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS;AAC5B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ;QAE1B,MAAM,QAAQ,GAAG,GAAG;QACpB,MAAM,SAAS,GAAG,GAAG;;QAGrB,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,QAAQ,CAAC;QACrD;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,QAAQ,CAAC;AACnD,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QACzD;;QAGA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,SAAS,CAAC;QACxD;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,SAAS,CAAC;AACtD,YAAA,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QACzD;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA,EAAA,CAAI,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA,EAAA,CAAI,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA,EAAA,CAAI,CAAC;IACrE;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C;IACF;AAEQ,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AAC5C,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,GAAG;IAClF;+GAvLW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAWE;;sBAiGA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBA0BpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAwC7C,YAAY;uBAAC,kBAAkB;;;ACxJlC,MAAM,gBAAgB,GAAG,wBAAwB;AAEjD,MAAM,gBAAgB,GAA4B;IAChD,kBAAkB,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;AACzD,IAAA,UAAU,EAAE;AACV,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;AACxB,KAAA;CACF;MAKY,sBAAsB,CAAA;AAQjC,IAAA,WAAA,CACU,IAAiB,EAAA;QAAjB,IAAA,CAAA,IAAI,GAAJ,IAAI;AARN,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;AAGjC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA0B,gBAAgB,qDAAC;AAC9D,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;QAO3C,MAAM,CACJ,MAAK;;YAEH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACzC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAED,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE;AACxC,YAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEQ,aAAa,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC3C,QAAA,OAAO,MAAM,GAAG,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,GAAG,gBAAgB;IACpE;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,YAAyC,EAAA;QAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AAC5B,YAAA,GAAG,CAAC;AACJ,YAAA,kBAAkB,EAAE;AAClB,gBAAA,YAAY,EAAE,YAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,gBAAA,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,EAAE;gBAC3C,eAAe,EAAE,YAAY,CAAC,eAAe,IAAI,CAAC,CAAC,kBAAkB,CAAC,eAAe;AACtF,aAAA;AACD,YAAA,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC7C,SAAA,CAAC,CAAC;IACL;AAGA;;AAEG;AACH,IAAA,gBAAgB,CAAC,UAAuC,EAAA;QACtD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AAC5B,YAAA,GAAG,CAAC;YACJ,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE;AAC9C,YAAA,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC7C,SAAA,CAAC,CAAC;IACL;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACjB,YAAA,GAAG,gBAAgB;AACnB,YAAA,IAAI,EAAE,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AAC5D,SAAA,CAAC;IACJ;IAEA,MAAM,sBAAsB,CAAC,IAAwB,EAAA;AACnD,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB;YAEnD,IAAI,GAAG,GAA2C,IAAI;AAEtD,YAAA,IAAI,OAAO,EAAE,eAAe,EAAE;;AAE5B,gBAAA,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CACvB,CAAA,cAAA,CAAgB,EAChB,IAAI,EACJ,IAAI;iBACL;YACH;iBAAO;;AAEL,gBAAA,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1D;YAEA,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC5B,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,EAAE;oBAClE,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE;oBAC/D,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,EAAE,eAAe;AACtE,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC;QACvD;IACF;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI;aACrC,IAAI,CAAC,GAAG,IAAG;YACV,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC5B,IAAI,CAAC,kBAAkB,CAAC;AACtB,oBAAA,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE;AACzC,oBAAA,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;AACvC,oBAAA,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe;AAC1C,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC;aACA,KAAK,CAAC,CAAC,IAAG;AACT,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC;AAC7D,QAAA,CAAC,CAAC;IACN;IAGA,8BAA8B,CAAC,UAAU,GAAG,KAAK,EAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC3C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC;IAC/E;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;;YAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAQ;YAC1C,IAAI,KAAK,EAAE;gBACT,OAAO;AACL,oBAAA,GAAG,gBAAgB;AACnB,oBAAA,GAAG,KAAK;AACR,oBAAA,UAAU,EAAE;wBACV,GAAG,gBAAgB,CAAC,UAAU;AAC9B,wBAAA,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;AAC5B,qBAAA;iBACF;YACH;QACF;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC;QAC7D;;QAGA,OAAO;AACL,YAAA,GAAG,gBAAgB;AACnB,YAAA,UAAU,EAAE;gBACV,GAAG,gBAAgB,CAAC,UAAU;AAC/B,aAAA;SACF;IACH;AAEQ,IAAA,YAAY,CAAC,QAAiC,EAAA;AACpD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;IACjC;+GAxJW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA,CAAA;;4FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MC3CY,YAAY,CAAA;;AAYvB,IAAA,WAAA,CACE,eAAiC,EACzB,OAAyB,EACzB,eAAuC,EACvC,aAAmC,EAAA;QAFnC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,aAAa,GAAb,aAAa;AAdf,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAY,MAAM,kDAAC;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;AAG/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAA+B,aAAa,wDAAC;AACnE,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;QAE3C,IAAA,CAAA,QAAQ,GAA4B,IAAI;AA4CxC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAiC,SAAS,0DAAC;QAClE,IAAA,CAAA,WAAW,GAAuB,IAAI;QApC5C,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;;QAG1D,MAAM,CACJ,MAAK;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAChD,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK;;AAGtC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;;YAG5B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,OAAO;AACzD,YAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,IAAI,SAAS,CAAC;;YAGrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,YAAY;YACnE,IAAI,kBAAkB,EAAE;AACtB,gBAAA,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC;YACpD;AACF,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CAAC,MAAK;;AAEV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,WAAW,IAAI,MAAM,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;YAClD;AACF,QAAA,CAAC,CAAC;IACJ;IAKO,cAAc,CAAC,MAA0B,EAAE,WAAwB,EAAA;AACxE,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW;;AAE9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7C;AAEO,IAAA,yBAAyB,CAAC,UAAkB,EAAA;AACjD,QAAA,IAAI,CAAC,UAAU;YAAE;QAEjB,IAAI,KAAK,GAAG,UAAU;;QAGtB,IAAI,KAAK,KAAK,SAAS;YAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AACnD,YAAA,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QACvE;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe;QAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;QAG9C,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,KAAK,CAAC;QAC3D,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,SAAS,CAAC;;AAGlE,QAAA,MAAM,gBAAgB,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,CAAC;QACtC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,gBAAgB,CAAC;QAChF,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,KAAK,CAAC;QAExE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,KAAK,CAAC;QAC9D,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,SAAS,CAAC;QACrE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,EAAE,gBAAgB,CAAC;;QAGnF,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC;AACzD,QAAA,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,KAAK,CAAC;QAC9D,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAE/D,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC;AAC5D,QAAA,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjF;AAEA;;AAEG;AACK,IAAA,QAAQ,CAAC,GAAW,EAAA;QAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,OAAO,GAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE;IAC3B;AAEA;;;AAGG;AACK,IAAA,gBAAgB,CAAC,GAAW,EAAA;AAClC,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,SAAS;;QAG5C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AAChD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;;AAGhD,QAAA,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG;;QAG3D,OAAO,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,SAAS;IAChD;AAEA,IAAA,QAAQ,CAAC,IAAe,EAAA;QACtB,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxD;AAEQ,IAAA,iBAAiB,CAAC,IAAe,EAAA;QACvC,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,GAAG,YAAY,GAAG,aAAa;AACnE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACnC,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACvC;IACF;IAEQ,eAAe,GAAA;;QAErB,IAAI,CAAC,yBAAyB,EAAE;;AAGhC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAK;YACxC,IAAI,CAAC,yBAAyB,EAAE;AAClC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;AAC9C,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;IACJ;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa;;AAGtD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,QAAQ,EAAE;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,YAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QACnC;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,EAAe,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;;AAGzD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM;AAC1F,YAAA,OAAO,IAAI;;AAGb,QAAA,IACE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;YAC7C,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,EAC7C;AACA,YAAA,OAAO,IAAI;QACb;;QAGA,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO;IAClE;AAEQ,IAAA,kBAAkB,CAAC,KAAmC,EAAA;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;;;;;QAO3D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,aAAa,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAAY,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACjD;;AAGQ,IAAA,oBAAoB,CAAC,OAAkF,EAAA;QAC7G,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe;QAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;;AAG3D,QAAA,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;AAE3J,QAAA,MAAM,cAAc,GAAG,CAAC,EAAe,KAAI;AACzC,YAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAC;AACnD,QAAA,CAAC;QAED,cAAc,CAAC,aAAa,CAAC;QAC7B,cAAc,CAAC,gBAAgB,CAAC;IAClC;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA;;AAEG;IACI,iBAAiB,CAAC,OAAoB,EAAE,MAAsC,EAAA;AACnF,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AAEnD,QAAA,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAE,YAAoB,KAAI;YACrE,IAAI,KAAK,EAAE;gBACT,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,gBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;;gBAEhF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,EAAE,UAAU,CAAC;;AAG1D,gBAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,YAAY,CAAA,CAAE,EAAE,UAAU,CAAC;;;;;;;;;YAUvF;AACF,QAAA,CAAC;;AAGD,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC;QAClE;;;;AAKA,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;;AAGpD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;;;AAItD,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;;AAGrD,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;AAC1C,QAAA,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;AAC7D,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC;;AAGnD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;;AAG9C,QAAA,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;AACzD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;;AAGvD,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC;AACnD,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;;AAGjD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;AAC9C,QAAA,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AAC3D,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;;AAGrD,QAAA,UAAU,CAAC,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;;AAGjE,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/B,QAAA,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AAC7B,QAAA,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnC,QAAA,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnC,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;IACjC;+GAzUW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAU,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,iBAAiB,CAAA;AAC5B,IAAA,WAAA,CACU,MAAc,EACd,YAA4B,EAC5B,IAAgB,EAAA;QAFhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,IAAI,GAAJ,IAAI;IACV;AAEJ;;AAEG;AACH,IAAA,gBAAgB,CACd,GAAW,EACX,IAAS,EACT,OAAgC,EAAA;;;AAIhC,QAAA,OAAO,IAAI,UAAU,CAAqB,CAAC,QAAQ,KAAI;;AAErD,YAAA,IAAI,cAAc,GAAG,IAAI,WAAW,CAAC;AACnC,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,MAAM,EAAE,mBAAmB;AAC3B,gBAAA,eAAe,EAAE,UAAU;AAC5B,aAAA,CAAC;YAEF,IAAI,OAAO,EAAE;gBACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACnC,oBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,gBAAA,CAAC,CAAC;YACJ;YAEA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE;gBACzC,IAAI;AACJ,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,YAAY,EAAE,MAAM;AACrB,aAAA,CAAC;YAEF,IAAI,UAAU,GAAG,CAAC;AAElB,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;AACxB,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;oBACd,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,EAAE;;AAEjD,wBAAA,MAAM,QAAQ,GAAI,KAAa,CAAC,WAAW;AAC3C,wBAAA,IAAI,CAAC,QAAQ;4BAAE;wBAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;AAC1C,wBAAA,UAAU,GAAG,QAAQ,CAAC,MAAM;wBAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;AAEjC,wBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,4BAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gCAAE;AAExB,4BAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gCAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAExC,gCAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;AACxB,oCAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;oCAC1C;gCACF;AAEA,gCAAA,IAAI;oCACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;;oCAGlC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,QAAQ,CAAC,IAAI,CAAC;wCACZ,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE;AAC/C,wCAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,OAAO;AAC5B,wCAAA,EAAE,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;AAC5B,wCAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;AACnC,wCAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;wCAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,qCAAA,CAAC,CACH;gCACH;gCAAE,OAAO,CAAC,EAAE;oCACV,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC;gCACtD;4BACF;wBACF;oBACF;yBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AAChD,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC5C;gBACF,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;gBACD,QAAQ,EAAE,MAAK;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5C,CAAC;AACF,aAAA,CAAC;AAEF,YAAA,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE;AAChC,QAAA,CAAC,CAAC;IACJ;+GAjGW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAT,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCKY,cAAc,CAAA;IAEzB,WAAA,CACU,IAAiB,EACjB,iBAAoC,EAAA;QADpC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;AAEzB,QAAA,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA,YAAA,CAAc,EAAE,OAAO,CAAC;IAC5F;AAEA,IAAA,cAAc,CACZ,OAA2B,EAC3B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC;IAC9D;AAEA,IAAA,cAAc,CACZ,aAAqB,EACrB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IAChF;;;;;;;;;;AAaA,IAAA,iBAAiB,CAAC,aAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACzD,QAAA,MAAM,IAAI,GAAG,EAAE,gBAAgB,EAAE,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE;AACrE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC;IAC7D;AAEA,IAAA,eAAe,CACb,aAAqB,EACrB,KAAa,EACb,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,MAAA,CAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC;IACxF;AAEA,IAAA,gBAAgB,CAAC,OAAgB,EAAE,UAAU,GAAG,KAAK,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC;IAChE;+GA/DW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAK,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAK,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCFY,kBAAkB,CAAA;AAH/B,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;;AAGxC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAmB,EAAE,oDAAC;AACvC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAU,KAAK,qDAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAU,KAAK,yDAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAU,IAAI,mDAAC;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,CAAC,yDAAC;AACjC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,+DAAC;AA+OzD,IAAA;AA7OC;;AAEG;IACI,2BAA2B,CAChC,eAAoC,EACpC,MAAc,EAAA;;AAGd,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC;AAChC,cAAE,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe;cACxC,eAAe,CAAC;AAChB,kBAAE,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU;AACrC,kBAAE,IAAI,IAAI,EAAE;AAEhB,QAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,eAAe,CAAC;;QAGzD,IAAI,QAAQ,GAAc,EAAE;AAC5B,QAAA,IAAI,eAAe,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE;AACvE,YAAA,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAgB,MAAM;AAC7D,gBAAA,EAAE,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;gBACxB,MAAM,EAAE,GAAG,CAAC,IAAI;gBAChB,IAAI,EAAE,GAAG,CAAC,OAAO;AACjB,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,aAAA,CAAC,CAAC;QACL;;QAGA,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,eAAe,IAAI,EAAE;QAEtF,OAAO;AACL,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,eAAe,EAAE,SAAS;AAC1B,YAAA,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,uBAAuB;AACvD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,QAAQ;SACnB;IACH;AAEA;;AAEG;AACH,IAAA,MAAM,YAAY,CAAC,MAAc,EAAE,YAAY,GAAG,KAAK,EAAA;QACrD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAE5D,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACtE,YAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;YACjD;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAEjF,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAChD,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,CAC5C;gBACD,MAAM,OAAO,GACX,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAE9E,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC;AACjC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;AAC7C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAE3B,MAAM,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,cAAc,CAAC,MAAM,CAAA,4BAAA,CAA8B,CAAC;YAC5E;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAC7C,YAAA,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC;AAC/D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA;;AAEG;IACH,MAAM,gBAAgB,CAAC,MAAc,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;YAAE;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAE5B,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YAE9E,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAChD,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,CAC5C;gBACD,MAAM,OAAO,GACX,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAE9E,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;AAC1D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;YACxD;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,6BAA6B,CAAC;AAClD,YAAA,MAAM,CAAC,KAAK,CAAC,iDAAiD,EAAE,GAAG,CAAC;QACtE;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA;;AAEG;IACH,MAAM,mBAAmB,CAAC,SAAiB,EAAA;AACzC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC;YAElE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE;;gBAEjC,MAAM,QAAQ,GAAkB,EAAE;AAClC,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AAC1D,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AAChE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;AAE3D,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;oBAClC,IAAI,KAAK,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,UAAU,CAAC,CAAC,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACjD;gBAEA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC5B,oBAAA,EAAE,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;oBACxB,MAAM,EAAE,GAAG,CAAC,IAAI;oBAChB,IAAI,EAAE,GAAG,CAAC,OAAO;AACjB,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,iBAAA,CAAC,CAAC;YACL;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAC9C,YAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC;QAClE;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;AAEG;AACH,IAAA,MAAM,aAAa,CAAC,SAAiB,EAAE,MAAc,EAAA;AACnD,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC;AACrE,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;gBACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;AAC/E,gBAAA,aAAa,CAAC,OAAO,CAAC,mCAAmC,CAAC;YAC5D;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC;AACpD,YAAA,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC;QACnE;gBAAU;AACR,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;IACF;AAEA;;AAEG;IACH,MAAM,gBAAgB,CAAC,MAAc,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC/E,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAC/C;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC;AAC9C,YAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC;QAClE;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,kBAAkB,CAAC,SAAiB,EAAE,QAAgB,EAAE,MAAc,EAAA;AAC1E,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC;AAC7E,YAAA,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO;YAEjC,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,KAAK,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAC/E;AACD,gBAAA,aAAa,CAAC,OAAO,CAAC,4BAA4B,CAAC;YACrD;AACA,YAAA,OAAO,OAAO;QAChB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,aAAa,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAC7C,YAAA,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC;AAC/D,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC;IACF;AAEA;;AAEG;IACH,eAAe,GAAA;;AAEb,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;+GAxPW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACgFD;;AAEG;AACI,MAAM,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB,EACzB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,gBAAgB,EAAE,QAAQ;AAC1B,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,gBAAgB,EAAE,gBAAgB;AAClC,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,SAAS,EAAE,KAAK;KACjB,CAAC;AACH,CAAA,CACF;;ACzGD;;;;;;;;;;;AAWG;MAIU,kBAAkB,CAAA;AAH/B,IAAA,WAAA,GAAA;;AAME;;AAEG;AACI,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAEjC;;AAEG;AACI,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AAE3C;;AAEG;AACI,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAEnC;;AAEG;AACK,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,6DAAC;AAEvD;;AAEG;AACK,QAAA,IAAA,CAAA,cAAc,GAAsB,MAAM,CAAY,EAAE,0DAAC;;AAIjE;;AAEG;AACI,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACjC,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,OAAO,CAAC,CAAC;YACX;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,CAAC;AAEnC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,YAAA,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC;YACpE;;YAGA,MAAM,iBAAiB,GAAG;AACvB,iBAAA,KAAK,CAAC,aAAa,GAAG,CAAC;AACvB,iBAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;YAE1C,OAAO,iBAAiB,CAAC,MAAM;AACjC,QAAA,CAAC,uDAAC;;AAIF;;AAEG;AACI,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAC9B,MAAK;AACH,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;YAElC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,gBAAA,IAAI,WAAW,EAAE,EAAE,EAAE;AACnB,oBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,oBAAA,IAAI,WAAW,CAAC,EAAE,KAAK,eAAe,EAAE;wBACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC5C;gBACF;YACF;QACF,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAGC,iBAAiB,EAAE,IAAI,EAAA,CAAA,GAAA;;;AAAzB,YAAA,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAC5B;AAkGF,IAAA;;AA9FC;;;AAGG;AACH,IAAA,iBAAiB,CAAC,cAAiC,EAAA;AACjD,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;IACtC;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;;QAGvC,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC;YACpD;QACF;IACF;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IACnD;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC;AAEA;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,YAAqB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE;IACjC;+GAhLW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCIY,WAAW,CAAA;IAyCtB,gBAAgB,GAAA;AACd,QAAA,OAAO,yCAAyC;IAClD;AAEA,IAAA,WAAA,GAAA;;AA3CQ,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC5C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5D,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AACzC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ;;AAGhD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAY,EAAE,oDAAC;AAEvC;;AAEG;AACI,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;YACnC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AACxE,YAAA,OAAO,UAAU,EAAE,eAAe,KAAK,IAAI;AAC7C,QAAA,CAAC,+DAAC;;QAGM,IAAA,CAAA,aAAa,GAA0B,IAAI;;AAG5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAsB,IAAI,oDAAC;AAC5C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;AACpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAa,UAAU,sDAAC;;;AAI3C,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,uDAAC;;QAG9E,IAAA,CAAA,cAAc,GAA6B,EAAE;QAC7C,IAAA,CAAA,eAAe,GAAG,EAAE;AAOlB,QAAA,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC;;AAGvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C;IACF;;AAIA;;AAEG;IACH,aAAa,CAAC,MAAc,EAAE,SAAiB,EAAA;QAC7C,OAAO;YACL,WAAW,EAAE,SAAS;YACtB,eAAe,EAAE,IAAI,IAAI,EAAE;AAC3B,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,QAAQ,EAAE,EAAE;YACZ,MAAM;SACP;IACH;AAEA;;AAEG;AACI,IAAA,eAAe,CAAC,SAAkB,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;QAC3C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAE5B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;AAEA;;AAEG;AACI,IAAA,WAAW,CAAC,OAAuB,EAAA;AACxC,QAAA,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,OAAO,CAAC,WAAW,EACnB,WAAW,EACX,OAAO,CAAC,QAAQ,CAAC,MAAM,CACxB;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;;QAE5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KACrB,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC;AACxB,cAAE;AACE,gBAAA,GAAG,CAAC;gBACJ,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C;AACH,cAAE,CAAC,CACN,CACF;AACD,QAAA,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC9F;AAEA;;AAEG;IACI,gBAAgB,GAAA;QACrB,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;AACI,IAAA,UAAU,CAAC,OAAgB,EAAA;AAChC,QAAA,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;;AAGxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC;IACvD;AAEA;;AAEG;IACI,MAAM,eAAe,CAAC,SAAiB,EAAA;AAC5C,QAAA,MAAM,CAAC,IAAI,CAAC,qCAAqC,SAAS,CAAA,CAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC;AAC3E,QAAA,MAAM,cAAc,GAAG,MAAM,IAAI,EAAE;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;QAEpF,IAAI,eAAe,EAAE;AACnB,YAAA,eAAe,CAAC,QAAQ,GAAG,cAAc;AACzC,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;QACnC;aAAO;AACL,YAAA,MAAM,SAAS,GACb,cAAc,CAAC,MAAM,GAAG;AACtB,kBAAE,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI;AACjE,kBAAE,IAAI,IAAI,EAAE;YAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YAC3C,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC;YACtC;AAEA,YAAA,MAAM,UAAU,GAAmB;AACjC,gBAAA,WAAW,EAAE,SAAS;AACtB,gBAAA,eAAe,EAAE,SAAS;AAC1B,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,QAAQ,EAAE,cAAc;gBACxB,MAAM;aACP;AACD,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC9B;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACpC;;AAIA;;AAEG;AACI,IAAA,MAAM,WAAW,CAAC,IAAY,EAAE,YAAoB,IAAI,EAAA;AAC7D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,IAAI,CAAC,WAAW;YAAE;AAElB,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,SAAS,EAAE;AAClC,YAAA,aAAa,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACxC;QACF;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;QAEzC,IAAI,CAAC,UAAU,CAAC;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;AACtB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;AAElD,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;;AAEtB,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5B;iBAAO;;gBAEL,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAExC,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,IAAI,QAAQ,EAAE;oBACrD,IAAI,CAAC,UAAU,CAAC;AACd,wBAAA,MAAM,EAAE,OAAO;AACf,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,IAAI;AACf,wBAAA,SAAS,EAAE,KAAK;AAChB,wBAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC7B,qBAAA,CAAC;gBACJ;YACF;QACF;gBAAU;AACR,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,EAAE;AACzC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;QACF;IACF;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;AAEA;;;;;AAKG;AAEK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;AACvC,QAAA,MAAM,OAAO,GAAgB;AAC3B,YAAA,KAAK,EAAE,QAAQ;YACf,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE;AAC3D,YAAA,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;SAC/B;;AAGD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;YACnC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;YACpD,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAC7E;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAC9C;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;IACK,MAAM,GAAG,CAAC,OAAoB,EAAA;AACpC,QAAA,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC;AAEnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;AAEzC,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAElE,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;YAEA,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACtC,gBAAA,IACE,IAAI,CAAC,aAAa,KAAK,cAAc;AACrC,oBAAA,IAAI,CAAC,aAAa;AAClB,oBAAA,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAC/B;;oBAEA,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE;;AAEjD,oBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;gBAC3C;gBACA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzD;iBAAO;AACL,gBAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;YAChC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;AAEjC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B;AAEA,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;QAChC;IACF;IAEQ,MAAM,MAAM,CAAC,OAAoB,EAAA;AACvC,QAAA,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;AAEjD,QAAA,MAAM,gBAAgB,GAAY;AAChC,YAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC5B,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,eAAe,EAAE,KAAK;SACvB;AAED,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;AACzC,QAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;QAC3C,IAAI,UAAU,GAAG,KAAK;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACnD,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc;oBAAE;gBAE3C,IAAI,CAAC,UAAU,EAAE;oBACf,UAAU,GAAG,IAAI;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAE3B,oBAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;;AAGjC,oBAAA,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,EAAE;wBAC9E,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;AAClD,wBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;oBAC3C;gBACF;gBAEA,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE;gBAEpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO;AACrD,gBAAA,gBAAgB,CAAC,IAAI,GAAG,OAAO;gBAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;gBAElD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAC3E,CACF;YACH,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc;oBAAE;gBAE3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAChF;gBAED,eAAe,CAAC,IAAI,EAAE;gBACtB,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc;oBAAE;AAE3C,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAEnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC;AACxB,sBAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI;AACzD,sBAAE,CAAC,CACN,CACF;gBAED,eAAe,CAAC,IAAI,EAAE;gBACtB,eAAe,CAAC,QAAQ,EAAE;YAC5B,CAAC;AACF,SAAA,CAAC;AAEF,QAAA,MAAM,aAAa,CAAC,eAAe,CAAC;IACtC;+GA1XW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAX,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,mBAAmB,CAAA;AAPhC,IAAA,WAAA,GAAA;;AASE,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;AAC9B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;QAC3B,IAAA,CAAA,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAO;AAC3B,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAC,KAAK,6DAAC;;QAGhC,IAAA,CAAA,UAAU,GAAG,MAAM,EAAQ;QAC3B,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;QACjC,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAQ;QACrC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;;QAGjB,IAAA,CAAA,YAAY,GAAG,YAAY;AAE7B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAmB7C,IAAA;IAjBC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;IAClC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B;IAEA,sBAAsB,GAAA;;AAEpB,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;IACpC;+GApCW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,szBCjBhC,wlCAiCM,EAAA,MAAA,EAAA,CAAA,wjCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpBM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,mLAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIzC,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,wlCAAA,EAAA,MAAA,EAAA,CAAA,wjCAAA,CAAA,EAAA;;;MED1C,kBAAkB,CAAA;AAP/B,IAAA,WAAA,GAAA;QAQW,IAAA,CAAA,WAAW,GAAY,KAAK;AAE3B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAIpC;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;QAEpC,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,UAAU,GAAG,KAAK;AAmB1B,IAAA;IAjBC,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;IAEA,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,gBAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;gBAC1C,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,aAAA,CAAC;QACJ;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;+GA/BW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,6KCZ/B,kjFAgFA,EAAA,MAAA,EAAA,CAAA,0uHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,q8CAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIvC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,kjFAAA,EAAA,MAAA,EAAA,CAAA,0uHAAA,CAAA,EAAA;;sBAKlD;;sBAEA;;sBAKA;;;METU,mBAAmB,CAAA;AARhC,IAAA,WAAA,GAAA;AASE,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,KAAK,0DAAC;AAC9B,IAAA;+GAFY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,+JAIC,EAAA,MAAA,EAAA,CAAA,4QAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEW,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+JAAA,EAAA,MAAA,EAAA,CAAA,4QAAA,CAAA,EAAA;;;AET1C,MAAM,SAAS,GAAG;AACvB,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,EAAE,EAAE,MAAM;AACV,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,EAAE,EAAE,OAAO;CACZ;;MCSY,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;QASW,IAAA,CAAA,YAAY,GAAW,SAAS;QAChC,IAAA,CAAA,QAAQ,GAAW,MAAM;QACzB,IAAA,CAAA,YAAY,GAAkB,IAAI;QAClC,IAAA,CAAA,QAAQ,GAAW,cAAc;QAE1C,IAAA,CAAA,SAAS,GAAG,SAAS;AAMX,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAA6B;AAC7D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAC7C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAErC,QAAA,IAAA,CAAA,SAAS,GAAG;AACjB,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;AACnC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;AACjC,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/B,YAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;SAC/B;AAyBF,IAAA;AA9CC,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG;IACpE;;AAuBA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,QAAQ,KAAK;AACX,YAAA,KAAK,OAAO,EAAE,OAAO,YAAY;AACjC,YAAA,KAAK,MAAM,EAAE,OAAO,WAAW;AAC/B,YAAA,SAAS,OAAO,iBAAiB;;IAErC;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,QAAQ,KAAK;AACX,YAAA,KAAK,OAAO,EAAE,OAAO,YAAY;AACjC,YAAA,KAAK,MAAM,EAAE,OAAO,WAAW;AAC/B,YAAA,SAAS,OAAO,QAAQ;;IAE5B;AAEA,IAAA,gBAAgB,CAAC,IAAY,EAAA;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,QAAQ;IACrE;+GApDW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBxC,4tJAmIM,EAAA,MAAA,EAAA,CAAA,00GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvHM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjF,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,4tJAAA,EAAA,MAAA,EAAA,CAAA,00GAAA,CAAA,EAAA;;sBAK5F;;sBACA;;sBACA;;sBACA;;sBACA;;sBAQA;;sBACA;;sBACA;;sBACA;;;MErBU,qBAAqB,CAAA;+GAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,y2CAkCM,EAAA,MAAA,EAAA,CAAA,qnCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5BQ,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKb,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;+BACI,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,y2CAAA,EAAA,MAAA,EAAA,CAAA,qnCAAA,CAAA,EAAA;;;MEgBtC,uBAAuB,CAAA;IAQhC,WAAA,CACY,aAA4B,EAC5B,EAAqB,EAAA;QADrB,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,EAAE,GAAF,EAAE;;AARN,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;QAGhC,IAAA,CAAA,cAAc,GAAW,EAAE;QAC7B,IAAA,CAAA,QAAQ,GAAG,KAAK;AAYb,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ;AAC7C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;AACtC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAU;AAC5C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAQ;AAe7C,QAAA,IAAA,CAAA,QAAQ,GAAoB;AAC/B,YAAA;AACI,gBAAA,EAAE,EAAE,WAAW;AACf,gBAAA,MAAM,EAAE,kBAAkB;AAC1B,gBAAA,QAAQ,EAAE,iCAAiC;AAC3C,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,SAAS,EAAE;AACd;SACJ;IApCoC;IAErC,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE;QACpE;IACJ;IAQO,aAAa,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,mCAAmC;AAC5C,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACvC,QAAA,CAAC,CAAC;IACN;IAaA,SAAS,GAAA;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;QAClD,IAAI,KAAK,EAAE;AACP,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YAEvB,UAAU,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YAC3B,CAAC,EAAE,GAAG,CAAC;QACX;IACJ;IAEA,gBAAgB,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,wBAAwB;AAC/B,YAAA,OAAO,EAAE,wGAAwG;AACjH,YAAA,WAAW,EAAE,aAAa;AAC1B,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC1C,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,oBAAoB,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,yCAAyC,OAAO,CAAC,MAAM,CAAA,IAAA,EAAO,OAAO,CAAC,QAAQ,CAAA,CAAA,CAAG;AAC1F,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;IACN;IAEA,uBAAuB,GAAA;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,OAAO,EAAE,iFAAiF;AAC1F,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;AACjD,QAAA,CAAC,CAAC;IACN;IAEA,oBAAoB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,qBAAqB;AAC5B,YAAA,OAAO,EAAE,0HAA0H;AACnI,YAAA,WAAW,EAAE,gBAAgB;AAC7B,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE;AACT,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AAC9C,QAAA,CAAC,CAAC;IACN;+GAhHS,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBpC,m/KA4HM,EAAA,MAAA,EAAA,CAAA,20GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvGQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI9E,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,m/KAAA,EAAA,MAAA,EAAA,CAAA,20GAAA,CAAA,EAAA;;sBASvF;;sBAaA;;sBACA;;sBACA;;sBACA;;sBACA;;;AE5CL;;;AAGG;MACU,WAAW,CAAA;AACpB;;;;AAIG;AACH,IAAA,OAAO,aAAa,CAChB,aAA4B,EAC5B,qBAAoD,MAAM,EAAA;QAE1D,OAAO,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,kCAAkC;AAC3C,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,kBAAkB,EAAE,kBAAkB;AACzC,SAAA,CAAC;IACN;AAEA;;;;;AAKG;AACH,IAAA,OAAO,YAAY,CACf,aAA4B,EAC5B,WAAmB,aAAa,EAAA;QAEhC,OAAO,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,CAAA,+BAAA,EAAkC,QAAQ,CAAA,mDAAA,CAAqD;AACxG,YAAA,WAAW,EAAE,OAAO;AACpB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,kBAAkB,EAAE,MAAM;AAC7B,SAAA,CAAC;IACN;AAEA;;;;;AAKG;AACH,IAAA,OAAO,aAAa,CAChB,aAA4B,EAC5B,WAAmB,WAAW,EAAA;QAE9B,OAAO,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,CAAA,gCAAA,EAAmC,QAAQ,CAAA,+BAAA,CAAiC;AACrF,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,gBAAgB;AACzB,SAAA,CAAC;IACN;AAEA;;;;;AAKG;AACH,IAAA,OAAO,eAAe,CAClB,aAA4B,EAC5B,WAAmB,WAAW,EAAA;QAE9B,OAAO,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,CAAA,+BAAA,EAAkC,QAAQ,CAAA,+BAAA,CAAiC;AACpF,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,cAAc;AACvB,SAAA,CAAC;IACN;AAEA;;;;AAIG;IACH,OAAO,qBAAqB,CAAC,aAA4B,EAAA;QACrD,OAAO,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,OAAO,EAAE,kEAAkE;AAC3E,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,UAAU,EAAE,cAAc;AAC1B,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,SAAS;AAClB,SAAA,CAAC;IACN;AACH;;MCvFY,2BAA2B,CAAA;AAPxC,IAAA,WAAA,GAAA;QASa,IAAA,CAAA,UAAU,GAAG,KAAK;AACjB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAC9C,IAAA;+GAJY,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfxC,0hDAgCM,EAAA,MAAA,EAAA,CAAA,k5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrBQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAU,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI/E,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,0hDAAA,EAAA,MAAA,EAAA,CAAA,k5BAAA,CAAA,EAAA;;sBAKxF;;sBACA;;sBACA;;;MELQ,QAAQ,CAAA;IAOnB,WAAA,CACqC,IAAS,EACpC,WAAgC,EAAA;QADL,IAAA,CAAA,IAAI,GAAJ,IAAI;QAC/B,IAAA,CAAA,WAAW,GAAX,WAAW;;;QALd,IAAA,CAAA,OAAO,GAAkB,IAAI;QAC7B,IAAA,CAAA,IAAI,GAAkB,OAAO;IAKhC;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO;IACvC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;IAC5B;AAEA,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA;AACE,gBAAA,OAAO,MAAM;;IAEnB;AAlCW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAQ,kBAQT,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAAb,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AARjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbrB,wTAOA,EAAA,MAAA,EAAA,CAAA,i7DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,aAAa,mLAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE1B,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,wTAAA,EAAA,MAAA,EAAA,CAAA,i7DAAA,CAAA,EAAA;;0BAUnC,MAAM;2BAAC,kBAAkB;;;MENjB,eAAe,CAAA;;AAG1B,IAAA,WAAA,CAAoB,QAAqB,EAAA;QAArB,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAC1B,QAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1B;;AAGQ,IAAA,IAAI,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAmB,EAAA;AACjE,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AACxC,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACvB,YAAA,kBAAkB,EAAE,KAAK;AACzB,YAAA,gBAAgB,EAAE,QAAQ;AAC1B,YAAA,UAAU,EAAE,CAAC,CAAA,SAAA,EAAY,IAAI,EAAE;AAChC,SAAA,CAAC;IACJ;;AAGA,IAAA,OAAO,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IACzC;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;IACtC;AAEA,IAAA,KAAK,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;IACvC;AAEA,IAAA,IAAI,CAAC,OAAe,EAAE,QAAA,GAAmB,IAAI,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;IACtC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;IACzB;+GArCW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCiCY,8BAA8B,CAAA;AA2BzC,IAAA,WAAA,CACU,SAAuD,EACvD,aAA4B,EAC5B,QAAyB,EAAA;QAFzB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;;;AA3BX,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAC/C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;;;AAIzC,QAAA,IAAA,CAAA,QAAQ,GAA4B,IAAI,CAAC,KAAK,CACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAChD;QAEM,IAAA,CAAA,aAAa,GAAG,aAAa;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAG;AAChB,YAAA,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;AACnE,YAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;AACnF,YAAA,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE;AAC9F,YAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;SAChF;;AAIO,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAA,CAAA,OAAO,GAAG,KAAK;QAOrB,MAAM,CAAC,MAAK;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AACzC,YAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE;IAC/C;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,EAAE;AACxC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;;AAE/D,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC;QACpD;AAAO,aAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YAC3C,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAC7E,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACzC;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;;IAE7B;IAEA,WAAW,GAAA;;IAEX;IAEA,OAAO,GAAA;AACL,QAAA,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,KAAI;YACnE,IAAI,SAAS,EAAE;;AAEb,gBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,EAAE;;AAExC,oBAAA,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE;;AAEtC,oBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7E;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,KAAgC,EAAA;QAC1C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK;IACxC;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,GAAG,QAAQ;IAC9C;AAEA,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AACtE,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;IACF;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa;AAAE,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;AAC7E,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;AACzE,QAAA,OAAO,KAAK;IACd;IAEA,qBAAqB,GAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,UAAU;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU;AACxC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC7D;IAEA,qBAAqB,GAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,kBAAkB;AACnE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB;AAChD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC7D;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;IAC5C;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE;IAChD;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;IAC5C;;AAIA,IAAA,MAAM,gBAAgB,GAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;QACjD,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACjD;IAEA,gBAAgB,GAAA;AACd,QAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;;IAE9C;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B;IAEA,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;;IAEpC;+GA7IW,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAc,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/C3C,kpEAsDM,EAAA,MAAA,EAAA,CAAA,ojGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,mLACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,2BAA2B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,qBAAqB,8DACrB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKd,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAvB1C,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,oBAAoB;wBACpB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,gBAAgB;wBAChB,2BAA2B;wBAC3B,2BAA2B;wBAC3B,qBAAqB;wBACrB,uBAAuB;AACxB,qBAAA,EAAA,QAAA,EAAA,kpEAAA,EAAA,MAAA,EAAA,CAAA,ojGAAA,CAAA,EAAA;;;MEiBU,mBAAmB,CAAA;IAmE9B,WAAA,CACU,MAAiB,EACjB,UAAsB,EAAA;QADtB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;;AAnEpB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAC3B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,wDAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,IAAI,uDAAC;AACzB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAY,EAAE,oDAAC;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;AAC1B,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAW,EAAE,6DAAC;AACvC,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAW,EAAE,8DAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,oDAAC;AACpB,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAA2B,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,4DAAC;AACrF,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,wDAAC;AACzC,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,KAAK,+DAAC;AAClC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAC,KAAK,gEAAC;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAmB,EAAE,wDAAC;AAC1C,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,MAAM,+DAAC;;AAGnC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;AAC1B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,qDAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,uDAAC;AACxC,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAC,KAAK,6DAAC;AAChC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;AAC9B,QAAA,IAAA,CAAA,qBAAqB,GAAG,KAAK,CAAC,KAAK,iEAAC;AACpC,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAgB,IAAI,+DAAC;QAChD,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AACrD,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,KAAK,uDAAC;;QAG1B,IAAA,CAAA,UAAU,GAAG,MAAM,EAAQ;QAC3B,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;QACjC,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAQ;QACrC,IAAA,CAAA,YAAY,GAAG,MAAM,EAAQ;QAC7B,IAAA,CAAA,eAAe,GAAG,MAAM,EAAU;QAClC,IAAA,CAAA,IAAI,GAAG,MAAM,EAAU;QACvB,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAAQ;QAClC,IAAA,CAAA,SAAS,GAAG,MAAM,EAAQ;QAC1B,IAAA,CAAA,eAAe,GAAG,MAAM,EAAkB;QAC1C,IAAA,CAAA,cAAc,GAAG,MAAM,EAAU;QACjC,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAQ;QACjC,IAAA,CAAA,eAAe,GAAG,MAAM,EAAQ;QAChC,IAAA,CAAA,cAAc,GAAG,MAAM,EAA2C;QAClE,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAAQ;;QAGlC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAgB;QACpC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;AAEhB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;;AAG/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;AAGjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;AAE7B,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC7B,YAAA,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAClF,QAAA,CAAC,mDAAC;AAEK,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC/B,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpF,QAAA,CAAC,qDAAC;;QAOA,IAAI,UAAU,GAAG,IAAI;QACrB,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;AAC5C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;YAEpC,IAAI,UAAU,EAAE;gBACd,SAAS,CAAC,MAAK;oBACb,UAAU,GAAG,KAAK;AACpB,gBAAA,CAAC,CAAC;gBACF;YACF;;AAGA,YAAA,IAAI,aAAa,IAAI,SAAS,EAAE;AAC9B,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B;iBAAO;;;AAGL,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;AACF,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;IACH;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;IAClC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAmB,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAC/C,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,8BAA8B;AAC3C,SAAA,CAAC;IACJ;AAEA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,MAAM,CAAC,IAAY,EAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACtB;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,OAAuB,EAAA;AACvC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,gBAAgB,CAAC,SAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACrC;AAEA,IAAA,gBAAgB,CAAC,KAA8C,EAAA;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;;AAGnD,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI;;;QAG9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC;AAClD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;;AAG/B,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAC/D;IAEA,QAAQ,GAAA;;QAGN,IAAI,CAAC,WAAW,CAAC;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEjC,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,WAAW,KAAK;+GAzML,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAb,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5DhC,ghJA+FW,EAAA,MAAA,EAAA,CAAA,8xEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrDP,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,KAAK,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,8BACX,eAAe,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKN,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAtB/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,KAAK;wBACL,oBAAoB;wBACpB,qBAAqB;wBACrB,wBAAwB;wBACxB,wBAAwB;wBACxB,2BAA2B;wBAC3B,mBAAmB;wBACnB,kBAAkB;wBAClB,mBAAmB;wBACnB,WAAW;wBACX,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,ghJAAA,EAAA,MAAA,EAAA,CAAA,8xEAAA,CAAA,EAAA;;;MElDU,mBAAmB,CAAA;IAW9B,WAAA,CACU,EAAc,EACd,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAZV,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,kBAAkB,GAKf,IAAI;QAEN,IAAA,CAAA,gBAAgB,GAAW,cAAc;IAK9C;IAEG,MAAM,GAAA;AACX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3E,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,kBAAkB,GAAG;AACxB,gBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK;AAC3B,gBAAA,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;AAC7B,gBAAA,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;AACzB,gBAAA,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG;aACxB;AAED,YAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACzB,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;AAC1B,YAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;AACxB,YAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;AACvB,YAAA,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAE7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AAEzB,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;gBACpD,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM;gBACtD,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI;gBAClD,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG;gBAChD,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YAChC;QACF;IACF;IAEO,kBAAkB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY;IAC1B;+GAlDW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAUE;;;MCLU,cAAc,CAAA;IACzB,WAAA,CACU,IAAgB,EACQ,MAAqB,EAAA;QAD7C,IAAA,CAAA,IAAI,GAAJ,IAAI;QACoB,IAAA,CAAA,MAAM,GAAN,MAAM;IACpC;AAEJ;;;AAGG;AACH,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;QAE9C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC;AAC3D,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,UAAU,CAAC,CAAC;YAEpF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrC,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;YAEA,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC;QAAE,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,UAAU,EAAE,KAAK,CAAC;AAChF,YAAA,OAAO,SAAS;QAClB;IACF;AA9BW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,8CAGf,cAAc,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAHb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAII,MAAM;2BAAC,cAAc;;;AC0B1B;;;AAGG;MAUU,gBAAgB,CAAA;;AAuF3B,IAAA,IAAW,UAAU,GAAA;QACnB,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,UAAU,IAAI,KAAK;IACzD;AAEA,IAAA,IAAW,YAAY,GAAA;QACrB,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,YAAY,IAAI,KAAK;IAC3D;IAkBA,WAAA,CACU,UAAsB,EACtB,QAAmB,EACnB,aAA4B,EAC5B,eAAgC,EAChC,WAA+B,EAC/B,OAA2B,EAC3B,YAA0B,EAC1B,WAAwB,EACxB,WAAwB,EACxB,sBAA8C,EAC9C,cAA8B,EAC9B,aAAmC,EAAA;QAXnC,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,sBAAsB,GAAtB,sBAAsB;QACtB,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,aAAa,GAAb,aAAa;;AAtEhB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AACpC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;;AAK5B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAY,EAAE,oDAAC;AAChC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAO3B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAmB,EAAE,wDAAC;AAC3C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;AAC9B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,yDAAC;AAC7B,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,6DAAC;AACjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAgB,IAAI,+DAAC;;AAGjD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAU,KAAK,2DAAC;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AACvC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAgB,IAAI,uDAAC;AAExC,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,OAAO,EAAQ;AAe9C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAS,MAAM,oDAAC;AACjC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAW,kBAAkB,8DAAC;AACzD,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAW,iBAAiB,6DAAC;AACvD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAS,IAAI,4DAAC;;QAGrC,IAAA,CAAA,YAAY,GAAG,YAAY;;QAyBlC,MAAM,CAAC,MAAK;YACV,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AACnD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;YAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;;YAGzC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC9C,IAAI,WAAW,EAAE;;AAEf,gBAAA,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;AAC3J,gBAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrE,gBAAA,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAC;YACrD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAE5C,IAAI,CAAC,iBAAiB,EAAE;;;AAKxB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;YAErB,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;QAChE;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,CAAC;QACtD;;QAGA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC9C,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9E;;AAGA,QAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE;;QAG3C,IAAI,CAAC,WAAW,CAAC;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAC5C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,CAAC;QACtD;QAEA,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,CAAC;QACtD;QAEA,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC5D,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,kBAAkB,CAAC;QACpE;QAEA,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;YAC5C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC;QACpD;IACF;IAEA,iBAAiB,GAAA;;QAEf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU;QACzC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;;QAG3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;AAC/C,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,IAAI,IAAI,wDAAC;QAChF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;QAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;QACnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;QACnD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;;;;QAK/D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;;;AAG/C,QAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,WAAW,IAAI,KAAK,6DAAC;;QAGzF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC3D;IAEQ,YAAY,GAAA;;;QAGlB,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC9C,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9E;;QAGA,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,cAAc,EAAE;;AAGrB,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;AAGlC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;AAExB,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;QAC9B;IACF;;AAGA,IAAA,OAAO,CAAC,KAAmB,EAAA;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;IAC/B;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,kCAAkC;AAC3C,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA,CAAC,CAAC,SAAS,CAAC,SAAS,IAAG;AACvB,YAAA,IAAI,SAAS;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AAC1C,QAAA,CAAC,CAAC;IACJ;;IAIA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;IAC3B;IAEA,MAAM,WAAW,CAAC,IAAY,EAAA;AAC5B,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;;;AAGjE,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IACpC;IAEA,SAAS,GAAA;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;IAClC;IAEA,iBAAiB,GAAA;;QAEf,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;;IAIA,oBAAoB,GAAA;QAClB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtD,IAAI,SAAS,EAAE;;YAEb,IAAI,CAAC,gBAAgB,EAAE;QACzB;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;IACrC;AAEA,IAAA,eAAe,CAAC,OAAuB,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YACxB;QACF;QACA,MAAM,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,OAAO,CAAC,WAAW,CAAA,uBAAA,CAAyB,CAAC;QAC9E,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC;AACrD,QAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;IACpC;IAEA,MAAM,aAAa,CAAC,SAAiB,EAAA;AACnC,QAAA,MAAM,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAA,CAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;AAEjD,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;;AAElE,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;QAGlC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;AACzD,QAAA,IAAI,aAAa,EAAE,WAAW,KAAK,SAAS,EAAE;AAC5C,YAAA,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC;AAC9D,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;QACpC;;;;;;;;;;;IAaF;AAEA,IAAA,MAAM,iBAAiB,GAAA;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;QACjD,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;;;;;;IAOlC;IAEA,MAAM,aAAa,CAAC,KAA8C,EAAA;AAChE,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,KAAK,CAAC,SAAS,CAAA,IAAA,EAAO,KAAK,CAAC,QAAQ,CAAA,CAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CACtD,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,QAAQ,EAAE,CAClB;QACD,IAAI,MAAM,EAAE;;YAEV,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;YACzD,IAAI,aAAa,EAAE,WAAW,KAAK,KAAK,CAAC,SAAS,EAAE;AAClD,gBAAA,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ;YACtC;QACF;IACF;AAEQ,IAAA,MAAM,gBAAgB,GAAA;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;AACjD,QAAA,MAAM,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAA,CAAE,CAAC;;QAE9D,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxD;AAEA;;AAEG;AACH,IAAA,MAAM,eAAe,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;AACjD,QAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAA,CAAE,CAAC;;QAExD,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC5D;AAEA;;AAEG;AACH,IAAA,MAAM,cAAc,GAAA;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE;AACjD,QAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAA,CAAE,CAAC;AACtD,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;AAElC,QAAA,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD;;IAIA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAClE,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;YAExC,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,cAAc,EAAE;YACvB;QACF;IACF;;;IAKA,gBAAgB,CAAC,KAAa,EAAE,IAAS,EAAA;QACvC,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE;IACpC;AAEA;;AAEG;IACI,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;;;;;;;;;;;;QAetD,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC;IAClD;IAEA,aAAa,GAAA;QACX,OAAO,YAAY,CAAC,UAAU;IAChC;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC;AAC7C,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;;AAGvC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;+GAhdW,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAY,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4GhB,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,UAAU,mEACvC,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjKhC,0jEA4BK,EAAA,MAAA,EAAA,CAAA,+98KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDkBO,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,4xBAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAM1E,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAT5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,iBAGvE,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0jEAAA,EAAA,MAAA,EAAA,CAAA,+98KAAA,CAAA,EAAA;;sBAc9C;;sBAaA;;sBAYA;;sBAaA;;sBA0DA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBACnD,SAAS;uBAAC,mBAAmB;;;AE9JhC;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,SAAkC,EAAA;IACnE,OAAO;AACH,QAAA,GAAG,sBAAsB;AACzB,QAAA,GAAG,SAAS;KACf;AACL;;MCEa,eAAe,CAAA;AAC1B,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAA,CAAA,WAAW,GAAX,WAAW;IAAgB;IAE/C,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAEvC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9BC,YAAU,CAAC,CAAC,KAAK,KAAI;YACnB,IACE,KAAK,YAAY,iBAAiB;gBAClC,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EACxC;AACA,gBAAA,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC;;AAGlE,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CACzCC,WAAS,CAAC,CAAC,MAAM,KAAI;AACnB,oBAAA,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE;AACzB,wBAAA,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC;AAC/D,wBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,wBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;oBAChC;AAEA,oBAAA,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC;oBAClE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC7C,gBAAA,CAAC,CAAC,EACFD,YAAU,CAAC,CAAC,UAAU,KAAI;AACxB,oBAAA,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,UAAU,CAAC;AAC3D,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,oBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC,CAAC,CAAC,CACH;YACH;AAEA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,aAAa,CAAC,GAAqB,EAAA;QACzC,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;QAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;AAC/C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;QAEtB,OAAO,GAAG,CAAC,KAAK,CAAC;AACf,YAAA,UAAU,EAAE;gBACV,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE;AACjC,aAAA;AACF,SAAA,CAAC;IACJ;+GAnDW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAE,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACPD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDG;AACG,SAAU,cAAc,CAAC,MAAA,GAAiC,EAAE,EAAA;AAChE,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC;AACvC,SAAA;QACD,oBAAoB;;QAGpB,MAAM;AACN,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,CAAC,MAAM,CAAC;AACd,YAAA,UAAU,EAAE,CAAC,MAAc,KAAK,MAAK;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;AACF,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA;AACF,KAAA,CAAC;AACJ;;ACjFA;;;;;AAKG;AAEH;;ACPA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"adzen-doohbot.mjs","sources":["../../../src/lib/const/doohbot-constant.ts","../../../src/lib/predefined_messages.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../src/lib/app/chat/components/chat-button/chat-button.component.html","../../../src/lib/shared/chips/chips.component.ts","../../../src/lib/shared/chips/chips.component.html","../../../src/lib/const/utf8.ts","../../../src/lib/shared/utils/typewriter.ts","../../../src/lib/core/services/markdown.service.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.ts","../../../src/lib/app/chat/components/chat-message/chat-message.component.html","../../../src/lib/app/chat/components/message-list/message-list.component.ts","../../../src/lib/app/chat/components/message-list/message-list.component.html","../../../src/lib/app/chat/components/message-input/message-input.component.ts","../../../src/lib/app/chat/components/message-input/message-input.component.html","../../../src/lib/shared/dialog/dialog.component.ts","../../../src/lib/shared/dialog/dialog.component.html","../../../src/lib/shared/input-dialog/input-dialog.component.ts","../../../src/lib/shared/input-dialog/input-dialog.component.html","../../../src/lib/shared/dialog/dialog.service.ts","../../../src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts","../../../src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html","../../../src/lib/shared/snackbar/snackbar.utils.ts","../../../src/lib/core/config/doohbot-config.default.ts","../../../src/lib/core/config/doohbot-config.token.ts","../../../src/lib/core/config/doohbot-config.service.ts","../../../src/lib/core/utils/logger.service.ts","../../../src/lib/core/http/http.service.ts","../../../src/lib/core/environments/environment.ts","../../../src/lib/core/auth/storage.service.ts","../../../src/lib/core/auth/auth.service.ts","../../../src/lib/core/directives/draggable/draggable-dialog.directive.ts","../../../src/lib/core/directives/resizable/resizable-dialog.directive.ts","../../../src/lib/app/personalization/personalization.service.ts","../../../src/lib/core/services/theme.service.ts","../../../src/lib/core/http/http-stream.service.ts","../../../src/lib/app/chat/services/chat-api.service.ts","../../../src/lib/app/chat/services/chat-history.service.ts","../../../src/lib/core/models/doohbot-config.model.ts","../../../src/lib/app/chat/chat-ui-state.service.ts","../../../src/lib/app/chat/chat.service.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.ts","../../../src/lib/app/chat/components/chat-header/chat-header.component.html","../../../src/lib/app/login/login-form.component.ts","../../../src/lib/app/login/login-form.component.html","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.ts","../../../src/lib/app/chat/components/chat-footer/chat-footer.component.html","../../../src/lib/const/html-entities.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.ts","../../../src/lib/app/personalization/sections/preferences/preferences-section.component.html","../../../src/lib/app/personalization/sections/terms/terms-section.component.ts","../../../src/lib/app/personalization/sections/terms/terms-section.component.html","../../../src/lib/app/personalization/sections/account/account-section.component.ts","../../../src/lib/app/personalization/sections/account/account-section.component.html","../../../src/lib/shared/dialog/dialog.utils.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.ts","../../../src/lib/app/personalization/sections/instruction/instruction-section.component.html","../../../src/lib/shared/snackbar/snackbar.component.ts","../../../src/lib/shared/snackbar/snackbar.component.html","../../../src/lib/shared/snackbar/snackbar.service.ts","../../../src/lib/app/personalization/personalization-dialog.component.ts","../../../src/lib/app/personalization/personalization-dialog.component.html","../../../src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../src/lib/app/chat/components/chat-window/chat-window.component.html","../../../src/lib/core/directives/fullscreen/fullscreen.directive.ts","../../../src/lib/core/services/license.service.ts","../../../src/lib/doohbot.component.ts","../../../src/lib/doohbot.component.html","../../../src/lib/core/config/doohbot-config.resolver.ts","../../../src/lib/core/interceptors/auth.interceptor.ts","../../../src/lib/doohbot.providers.ts","../../../src/public-api.ts","../../../src/adzen-doohbot.ts"],"sourcesContent":["export const doohbotConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // Application Constants Text\r\n appTitle: 'DoohBot',\r\n appSubtitle: 'Welcome to DoohBot',\r\n welcomeDescription:\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.',\r\n hintText: 'Please Enter Here',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n\r\n appLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n appTextLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n appHeaderLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n userAvatar:\r\n 'data:image/png;base64,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',\r\n botAvatar:\r\n 'data:image/png;base64,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',\r\n};\r\n","export const PredefinedMessages = [\r\n 'How do I create a new DOOH proposal in Doohclick?',\r\n // 'Can the buyer see internal notes I add in Doohclick?',\r\n // 'What happens after a buyer approves a proposal?',\r\n // 'Why would an SR hide the pipeline value in a proposal?',\r\n // 'Are additional services like ad formatting included in the base campaign cost?',\r\n 'How to create a proposal?',\r\n];\r\nexport const SuggestedMessages = [\r\n 'Hi! How can I help?',\r\n 'Check your activity?',\r\n 'Need account help?',\r\n 'Quick tips to start.',\r\n];\r\n","import { Component, input, output, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n //input\r\n buttonStyle = input<'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom'>('fab');\r\n isChatOpen = input(false);\r\n unreadCount = input<number>(0);\r\n\r\n //output \r\n toggle = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isSidebar = computed(() => {\r\n return this.buttonStyle().startsWith('sidebar');\r\n });\r\n\r\n sidebarPosition = computed((): 'top' | 'center' | 'bottom' => {\r\n if (!this.isSidebar()) return 'center';\r\n if (this.buttonStyle() === 'sidebar') return 'center';\r\n return this.buttonStyle().split('-')[1] as 'top' | 'center' | 'bottom';\r\n });\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n@if (buttonStyle() === 'fab' && !isChatOpen()) {\r\n<button class=\"chat-fab\" (click)=\"onToggle()\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"doohbotConst.appLogo\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n</button>\r\n}\r\n\r\n<!-- sidebar button -->\r\n@if (isSidebar() && !isChatOpen()) {\r\n<button class=\"chat-sidebar\" (click)=\"onToggle()\" [ngClass]=\"sidebarPosition()\">\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"doohbotConst.appTextLogo\" />\r\n\r\n @if (unreadCount() > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount() > 9 ? '9+' : unreadCount() }}\r\n </span>\r\n }\r\n</button>\r\n}","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","export const AppEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import { signal } from '@angular/core';\r\n\r\nexport class Typewriter {\r\n private buffer = signal('');\r\n private queue = '';\r\n private typing = signal(false);\r\n private rafId: number | null = null;\r\n private lastTime = 0;\r\n\r\n constructor(private config: { msPerChar?: number } = {}) { }\r\n\r\n append(text: string) {\r\n if (!text) return;\r\n this.queue += text;\r\n if (!this.typing()) this.start();\r\n }\r\n\r\n private start() {\r\n this.typing.set(true);\r\n const msPerChar = this.config.msPerChar ?? 20;\r\n\r\n const tick = (time: number) => {\r\n if (!this.lastTime) this.lastTime = time;\r\n\r\n const delta = time - this.lastTime;\r\n const charsToAdd = Math.floor(delta / msPerChar);\r\n\r\n if (charsToAdd > 0 && this.queue.length) {\r\n const slice = this.queue.slice(0, charsToAdd);\r\n this.queue = this.queue.slice(charsToAdd);\r\n this.buffer.update(v => v + slice);\r\n this.lastTime = time;\r\n }\r\n\r\n if (!this.queue.length) {\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n this.rafId = null;\r\n return;\r\n }\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.rafId = requestAnimationFrame(tick);\r\n }\r\n\r\n displayedText() {\r\n return this.buffer();\r\n }\r\n\r\n isTyping = this.typing;\r\n\r\n reset() {\r\n this.queue = '';\r\n this.buffer.set('');\r\n this.typing.set(false);\r\n this.lastTime = 0;\r\n if (this.rafId) cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport MarkdownIt from 'markdown-it';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MarkdownService {\r\n private md = new MarkdownIt({\r\n html: false, // Disable HTML tags for security\r\n linkify: true, // Auto-convert URLs to links\r\n typographer: true, // Smart quotes, dashes, etc.\r\n breaks: true, // ✅ Convert \\n to <br> (CRITICAL for line breaks)\r\n xhtmlOut: true, // Use XHTML-compatible output\r\n });\r\n\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n convert(markdown: string): SafeHtml {\r\n if (!markdown || markdown.trim() === '') {\r\n return '';\r\n }\r\n\r\n try {\r\n // marked.parse() is synchronous by default\r\n const html = this.md.render(markdown);\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n } catch (error) {\r\n console.error('Markdown parsing error:', error);\r\n return this.sanitizer.bypassSecurityTrustHtml(\r\n markdown.replace(/</g, '<').replace(/>/g, '>'),\r\n );\r\n }\r\n }\r\n}\r\n","import {\r\n Component, input, output, computed, effect\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { MarkdownService } from '../../../../core/services/markdown.service';\r\nimport { Typewriter } from '../../../../shared/utils/typewriter';\r\n\r\n@Component({\r\n selector: 'app-chat-message',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-message.component.html',\r\n styleUrls: ['./chat-message.component.scss']\r\n})\r\nexport class ChatMessageComponent {\r\n message = input.required<Message>();\r\n doohbotConst = input.required<any>();\r\n appEmoji = input<any>();\r\n\r\n copyMessage = output<Message>();\r\n\r\n private typewriter = new Typewriter({ msPerChar: 4 }); //! speed of typing\r\n private lastLength = 0;\r\n\r\n isTyping = this.typewriter.isTyping;\r\n\r\n displayHtml = computed(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender === 'user') return '';\r\n\r\n if (msg.completed || msg.isHistory) {\r\n return msg.textHtml || this.markdownService.convert(msg.text);\r\n }\r\n\r\n return this.markdownService.convert(this.typewriter.displayedText());\r\n });\r\n\r\n constructor(private markdownService: MarkdownService) {\r\n effect(() => {\r\n const msg = this.message();\r\n\r\n if (msg.sender !== 'model' || msg.isHistory) return;\r\n\r\n const text = msg.text ?? '';\r\n\r\n if (text.length > this.lastLength) {\r\n const delta = text.slice(this.lastLength);\r\n this.lastLength = text.length;\r\n this.typewriter.append(delta);\r\n }\r\n\r\n if (msg.completed) {\r\n this.lastLength = text.length;\r\n // this.typewriter.finish();\r\n }\r\n });\r\n }\r\n\r\n onCopy() {\r\n this.copyMessage.emit(this.message());\r\n }\r\n}\r\n","<div class=\"message\" [class.user]=\"message().sender === 'user'\" [class.assistant]=\"message().sender === 'model'\"\r\n [class.streaming]=\"!message().completed && message().sender === 'model'\">\r\n\r\n <!-- Message Bubble -->\r\n <div class=\"message-content\">\r\n <!-- User chat bubble -->\r\n @if (message().sender === 'user') {\r\n <div class=\"user-message-wrapper\">\r\n <div class=\"user\">\r\n <span>{{ message().text }}</span>\r\n </div>\r\n <button class=\"action-btn copy-btn user-copy\" (click)=\"onCopy()\" title=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Assistant chat bubble -->\r\n @if (message().sender === 'model') {\r\n <div class=\"assistant\">\r\n <!-- Content (Typewriter or Static) -->\r\n <!-- We use [innerHTML] for both typing and static states now, powered by displayHtml computed signal -->\r\n @if (message().text || message().textHtml) {\r\n <span class=\"markdown-content\" [innerHTML]=\"displayHtml()\"></span>\r\n }\r\n\r\n <!-- Loading state (no content yet) -->\r\n @if (!message().completed && (!message().text || message().text === '')) {\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n }\r\n\r\n <!-- Message Footer (only when completed) -->\r\n @if (message().completed) {\r\n <div class=\"message-footer\">\r\n <p class=\"footer-text\">This chat uses AI-generated content. Verify critical information.</p>\r\n <div class=\"message-actions\">\r\n <button class=\"action-btn copy-btn\" (click)=\"onCopy()\" title=\"Copy message\">\r\n <mat-icon>{{ message().copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n <button class=\"action-btn more-btn\" title=\"More actions\">\r\n <mat-icon>more_horiz</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Avatar (User on Right) -->\r\n @if (message().sender === 'user') {\r\n <div class=\"avatar-container\">\r\n <img class=\"user-avatar\" [src]=\"doohbotConst().userAvatar\" alt=\"User Avatar\" />\r\n </div>\r\n }\r\n</div>","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n input,\r\n OnDestroy,\r\n output,\r\n TrackByFunction,\r\n ViewChild,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { AppEmoji } from '../../../../const/utf8';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips, MatIconModule, ChatMessageComponent],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n //inputs\r\n messages = input<Message[]>([]);\r\n isBotTyping = input(false);\r\n isStreaming = input(true);\r\n predefinedMessages = input<string[]>([]);\r\n userName = input('');\r\n isAuthenticated = input(false);\r\n isLoggingIn = input(false);\r\n trackByMessageId = input<TrackByFunction<Message>>((index, item) => item.id ?? index);\r\n\r\n //outputs\r\n suggestionClick = output<string>();\r\n loginClick = output<void>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n //const\r\n appEmoji = AppEmoji;\r\n readonly doohbotConst = doohbotConst;\r\n\r\n isNearBottom: boolean = true;\r\n private readonly SCROLL_TOLERANCE = 20; // Increased tolerance for better stickiness\r\n\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => {\r\n // PROACTIVE SCROLLING:\r\n // While bot is typing or responding, we want to stay at the bottom.\r\n // We only skip if the user has scrolled up significantly (beyond tolerance).\r\n if (this.isNearBottom) {\r\n this.scrollToBottom('auto');\r\n }\r\n });\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true,\r\n });\r\n\r\n // Initial scroll\r\n // setTimeout(() => this.scrollToBottom('auto'), 200);\r\n }\r\n\r\n onScroll(): void {\r\n if (!this.chatMessagesContainer) return;\r\n const element = this.chatMessagesContainer.nativeElement;\r\n\r\n // Check if we are at the bottom within tolerance.\r\n // If bot is typing, we increase tolerance to make it harder to 'lose' the stickiness.\r\n const tolerance = this.isBotTyping() ? this.SCROLL_TOLERANCE * 2 : this.SCROLL_TOLERANCE;\r\n\r\n const atBottom =\r\n element.scrollHeight - element.scrollTop - element.clientHeight <=\r\n tolerance;\r\n\r\n this.isNearBottom = atBottom;\r\n }\r\n\r\n scrollToBottom(behavior: ScrollBehavior = 'smooth'): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: behavior,\r\n });\r\n // If artificially scrolling, assume we are at bottom\r\n if (behavior === 'auto') {\r\n this.isNearBottom = true;\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n copyMessage(message: Message): void {\r\n if (!message.text) return;\r\n\r\n navigator.clipboard.writeText(message.text).then(() => {\r\n // Logger.info('Copied to clipboard');\r\n // SnackbarUtils.info('Copied to clipboard');\r\n\r\n message.copied = true;\r\n this.cdr.markForCheck(); // force UI update\r\n\r\n setTimeout(() => {\r\n message.copied = false;\r\n this.cdr.markForCheck(); // update again\r\n }, 800);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\" (scroll)=\"onScroll()\">\r\n <!-- Welcome Screen -->\r\n @if (messages().length === 0 && !isBotTyping()) {\r\n <div class=\"welcome-screen\">\r\n <img [src]=\"doohbotConst.appLogo\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n @if (userName() && isAuthenticated()) {\r\n <div class=\"marquee-container\">\r\n <h2 class=\"welcome-greeting marquee-text\">\r\n Hi, {{ userName() }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n }\r\n\r\n <h3>{{ doohbotConst.appSubtitle }}</h3>\r\n <p>{{ doohbotConst.welcomeDescription }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n @if (isAuthenticated()) {\r\n <app-chips [messages]=\"predefinedMessages()\" [disabled]=\"isBotTyping()\"\r\n (chipClick)=\"onPredefinedClick($event)\"></app-chips>\r\n }\r\n\r\n @if (!isAuthenticated()) {\r\n <div class=\"auth-buttons-container\" style=\"margin-top: 20px\">\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" [disabled]=\"isLoggingIn()\">\r\n {{ isLoggingIn() ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Chat Messages -->\r\n <app-chat-message *ngFor=\"let message of messages(); trackBy: trackByMessageId()\" [message]=\"message\"\r\n [doohbotConst]=\"doohbotConst\" [appEmoji]=\"appEmoji\" (copyMessage)=\"copyMessage($event)\">\r\n </app-chat-message>\r\n\r\n <!-- Standalone Typing Indicator (Fallback if no message added yet) -->\r\n @if (isBotTyping() && messages()[messages().length - 1]?.sender !== 'model') {\r\n <div class=\"message assistant\">\r\n <!-- <div class=\"avatar-container\">\r\n <img class=\"assistant-avatar\" [src]=\"doohbotConst.botAvatar\" alt=\"Bot Avatar\" />\r\n </div> -->\r\n <div class=\"message-content\">\r\n <div class=\"assistant\">\r\n <div class=\"typing-indicator\">\r\n <span class=\"thinking-text\">Thinking</span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n\r\n <!-- Scroll to Bottom Button -->\r\n @if (!isNearBottom) {\r\n <button class=\"scroll-bottom-btn\" (click)=\"scrollToBottom('smooth')\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n }\r\n</div>","import { Component, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n //input\r\n isBotTyping = input(false);\r\n\r\n //output\r\n send = output<string>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping()\" (keydown.enter)=\"\r\n !isBotTyping() && onSend(messageInput.value); !isBotTyping() && (messageInput.value = '')\r\n \" [placeholder]=\"doohbotConst.hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping()\" (click)=\"\r\n onSend(messageInput.value);\r\n messageInput.value = ''\r\n \">\r\n <mat-icon [class.disabled-icon]=\"isBotTyping()\">send</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface DialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n icon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule],\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss'],\r\n})\r\nexport class DialogComponent {\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n ) {\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Confirm';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'warn';\r\n this.data.icon = this.data.icon || 'warning';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <mat-icon class=\"dialog-icon\" [class.warn-icon]=\"data.confirmButtonColor === 'warn'\">\r\n {{ data.icon }}\r\n </mat-icon>\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\"\r\n (click)=\"onConfirm()\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface InputDialogData {\r\n title: string;\r\n message: string;\r\n initialValue: string;\r\n placeholder?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n}\r\n\r\n@Component({\r\n selector: 'app-input-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, FormsModule],\r\n templateUrl: './input-dialog.component.html',\r\n styleUrls: ['./input-dialog.component.scss'],\r\n})\r\nexport class InputDialogComponent {\r\n public value: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<InputDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: InputDialogData,\r\n ) {\r\n this.value = data.initialValue;\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Save';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.placeholder = this.data.placeholder || 'Enter value...';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'primary';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(null);\r\n }\r\n\r\n onConfirm(): void {\r\n if (this.value && this.value.trim()) {\r\n this.dialogRef.close(this.value.trim());\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n <div class=\"input-group\">\r\n <input type=\"text\" class=\"dialog-input\" [(ngModel)]=\"value\" [placeholder]=\"data.placeholder\"\r\n (keyup.enter)=\"onConfirm()\" focus=\"true\" />\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\">{{ data.cancelText }}</button>\r\n <button mat-flat-button class=\"confirm-btn\" [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\" [disabled]=\"!value.trim()\" (click)=\"onConfirm()\">\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { DialogComponent, DialogData } from './dialog.component';\r\nimport { InputDialogComponent, InputDialogData } from '../input-dialog/input-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DialogService {\r\n constructor(private dialog: MatDialog) { }\r\n\r\n /**\r\n * Opens a confirmation dialog with customizable options\r\n * @param data Configuration for the dialog\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n open(data: DialogData): Observable<boolean> {\r\n const dialogRef = this.dialog.open(DialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n\r\n /**\r\n * Convenience method for delete confirmation dialogs\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n confirmDelete(itemName: string = 'this item'): Observable<boolean> {\r\n return this.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Opens a dialog with an input field\r\n * @param data Configuration for the input dialog\r\n * @returns Observable that emits the input value if confirmed, null if cancelled\r\n */\r\n openInput(data: InputDialogData): Observable<string | null> {\r\n const dialogRef = this.dialog.open(InputDialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { ChatSessionDto, ChatSessionGroup } from '../../model/chat-session.model';\r\nimport { input, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-chat-history-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-history-sidebar.component.html',\r\n styleUrls: ['./chat-history-sidebar.component.scss'],\r\n})\r\nexport class ChatHistorySidebarComponent {\r\n //inputs\r\n sessions = input<ChatSessionDto[]>([]);\r\n isOpen = input(false);\r\n userName = input('User');\r\n isLoading = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMore = input(false);\r\n processingSessionId = input<string | null>(null);\r\n isFullScreen = input(false);\r\n\r\n //outputs\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n closed = output<void>();\r\n loadMore = output<void>();\r\n refresh = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAll = output<void>();\r\n\r\n // Use computed to automatically regroup when sessions change\r\n chatHistory = computed(() => {\r\n // Access signals\r\n const sessionsList = this.sessions();\r\n return this.groupSessions(sessionsList);\r\n });\r\n\r\n constructor(private dialogService: DialogService) { }\r\n\r\n\r\n // Logic extracted to stand-alone method for computed usage\r\n private groupSessions(sessions: ChatSessionDto[]): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Deduplicate sessions by ID to prevent NG0955 error\r\n // Filter out sessions without IDs (new sessions not yet persisted)\r\n const sessionsWithIds = sessions.filter(s => s.response_id !== null);\r\n const uniqueSessionsMap = new Map<string, ChatSessionDto>();\r\n sessionsWithIds.forEach(s => uniqueSessionsMap.set(s.response_id!, s));\r\n const uniqueSessions = Array.from(uniqueSessionsMap.values());\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = uniqueSessions.sort(\r\n (a, b) => new Date(b.last_message_at).getTime() - new Date(a.last_message_at).getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.last_message_at);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSessionDto): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n\r\n onEditClick(event: Event, session: ChatSessionDto): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .openInput({\r\n title: 'Rename Conversation',\r\n message: 'Enter a new title for this conversation:',\r\n initialValue: session.title,\r\n placeholder: 'New title...',\r\n confirmText: 'Rename',\r\n })\r\n .subscribe((newTitle) => {\r\n if (newTitle !== null && newTitle.trim() !== '' && newTitle !== session.title && session.response_id) {\r\n this.sessionRenamed.emit({ sessionId: session.response_id, newTitle: newTitle.trim() });\r\n }\r\n });\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n if (!sessionId) return;\r\n event.stopPropagation();\r\n this.dialogService.confirmDelete('this conversation').subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n // this.chatHistory = this.groupedSessions();\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (scrollBottom < 100 && this.hasMoreSessions() && !this.isLoadingMore() && !this.isLoading()) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n\r\n /**\r\n * Handle clear all history\r\n */\r\n onClearAllClick(): void {\r\n this.dialogService\r\n .open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n })\r\n .subscribe((confirmed: boolean | undefined) => {\r\n if (confirmed) {\r\n this.deleteAll.emit();\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen()\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\">\r\n <h3 class=\"marquee-text\">{{ userName() }}'s Chat History</h3>\r\n </div>\r\n <button class=\"refresh-btn\" (click)=\"onRefresh()\" title=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <!-- <button class=\"clear-all-btn\" (click)=\"onClearAllClick()\" title=\"Clear all history\">\r\n <mat-icon>delete_sweep</mat-icon>\r\n </button> -->\r\n\r\n @if (!isFullScreen()) {\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n @if (isLoading()) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n }\r\n\r\n @if (!isLoading() && sessions().length === 0) {\r\n <div class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n }\r\n\r\n @if (!isLoading()) {\r\n @for (group of chatHistory(); track group.label) {\r\n <div class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n @for (session of group.sessions; track session.response_id) {\r\n <div class=\"session-item\" (click)=\"onSessionClick(session)\">\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.last_message_at) }} · {{ formatDate(session.last_message_at) }}\r\n </div>\r\n </div>\r\n <div class=\"session-actions\">\r\n <button class=\"edit-btn\" [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onEditClick($event, session)\" title=\"Edit title\">\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>edit</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n <button class=\"delete-btn\" [disabled]=\"processingSessionId() === session.response_id\"\r\n (click)=\"onDeleteClick($event, session.response_id)\" title=\"Delete conversation\">\r\n @if (processingSessionId() !== session.response_id) {\r\n <mat-icon>delete</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Loading more indicator -->\r\n @if (isLoadingMore()) {\r\n <div class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { SnackbarService } from './snackbar.service';\r\n\r\n/**\r\n * Utility class for common snackbar operations\r\n * Provides reusable snackbar configurations for consistency across the application\r\n */\r\nexport class SnackbarUtils {\r\n private static service: SnackbarService | null = null;\r\n\r\n /**\r\n * Initialize the utility with a SnackbarService instance\r\n * @param service The SnackbarService instance\r\n */\r\n static init(service: SnackbarService): void {\r\n this.service = service;\r\n }\r\n\r\n /**\r\n * Show a success snackbar\r\n * @param message The message to show\r\n */\r\n static success(message: string): void {\r\n this.service?.success(message);\r\n }\r\n\r\n /**\r\n * Show an error snackbar\r\n * @param message The message to show\r\n */\r\n static error(message: string): void {\r\n this.service?.error(message);\r\n }\r\n\r\n /**\r\n * Show a warning snackbar\r\n * @param message The message to show\r\n */\r\n static warn(message: string): void {\r\n this.service?.warn(message);\r\n }\r\n\r\n /**\r\n * Show an info snackbar\r\n * @param message The message to show\r\n */\r\n static info(message: string): void {\r\n this.service?.info(message);\r\n }\r\n}\r\n","import { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Default Doohbot configuration values.\r\n * Applied when no user overrides are provided.\r\n */\r\nexport const DEFAULT_DOOHBOT_CONFIG: DoohbotConfig = {\r\n // Runtime environment\r\n environment: 'development',\r\n\r\n // License file\r\n licenseFilePath: 'assets/doohbot_license.json',\r\n\r\n // Client-side encryption key (optional, fallback will be used)\r\n storageSecret: undefined,\r\n\r\n // Chat API mode (streaming by default)\r\n useNonStreamingChat: false, // true for non-streaming, false for streaming\r\n\r\n // API integration defaults\r\n api: {\r\n baseUrl: 'https://api.doohbot.com/api/',\r\n apiKey: undefined,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n },\r\n\r\n // Theme / visual customization\r\n theme: {\r\n enableDrag: false,\r\n enableResize: false,\r\n buttonStyle: 'fab',\r\n fontFamily: 'Inter, Roboto, sans-serif',\r\n palette: 'doohbot',\r\n },\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\n\r\n/**\r\n * Injection token for Doohbot configuration.\r\n * Used to inject user-provided or default config into services.\r\n */\r\nexport const DOOHBOT_CONFIG = new InjectionToken<DoohbotConfig>('DOOHBOT_CONFIG');\r\n","import { Inject, Injectable, Optional, signal, WritableSignal, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\nimport { DOOHBOT_CONFIG } from './doohbot-config.token';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { DoohbotApiConfig } from '../models/api-config.model';\r\n\r\n\r\n/**\r\n * Centralized service for managing Doohbot configuration.\r\n * Provides reactive access and runtime updates.\r\n * Singleton via providedIn: 'root'.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DoohbotConfigService implements OnDestroy {\r\n // Use DoohbotConfig for type-safe signal\r\n private configSignal: WritableSignal<DoohbotConfig>;\r\n\r\n // Legacy Observable support\r\n private readonly configSubject: BehaviorSubject<DoohbotConfig>;\r\n public readonly config$: Observable<DoohbotConfig>;\r\n\r\n\r\n /**\r\n * Current runtime environment for Doohbot.\r\n *\r\n * Drives environment-specific behavior such as:\r\n * - API behavior\r\n * - logging verbosity\r\n * - feature toggles\r\n * - safety defaults\r\n *\r\n * This value is mandatory and always resolved during bootstrap.\r\n */\r\n readonly environment = (): DoohbotConfig['environment'] => this.configSignal().environment;\r\n\r\n /**\r\n * Path to the public license file.\r\n * Returns an empty string if not configured.\r\n */\r\n readonly licenseFilePath = (): string => this.configSignal().licenseFilePath ?? '';\r\n\r\n /**\r\n * Secret used for encrypting persisted client-side data.\r\n * If not provided, default will be used.\r\n */\r\n readonly storageSecret = (): string => this.configSignal().storageSecret ?? '';\r\n\r\n /**\r\n * Chats use the `streaming` by default.\r\n * Pass `true` to use normal http calls for chat.\r\n */\r\n readonly useNonStreamingChat = (): boolean => this.configSignal().useNonStreamingChat ?? false;\r\n\r\n /**\r\n * Full API configuration object.\r\n * Undefined if API integration is not configured.\r\n */\r\n readonly api = (): DoohbotApiConfig | undefined => this.configSignal().api;\r\n\r\n /**\r\n * Theme customization configuration.\r\n * Undefined if no theme overrides are provided.\r\n */\r\n readonly theme = (): DoohbotThemeConfig | undefined => this.configSignal().theme;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(DOOHBOT_CONFIG)\r\n injectedConfig: Partial<DoohbotConfig> = {},\r\n ) {\r\n // Merge injected config with defaults\r\n const mergedConfig: DoohbotConfig = {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...injectedConfig,\r\n };\r\n\r\n this.validateConfig(mergedConfig);\r\n\r\n // Initialize state\r\n this.configSignal = signal(mergedConfig);\r\n this.configSubject = new BehaviorSubject<DoohbotConfig>(mergedConfig);\r\n this.config$ = this.configSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Update configuration at runtime.\r\n * @param value Partial config updates\r\n */\r\n update(value: Partial<DoohbotConfig>): void {\r\n if ('environment' in value) {\r\n // TODO: If environment is truly immutable, consider using a separate EnvironmentProvider instead of burying it in config.\r\n throw new Error('environment cannot be changed at runtime');\r\n }\r\n\r\n const newConfig = { ...this.configSignal(), ...value };\r\n this.validateConfig(newConfig);\r\n\r\n this.configSignal.set(newConfig);\r\n this.configSubject.next(newConfig);\r\n }\r\n\r\n private validateConfig(config: DoohbotConfig): void {\r\n // environment\r\n if (!config.environment) {\r\n throw new Error('environment is required');\r\n }\r\n\r\n // license\r\n if (\r\n config.licenseFilePath &&\r\n typeof config.licenseFilePath !== 'string'\r\n ) {\r\n throw new Error('licenseFilePath must be a string');\r\n }\r\n\r\n // API config\r\n if (config.api) {\r\n const api = config.api;\r\n\r\n if (!api.baseUrl) {\r\n throw new Error('api.baseUrl is required when api config is provided');\r\n }\r\n\r\n if (api.retryAttempts !== undefined && api.retryAttempts < 0) {\r\n throw new Error('api.retryAttempts must be >= 0');\r\n }\r\n\r\n if (api.retryDelay !== undefined && api.retryDelay < 0) {\r\n throw new Error('api.retryDelay must be >= 0');\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubject.complete();\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { DoohbotConfigService } from \"../config/doohbot-config.service\";\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class Logger {\r\n private static instance: Logger | null = null;\r\n\r\n private prefix = '[Doohbot] ======> ';\r\n\r\n private styles = {\r\n info: 'color:#0995e6; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n };\r\n\r\n // TODO: Consider moving prefix and styles to a separate LoggerConfig or environment config to allow library consumers to customize them.\r\n constructor(private configService: DoohbotConfigService) {\r\n Logger.instance = this;\r\n }\r\n\r\n /** bind once */\r\n static init(instance: Logger): void {\r\n Logger.instance = instance;\r\n this.info('[Logger]: has been initialized!!!');\r\n }\r\n\r\n // internal guard\r\n private canLog(): boolean {\r\n return this.configService.environment() !== 'production';\r\n }\r\n\r\n // instance methods\r\n info(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return;\r\n try {\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n } catch {\r\n console.info(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return; try {\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n } catch {\r\n console.warn(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n if (!this.canLog()) return; try {\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n } catch {\r\n console.error(this.prefix, message, ...args);\r\n }\r\n }\r\n\r\n // static facade\r\n private static get logger(): Logger {\r\n if (!Logger.instance) {\r\n // TODO: This error might be too aggressive if a library consumer accidentally uses Logger before bootstrap completes. \r\n // Consider a graceful fallback or a queue-based logger.\r\n throw new Error(\r\n 'LoggerService not initialized. Instantiate LoggerService during app bootstrap.'\r\n );\r\n }\r\n return Logger.instance;\r\n }\r\n\r\n static info(message: string, ...args: unknown[]): void {\r\n Logger.logger.info(message, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: unknown[]): void {\r\n Logger.logger.warn(message, ...args);\r\n }\r\n\r\n static error(message: string, ...args: unknown[]): void {\r\n Logger.logger.error(message, ...args);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { delay, retry, map, catchError, of, firstValueFrom } from 'rxjs';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n }\r\n\r\n get apiUrl(): string {\r\n const apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n Logger.info('HttpService: Initialized apiUrl', apiBaseUrl);\r\n return apiBaseUrl;\r\n }\r\n\r\n // TODO: Return type 'Promise<any>' is too broad. Consider using Promise<ApiResponse<T>> to enforce structure throughout the app.\r\n async get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n headers?: HttpHeaders,\r\n ): Promise<any> {\r\n\r\n // Build Params\r\n const params = (nestedParam ? this.buildHttpParams({}, param, '') : param) as HttpParams;\r\n\r\n Logger.info(\"HttpService: get()\", url, params, headers);\r\n return await firstValueFrom(this.http\r\n .get(`${this.apiUrl}${url}`, {\r\n params: params,\r\n // withCredentials: true,\r\n headers,\r\n })\r\n .pipe(\r\n delay(100),\r\n retry(2),\r\n // TODO: Excessive mapping: response => response is redundant and can be removed.\r\n map((response: any) => response),\r\n catchError((error) => {\r\n // TODO: SECURITY/UX: Returning 'of(error)' converts an error into a successful resolution in the promise world.\r\n // This prevents callers from using try/catch effectively. Consider re-throwing or using an error wrapper.\r\n Logger.info(\"HttpService: get() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n // TODO: Use HttpParams.set() or HttpParams.append() instead of direct assignment to an object and casting.\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n async post(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n\r\n Logger.info(\"HttpService: post()\", url, param, headers);\r\n // TODO: param as HttpParams is likely incorrect for a POST request body which should be a JSON object. \r\n // This casting might lead to runtime errors if the backend expects application/json.\r\n return await firstValueFrom(this.http.post(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: post() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n async patch(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info(\"HttpService: patch()\", url, param, headers);\r\n return await firstValueFrom(this.http.patch(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: patch() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n async put(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n Logger.info(\"HttpService: put()\", url, param, headers);\r\n return await firstValueFrom(\r\n this.http.put(`${this.apiUrl}${url}`, param, { headers }).pipe( \r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: put() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n\r\n async delete(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Promise<any> {\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n Logger.info(\"HttpService: delete()\", url, param, headers);\r\n return await firstValueFrom(this.http.delete(`${this.apiUrl}${url}`, { body: param, headers }).pipe(\r\n delay(100),\r\n retry(2),\r\n map((response: any) => response),\r\n catchError((error) => {\r\n Logger.info(\"HttpService: delete() catchError()\", error);\r\n return of(error);\r\n }),\r\n ));\r\n }\r\n}\r\n","// environment.ts\r\nexport const environment = {\r\n production: false,\r\n storageSecret: 'RcmDfQZ0AN2Zryn3pJ+HXNX4Nr7zQ6rV0UDsrCV9Jt5XzG4TW+1R3pIYOM03h77WMaZp8XnCBEQnelwGvuk3iQ==',\r\n};\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { environment } from '../environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n// TODO\r\nexport class StorageService {\r\n private readonly storageKey = 'doohbot_storage';\r\n private readonly secretKey: string;\r\n private readonly storage: Storage;\r\n\r\n constructor(@Inject(DOOHBOT_CONFIG) config: DoohbotConfig) {\r\n // Use config override if provided, otherwise fall back to environment\r\n this.secretKey = config.storageSecret ?? environment.storageSecret ?? '';\r\n\r\n this.storage = sessionStorage.getItem(this.storageKey) ? sessionStorage : localStorage;\r\n }\r\n\r\n /**\r\n * Store a value under the given key.\r\n */\r\n set<T>(key: string, value: T): void {\r\n const payload = this.readAll();\r\n payload[key] = value;\r\n\r\n this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n }\r\n\r\n /**\r\n * Retrieve a stored value by key.\r\n */\r\n get<T>(key: string): T | null {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return null;\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) return null;\r\n\r\n try {\r\n const parsed = JSON.parse(decrypted) as Record<string, unknown>;\r\n return (parsed[key] as T) ?? null;\r\n } catch {\r\n this.clear();\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a specific key from storage.\r\n */\r\n remove(key: string): void {\r\n const payload = this.readAll();\r\n delete payload[key];\r\n\r\n this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(payload)));\r\n }\r\n\r\n /**\r\n * Clear all Doohbot-related storage.\r\n */\r\n clear(): void {\r\n localStorage.removeItem(this.storageKey);\r\n sessionStorage.removeItem(this.storageKey);\r\n }\r\n\r\n /**\r\n * Validate storage integrity without mutating it.\r\n */\r\n isValid(): boolean {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return false;\r\n\r\n return this.decrypt(data) !== null;\r\n }\r\n\r\n private readAll(): Record<string, unknown> {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return {};\r\n\r\n const decrypted = this.decrypt(data);\r\n if (!decrypted) {\r\n this.clear();\r\n return {};\r\n }\r\n\r\n try {\r\n return JSON.parse(decrypted);\r\n } catch {\r\n this.clear();\r\n return {};\r\n }\r\n }\r\n\r\n private encrypt(plainText: string): string {\r\n return CryptoJS.AES.encrypt(plainText, this.secretKey).toString();\r\n }\r\n\r\n private decrypt(cipherText: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(cipherText, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // setRememberMe(rememberMe: boolean): void {\r\n // const currentData = this.storage.getItem(this.storageKey);\r\n // const targetStorage = rememberMe ? localStorage : sessionStorage;\r\n\r\n // // If storage type is changing, move data\r\n // if (this.storage !== targetStorage) {\r\n // if (currentData) {\r\n // targetStorage.setItem(this.storageKey, currentData);\r\n // this.storage.removeItem(this.storageKey);\r\n // }\r\n // this.storage = targetStorage;\r\n // }\r\n // }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n combineLatest,\r\n filter,\r\n finalize,\r\n from,\r\n map,\r\n Observable,\r\n of,\r\n shareReplay,\r\n switchMap,\r\n take,\r\n tap,\r\n distinctUntilChanged,\r\n} from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { StorageService } from './storage.service';\r\nimport { SnackbarUtils } from './../../shared/snackbar/snackbar.utils';\r\nimport { doohbotConst } from '../../const/doohbot-constant';\r\nimport { RefreshRequest } from './models/refresh-request.model';\r\nimport { HttpService } from '../http/http.service';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n private jwtHelper = new JwtHelperService();\r\n\r\n private isRefreshing = false;\r\n private refreshTokenSubject = new BehaviorSubject<AuthResult | null>(null);\r\n\r\n private readonly isAuthenticatedSubject = new BehaviorSubject<boolean>(false);\r\n private readonly federatedAuthTokenSubject = new BehaviorSubject<string | null>(null);\r\n private readonly rememberMeSubject = new BehaviorSubject<boolean | null>(null);\r\n private readonly licenseFileSubject = new BehaviorSubject<Map<string, string> | null>(null);\r\n private readonly licenseCodeSubject = new BehaviorSubject<string | null>(null);\r\n readonly isAuthenticated$ = this.isAuthenticatedSubject\r\n .asObservable()\r\n .pipe(distinctUntilChanged());\r\n\r\n private apiBaseUrl = '';\r\n\r\n // public authStatus$ = this.authStatusSubject.asObservable();\r\n // Auth and session getters\r\n\r\n /**\r\n * True if request is an auth endpoint\r\n */\r\n isAuthUrl(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const path = requestUrl.pathname.toLowerCase();\r\n\r\n Logger.info('isAuthUrl() host:', requestUrl.host);\r\n // TODO: This logging might be too verbose for production/frequent calls. Consider reducing log level or removing.\r\n Logger.info('isAuthUrl() path:', path);\r\n\r\n return ['/auth/login', '/auth/federated/login', '/auth/refresh', '/auth/logout'].some(\r\n (authPath) => path.endsWith(authPath),\r\n );\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * True if request goes to our backend API\r\n */\r\n isInternalApiRequest(url: string): boolean {\r\n try {\r\n const requestUrl = new URL(url, window.location.origin);\r\n const apiUrl = new URL(this.apiBaseUrl);\r\n\r\n Logger.info('isInternalApiRequest() requestUrl host:', requestUrl.host);\r\n Logger.info('isInternalApiRequest() apiUrl host:', apiUrl.host);\r\n\r\n return requestUrl.host === apiUrl.host;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Sets current license file\r\n */\r\n // TODO: Consider defining these as regular methods instead of arrow functions for better stack traces and consistency, unless bound context is strictly required (which is automatic for class methods in Angular services anyway).\r\n readonly setLicenseFile = (data: Map<string, string> | null): void =>\r\n this.licenseFileSubject.next(data);\r\n\r\n /**\r\n * Gets current license file\r\n */\r\n readonly licenseFile = (): Map<string, string> | null => this.licenseFileSubject.value;\r\n\r\n /**\r\n * Sets current federated auth token\r\n */\r\n readonly setFederatedAuthToken = (token: string | null): void =>\r\n this.federatedAuthTokenSubject.next(token);\r\n\r\n /**\r\n * Gets current federated auth token\r\n */\r\n readonly federatedAuthToken = (): string | null => this.federatedAuthTokenSubject.value;\r\n\r\n /**\r\n * Sets current license code\r\n */\r\n readonly setLicenseCode = (code: string | null): void => this.licenseCodeSubject.next(code);\r\n\r\n /**\r\n * Gets current license code\r\n */\r\n readonly licenseCode = (): string | null => this.licenseCodeSubject.value;\r\n\r\n /**\r\n * Sets rememberMe\r\n */\r\n readonly setRememberMe = (value: boolean | false): void => this.rememberMeSubject.next(value);\r\n\r\n /**\r\n * Gets rememberMe\r\n */\r\n readonly rememberMe = (): boolean | false =>\r\n this.rememberMeSubject.value ?? this.getRememberMe() === 'true';\r\n\r\n /**\r\n * Gets current license key for active license code\r\n */\r\n readonly currentLicenseKey = (): string | null => {\r\n const code = this.licenseCodeSubject.value;\r\n const map = this.licenseFileSubject.value;\r\n return code && map ? (map.get(code) ?? null) : null;\r\n };\r\n\r\n /**\r\n * Resolved API base URL\r\n */\r\n readonly apiUrl = (): string => this.configService.api()?.baseUrl ?? '';\r\n\r\n /**\r\n * Logged-in user display name\r\n */\r\n readonly loggedInUserName = (): string => this.getUsername() || 'User';\r\n\r\n /**\r\n * Logged-in user avatar URL\r\n */\r\n readonly loggedInUserImageUrl = (): string | null => doohbotConst.userAvatar;\r\n\r\n /**\r\n * Logged-in user role\r\n */\r\n readonly loggedInUserRole = (): string => {\r\n const roles = this.getRoles();\r\n return Array.isArray(roles) && roles.length > 0 ? roles[0] : roles || 'User';\r\n };\r\n\r\n // State getters (Local Storage/Persistent)\r\n /**`user_id` of logged in user */\r\n readonly getUserId = (): string | null => this.storageService.get<string>('user_id');\r\n\r\n /**`username` of logged in user */\r\n readonly getUsername = (): string | null => this.storageService.get<string>('username');\r\n\r\n /**`rememberMe` of logged in user */\r\n readonly getRememberMe = (): string | null => this.storageService.get<string>('remember_me');\r\n\r\n /**`roles` of logged in user */\r\n readonly getRoles = (): string | null => this.storageService.get<string>('roles');\r\n\r\n /**`permissions` of logged in user */\r\n readonly getPermissions = (): string | null => this.storageService.get<string>('permissions');\r\n\r\n /**`organization_id` of logged in user */\r\n readonly getOrganizationId = (): string | null =>\r\n this.storageService.get<string>('organization_id');\r\n\r\n /**`company_id` of logged in user */\r\n readonly getCompanyId = (): string | null => this.storageService.get<string>('company_id');\r\n\r\n /**`office_id` of logged in user */\r\n readonly getOfficeId = (): string | null => this.storageService.get<string>('office_id');\r\n\r\n /**`access_token` of logged in user */\r\n readonly getAccessToken = (): string | null => this.storageService.get<string>('access_token');\r\n\r\n /**`refresh_token` of logged in user */\r\n readonly getRefreshToken = (): string | null => this.storageService.get<string>('refresh_token');\r\n\r\n /**\r\n * Gets if user is authenticated\r\n */\r\n readonly getIsAuthenticated = (): boolean => this.isAuthenticatedSubject.value ?? false;\r\n\r\n // UI State Signals\r\n public isLoggingIn = signal<boolean>(false);\r\n public authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n\r\n constructor(\r\n private http: HttpService,\r\n private storageService: StorageService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.apiBaseUrl = this.configService.api()?.baseUrl ?? '';\r\n }\r\n\r\n /**\r\n * Initializes the federated authentication flow.\r\n *\r\n * Validates all required prerequisites (configuration, license, tokens)\r\n * and triggers authentication only when the system is in a valid state.\r\n *\r\n * This method is idempotent and safe to call multiple times; authentication\r\n * will execute only once when all conditions are satisfied.\r\n */\r\n initFederatedAuthFlow() {\r\n combineLatest([\r\n this.federatedAuthTokenSubject,\r\n this.licenseFileSubject,\r\n this.licenseCodeSubject,\r\n ])\r\n .pipe(\r\n filter(\r\n ([federatedToken, licenseFile, licenseCode]) =>\r\n !!federatedToken && !!licenseFile && !!licenseCode,\r\n ),\r\n take(1),\r\n switchMap(() => {\r\n // Login if no accessToken\r\n const accessToken = this.getAccessToken();\r\n if (!accessToken) {\r\n const loginRequest: FederatedLoginRequest = {\r\n access_token: this.federatedAuthTokenSubject.value!,\r\n remember_me: this.rememberMeSubject.value ?? this.getRememberMe() === 'true',\r\n };\r\n\r\n Logger.info('Federated login called.', loginRequest);\r\n return from(this.federatedLogin(loginRequest));\r\n }\r\n\r\n return of(false);\r\n }),\r\n )\r\n .subscribe((success) => {\r\n if (!success) {\r\n Logger.info('Federated login failed. User can proceed with normal login.');\r\n return;\r\n }\r\n // Restores authenticated state\r\n return this.authenticate();\r\n });\r\n }\r\n\r\n /**\r\n * Restores authenticated state with all prerequisites satisfied.\r\n * Handles authentication state for normal manual login.\r\n */\r\n initNormalLoginAuthState() {\r\n combineLatest([this.licenseFileSubject, this.licenseCodeSubject])\r\n .pipe(\r\n filter(([licenseFile, licenseCode]) => !!licenseFile && !!licenseCode),\r\n take(1),\r\n switchMap(() => {\r\n Logger.info('initNormalAuthFlow() called.');\r\n return this.authenticate();\r\n }),\r\n )\r\n .subscribe();\r\n }\r\n\r\n /**\r\n * Authenticate user based on stored tokens or refresh tokens.\r\n */\r\n private authenticate(): Observable<void> {\r\n const accessToken = this.getAccessToken();\r\n\r\n //! No access token\r\n if (!accessToken) {\r\n //! For production ( Backend Validation )\r\n // TODO: Consider separating side-effects (next(false)) from the check logic.\r\n this.isAuthenticatedSubject.next(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access token valid\r\n if (!this.isTokenExpired()) {\r\n this.isAuthenticatedSubject.next(true);\r\n return of(void 0);\r\n }\r\n\r\n // Access Token expired -> try refresh\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n return of(void 0);\r\n }\r\n\r\n // Access expired but refresh token exists → attempt refresh\r\n // Attempt refresh\r\n return this.refreshLogin().pipe(\r\n tap((result) => {\r\n if (!result) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n }\r\n }),\r\n map(() => void 0),\r\n );\r\n }\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n async federatedLogin(param: FederatedLoginRequest): Promise<boolean> {\r\n Logger.info('federatedLogin()', param);\r\n this.isLoggingIn.set(true);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n\r\n try {\r\n const result = await this.federateLoginHttpHelper(param);\r\n Logger.info('federatedLogin() result', result);\r\n if (result && result.success && result.data) {\r\n // Map federated result to something AuthService can handle\r\n // Federated result: { access_token: string, remember_me: boolean }\r\n const authResult = {\r\n access_token: result.data.access_token,\r\n refresh_token: param.remember_me ? result.data.refresh_token : '',\r\n };\r\n this.setSession(authResult, param.remember_me || false);\r\n\r\n Logger.info('Federated login successful, authenticated state set to true');\r\n this.authSuccess.set('Login successful!');\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n this.authError.set('Federated login failed.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Federated login failed:', error);\r\n this.authError.set('An error occurred during federated login.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(param: LoginRequest): Promise<boolean> {\r\n this.isLoggingIn.set(true);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n\r\n try {\r\n const result = await this.loginHttpHelper(param);\r\n // TODO: SECURITY WARNING: Ensure sensitive data (like tokens/passwords) is not logged here in production.\r\n Logger.info('>>>>>>>>>>>Login response<<<<<<<<<<:', result);\r\n\r\n if (result && result.success && result.data) {\r\n this.setSession(result.data, param.rememberMe);\r\n\r\n Logger.info('Login successful, authenticated state set to true');\r\n this.authSuccess.set('Login successful!');\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n SnackbarUtils.error('Login failed. Please check your credentials.');\r\n this.authError.set('Login failed. Please check your credentials.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Login failed:', error);\r\n this.authError.set('An error occurred during login.');\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Refresh login token. Concurrent calls wait for the first refresh to complete.\r\n */\r\n refreshLogin(): Observable<AuthResult | null> {\r\n try {\r\n if (this.isRefreshing) {\r\n return this.refreshTokenSubject.pipe(\r\n filter((t): t is AuthResult => t !== null),\r\n take(1),\r\n );\r\n }\r\n\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n return of(null);\r\n }\r\n\r\n this.isRefreshing = true;\r\n this.refreshTokenSubject.next(null);\r\n\r\n return from(\r\n // TODO: Use strong typing here instead of casting if possible. Ensure refreshLoginHttpHelper expects RefreshRequest.\r\n this.refreshLoginHttpHelper({\r\n refresh_token: refreshToken,\r\n } as RefreshRequest),\r\n ).pipe(\r\n map((result) => {\r\n const data = result?.data ?? null;\r\n\r\n if (!data?.access_token) {\r\n throw new Error('Refresh token invalid');\r\n }\r\n\r\n return data;\r\n }),\r\n tap((data) => {\r\n this.storageService.set('access_token', data.access_token);\r\n this.storageService.set('refresh_token', data.refresh_token);\r\n this.isAuthenticatedSubject.next(true);\r\n this.refreshTokenSubject.next(data);\r\n }),\r\n catchError(() => {\r\n this.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n this.refreshTokenSubject.next(null);\r\n return of(null);\r\n }),\r\n finalize(() => {\r\n this.isRefreshing = false;\r\n }),\r\n shareReplay(1),\r\n );\r\n } catch {\r\n throw new Error('Unable to authenticate user');\r\n }\r\n }\r\n\r\n /**\r\n * Logout logic enhanced with UI signals\r\n */\r\n async logout(refreshToken?: string): Promise<boolean> {\r\n const token = refreshToken ?? this.getRefreshToken();\r\n if (!token) return false;\r\n\r\n try {\r\n const result = await this.logoutHttpHelper(token);\r\n\r\n if (result?.success) {\r\n this.clear();\r\n SnackbarUtils.success('Logout successful!');\r\n return true;\r\n } else {\r\n // SnackbarUtils.error('Logout failed.');\r\n this.clear(); //TODO:\r\n return false;\r\n }\r\n } catch (error) {\r\n Logger.error('Logout failed', error);\r\n return false;\r\n }\r\n }\r\n\r\n // Http Helpers\r\n private async federateLoginHttpHelper(\r\n param: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n const header = this.buildLicenseHeader();\r\n Logger.info('federateLoginHttpHelper() header', header);\r\n return this.http.post('auth/federated/login', param, showLoader, header);\r\n }\r\n\r\n private loginHttpHelper(\r\n param?: LoginRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader, this.buildLicenseHeader());\r\n }\r\n\r\n // TODO: Change 'param?: object' to 'param?: RefreshRequest' for better type safety.\r\n private refreshLoginHttpHelper(\r\n param?: object,\r\n showLoader = false,\r\n ): Promise<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader, this.buildLicenseHeader());\r\n }\r\n\r\n private logoutHttpHelper(refreshToken: string, showLoader = false): Promise<ApiResponse<void>> {\r\n // Explicitly set the library's access token to override any project token\r\n const accessToken = this.getAccessToken();\r\n let headers = this.buildLicenseHeader().set('X-Skip-Auth-Header', 'true');\r\n\r\n // Add the library's access token\r\n if (accessToken) {\r\n headers = headers.set('Authorization', `Bearer ${accessToken}`);\r\n }\r\n\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader, headers);\r\n }\r\n\r\n private buildLicenseHeader(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n // Attach license for auth endpoints (login, refresh, etc.)\r\n // TODO: Verify if the license key should be non-null. If it is required, throw an error or handle it.\r\n const licenseKey = this.currentLicenseKey();\r\n if (!licenseKey) {\r\n Logger.warn('License key missing — request sent without license header');\r\n return headers;\r\n }\r\n\r\n return headers.set('x-license-key', licenseKey);\r\n }\r\n\r\n // Utility\r\n setSession(session: AuthResult, rememberMe: boolean = true) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n\r\n // Set storage type based on rememberMe preference\r\n // this.storageService.setRememberMe(rememberMe);\r\n this.storageService.set('remember_me', rememberMe);\r\n this.storageService.set('access_token', session.access_token);\r\n this.storageService.set('refresh_token', session.refresh_token);\r\n this.storageService.set('user_id', user?.user_id);\r\n this.storageService.set('username', user?.username);\r\n this.storageService.set('roles', user?.roles);\r\n this.storageService.set('permissions', user?.permissions);\r\n this.storageService.set('organization_id', user?.organization_id);\r\n this.storageService.set('company_id', user?.company_id);\r\n this.storageService.set('office_id', user?.office_id);\r\n\r\n // Notify subscribers\r\n this.isAuthenticatedSubject.next(true);\r\n }\r\n\r\n private isTokenExpired(): boolean {\r\n let token = this.getAccessToken();\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clear() {\r\n const userId = this.getUserId();\r\n Logger.info('[Auth] Clearing auth:', { userId });\r\n\r\n // sessionStorage.clear();\r\n // localStorage.clear();\r\n\r\n this.storageService.clear();\r\n this.isAuthenticatedSubject.next(false);\r\n this.refreshTokenSubject.next(null);\r\n // ENSURE authStatus$ emits unauthenticated\r\n this.isAuthenticatedSubject.next(false);\r\n\r\n Logger.info('[Auth] Auth cleared successfully');\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit, OnChanges {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateDragState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableDrag']) {\r\n this.updateDragState();\r\n }\r\n }\r\n\r\n private updateDragState() {\r\n if (this.enableDrag) {\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n } else {\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'default');\r\n }\r\n // We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?\r\n // Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableDrag) return;\r\n if (event.defaultPrevented) return; // Respect other handlers (like resize)\r\n\r\n if (!this.dragHandle) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // Strict check if handle is explicitly provided via selector, ensuring we only drag when clicking that specific handle\r\n if (\r\n this.dragHandleSelector &&\r\n target !== this.dragHandle &&\r\n !this.dragHandle.contains(target)\r\n ) {\r\n return;\r\n }\r\n\r\n // If using the host element as the handle (no selector), allow dragging from children\r\n // BUT exclude specific interactive elements to ensure usability\r\n if (!this.dragHandleSelector) {\r\n // Check if target is a resize handle (has class or data-dir)\r\n if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle'))\r\n return;\r\n\r\n if (!this.dragHandle.contains(target)) return;\r\n\r\n // Prevent dragging when interacting with controls\r\n const tagName = target.tagName;\r\n if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName)) return;\r\n\r\n // Optional: explicit opt-out class\r\n if (target.classList.contains('no-drag')) return;\r\n }\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy, OnChanges {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.updateResizeState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableResize']) {\r\n this.updateResizeState();\r\n }\r\n }\r\n\r\n private updateResizeState() {\r\n if (this.enableResize) {\r\n if (this.resizeHandles.length === 0) {\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n } else {\r\n this.removeResizeHandles();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n const currentPosition = getComputedStyle(element).position;\r\n\r\n if (currentPosition !== 'fixed' && currentPosition !== 'absolute') {\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n }\r\n\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.addClass(handle, 'doohbot-resize-handle');\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '15px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '20px');\r\n this.renderer.setStyle(handle, 'height', '20px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableResize) return;\r\n if (event.defaultPrevented) return; // Respect other handlers\r\n\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Injectable, signal, inject, effect } from '@angular/core';\r\nimport { StorageService } from '../../core/auth/storage.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { HttpService } from '../../core/http/http.service';\r\nimport { ApiResponse } from '../../core/models/api-response.model';\r\n\r\nexport interface Characteristics {\r\n warm: string;\r\n enthusiastic: string;\r\n headersAndLists: string;\r\n emoji: string;\r\n}\r\n\r\nexport interface AboutYou {\r\n nickname: string;\r\n occupation: string;\r\n}\r\n\r\nexport interface CustomInstructions {\r\n instructions?: string;\r\n preferences?: string;\r\n user_context_id?: string;\r\n}\r\n\r\nexport interface AppearanceSettings {\r\n theme: 'light' | 'dark' | 'auto';\r\n language: string;\r\n}\r\n\r\nexport interface PersonalizationSettings {\r\n customInstructions: CustomInstructions;\r\n appearance: AppearanceSettings;\r\n meta: {\r\n version: number;\r\n lastUpdated: number;\r\n };\r\n}\r\n\r\nconst BASE_STORAGE_KEY = 'app.personalization.v1';\r\n\r\nconst DEFAULT_SETTINGS: PersonalizationSettings = {\r\n customInstructions: { instructions: '', preferences: '' },\r\n appearance: {\r\n theme: 'auto',\r\n language: 'en',\r\n },\r\n meta: {\r\n version: 1,\r\n lastUpdated: Date.now(),\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PersonalizationService {\r\n private storage = inject(StorageService);\r\n private authService = inject(AuthService);\r\n\r\n // State Signals\r\n private _settings = signal<PersonalizationSettings>(DEFAULT_SETTINGS);\r\n public settings = this._settings.asReadonly();\r\n\r\n constructor(\r\n private http: HttpService,\r\n\r\n ) {\r\n // Reload settings when auth status changes (user logins or logouts)\r\n effect(\r\n () => {\r\n // const status = this.authStatus();\r\n this._settings.set(this.loadSettings());\r\n },\r\n { allowSignalWrites: true }, // TODO\r\n );\r\n // Automatically persist changes when settings signal updates\r\n effect(() => {\r\n const currentSettings = this._settings();\r\n this.saveSettings(currentSettings);\r\n });\r\n }\r\n\r\n private getStorageKey(): string {\r\n const userId = this.authService.getUserId();\r\n return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;\r\n }\r\n\r\n /**\r\n * Update custom instructions\r\n */\r\n updateInstructions(instructions: Partial<CustomInstructions>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n customInstructions: {\r\n instructions: instructions.instructions ?? '',\r\n preferences: instructions.preferences ?? '',\r\n user_context_id: instructions.user_context_id ?? s.customInstructions.user_context_id,\r\n },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n\r\n /**\r\n * Update appearance settings\r\n */\r\n updateAppearance(appearance: Partial<AppearanceSettings>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n appearance: { ...s.appearance, ...appearance },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Reset all personalization to defaults\r\n */\r\n resetToDefaults() {\r\n this._settings.set({\r\n ...DEFAULT_SETTINGS,\r\n meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },\r\n });\r\n }\r\n\r\n async saveCustomInstructions(data: CustomInstructions) {\r\n try {\r\n const current = this._settings().customInstructions;\r\n\r\n let res: ApiResponse<CustomInstructions> | null = null;\r\n\r\n if (current?.user_context_id) {\r\n // Update existing record\r\n res = await this.http.put(\r\n `users-context/`,\r\n data,\r\n true // showLoader\r\n );\r\n } else {\r\n // Create new record\r\n res = await this.http.post('users-context/', data, true);\r\n }\r\n\r\n if (res?.success && res.data) {\r\n await this.updateInstructions({\r\n instructions: res.data.instructions ?? current?.instructions ?? '',\r\n preferences: res.data.preferences ?? current?.preferences ?? '',\r\n user_context_id: res.data.user_context_id ?? current?.user_context_id,\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Failed saving custom instructions', e);\r\n }\r\n }\r\n\r\n loadCustomInstructions() {\r\n this.getCustomInstructionHttpHelper(true)\r\n .then(res => {\r\n if (res?.success && res.data) {\r\n this.updateInstructions({\r\n instructions: res.data.instructions ?? '',\r\n preferences: res.data.preferences ?? '',\r\n user_context_id: res.data.user_context_id,\r\n });\r\n }\r\n })\r\n .catch(e => {\r\n console.error('Failed loading user custom instructions', e);\r\n });\r\n }\r\n\r\n\r\n getCustomInstructionHttpHelper(showLoader = false): Promise<ApiResponse<CustomInstructions>> {\r\n const userId = this.authService.getUserId();\r\n return this.http.get(`users-context/${userId}`, undefined, false, showLoader);\r\n }\r\n\r\n private loadSettings(): PersonalizationSettings {\r\n try {\r\n const key = this.getStorageKey();\r\n // StorageService.get handles decryption/parsing\r\n const saved = this.storage.get(key) as any;\r\n if (saved) {\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n ...saved,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n ...(saved.appearance || {}),\r\n },\r\n };\r\n }\r\n } catch (e) {\r\n console.error('Failed to load personalization settings', e);\r\n }\r\n\r\n // Return defaults\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n },\r\n };\r\n }\r\n\r\n private saveSettings(settings: PersonalizationSettings) {\r\n const key = this.getStorageKey();\r\n this.storage.set(key, settings);\r\n }\r\n}\r\n","import { effect, Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { PersonalizationService } from '../../app/personalization/personalization.service';\r\nimport { DoohbotConfigService } from '../config/doohbot-config.service';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n // TODO: Use a single signal for Theme state and derive sub-states (like 'activeTheme') using computed().\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n private personalization: PersonalizationService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n // Sync theme and primary color with PersonalizationService\r\n effect(\r\n () => {\r\n const settings = this.personalization.settings();\r\n const mode = settings.appearance.theme;\r\n\r\n // Update theme mode\r\n this._theme.set(mode);\r\n this.updateActiveTheme(mode);\r\n\r\n // Apply palette from CONFIG if present, or fallback to 'doohbot'\r\n const configPalette = this.configService.theme()?.palette;\r\n this.applyPaletteToGlobal(configPalette || 'doohbot');\r\n\r\n // Update primary color globally from CONFIG (only if explicitly set in user's config)\r\n const configPrimaryColor = this.configService.theme()?.primaryColor;\r\n if (configPrimaryColor) {\r\n this.applyPrimaryColorToGlobal(configPrimaryColor);\r\n }\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n // Separate effect to handle re-application of config when activeTheme changes\r\n effect(() => {\r\n // const currentTheme = this._activeTheme();\r\n const config = this._currentConfig();\r\n if (this.rootElement && config) {\r\n this.applyCssVariables(this.rootElement, config);\r\n }\r\n });\r\n }\r\n\r\n private _currentConfig = signal<DoohbotThemeConfig | undefined>(undefined);\r\n private rootElement: HTMLElement | null = null;\r\n\r\n public setThemeConfig(config: DoohbotThemeConfig, rootElement: HTMLElement) {\r\n this._currentConfig.set(config);\r\n this.rootElement = rootElement;\r\n // Initial apply\r\n this.applyCssVariables(rootElement, config);\r\n }\r\n\r\n public applyPrimaryColorToGlobal(colorInput: string) {\r\n if (!colorInput) return;\r\n\r\n let color = colorInput;\r\n\r\n //! If 'default', do not apply anything. Let CSS fallback handle it.\r\n if (color === 'default') return;\r\n\r\n if (color.includes(',')) {\r\n const parts = color.split(',').map((p) => p.trim());\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n }\r\n\r\n const targetElement = this.rootElement || document.documentElement;\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const onPrimary = this.getContrastColor(color);\r\n\r\n // Standard Material 3 tokens\r\n targetElement.style.setProperty('--mat-sys-primary', color);\r\n targetElement.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n\r\n // Primary Container (using semi-transparent primary as a fallback if no specific logic)\r\n const primaryContainer = `${color}33`; // 20% opacity\r\n targetElement.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n targetElement.style.setProperty('--mat-sys-on-primary-container', color);\r\n\r\n overlayContainer.style.setProperty('--mat-sys-primary', color);\r\n overlayContainer.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n overlayContainer.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n\r\n // Update internal legacy/utility variables\r\n targetElement.style.setProperty('--primary-color', color);\r\n targetElement.style.setProperty('--primary-color-rgb', this.hexToRgb(color));\r\n targetElement.style.setProperty('--user-message-color', color);\r\n targetElement.style.setProperty('--user-text-color', onPrimary);\r\n\r\n overlayContainer.style.setProperty('--primary-color', color);\r\n overlayContainer.style.setProperty('--primary-color-rgb', this.hexToRgb(color));\r\n }\r\n\r\n /**\r\n * Helper to convert hex to comma-separated RGB\r\n */\r\n private hexToRgb(hex: string): string {\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n return `${r}, ${g}, ${b}`;\r\n }\r\n\r\n /**\r\n * Simple luminance-based contrast calculation\r\n * Returns #ffffff for dark colors and #000000 for light colors\r\n */\r\n private getContrastColor(hex: string): string {\r\n if (!hex || hex.length < 6) return '#ffffff';\r\n\r\n // Remove # if present\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n\r\n // Calculate luminance (standard formula)\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n // TODO: Contrast calculation could be more precise using WCAG 2.1 relative luminance formulas.\r\n return luminance > 0.6 ? '#000000' : '#ffffff';\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this.personalization.updateAppearance({ theme: mode });\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fallback to system preference\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n const overlayContainer = this.overlay.getContainerElement();\r\n // No longer applying to document.documentElement to avoid leaking to host app.\r\n // DoohbotComponent handles applying the theme class to its own host element.\r\n\r\n // We rely on DoohbotComponent to add/remove classes on the host element.\r\n\r\n // Also apply to overlay container (for menus/dialogs)\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n // app-doohbot .db-theme-<palette>\r\n private applyPaletteToGlobal(palette: 'doohbot' | 'aqua' | 'candy' | 'forest' | 'midnight' | 'sunset' | 'slate') {\r\n const targetElement = this.rootElement || document.documentElement;\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Remove all possible theme classes\r\n const paletteClasses = ['db-theme-doohbot', 'db-theme-aqua', 'db-theme-candy', 'db-theme-forest', 'db-theme-midnight', 'db-theme-sunset', 'db-theme-slate'];\r\n\r\n const applyToElement = (el: HTMLElement) => {\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(el, cls));\r\n this.renderer.addClass(el, `db-theme-${palette}`);\r\n };\r\n\r\n applyToElement(targetElement);\r\n applyToElement(overlayContainer);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n /**\r\n * @deprecated Manual CSS variable application is now handled via theme.css tokens\r\n */\r\n public applyCssVariables(element: HTMLElement, config: DoohbotThemeConfig | undefined) {\r\n if (!config) return;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variableName: string) => {\r\n if (input) {\r\n const parts = input.split(',').map((p) => p.trim());\r\n const colorToUse = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n // Apply to Component Host\r\n element.style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Apply to Overlay Container (for Dialogs/Menus which exist outside host)\r\n this.overlay.getContainerElement().style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Secondary mapping for specific variables that have derived states\r\n // if (variableName === 'primary-color') {\r\n // element.style.setProperty('--user-message-color', colorToUse);\r\n // element.style.setProperty('--mat-sys-primary', colorToUse);\r\n // const onPrimary = this.getContrastColor(colorToUse);\r\n // element.style.setProperty('--user-text-color', onPrimary);\r\n // element.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n // }\r\n }\r\n };\r\n\r\n // Font\r\n if (config.fontFamily) {\r\n element.style.setProperty('--font-family', config.fontFamily);\r\n element.style.setProperty('--db-font-family', config.fontFamily);\r\n }\r\n\r\n // Primary & Secondary\r\n // Handled globally via PersonalizationService/applyPrimaryColorToGlobal to allow user overrides\r\n // applyColor(config.primaryColor, 'primary-color');\r\n applyColor(config.secondaryColor, 'secondary-color');\r\n\r\n // Backgrounds\r\n applyColor(config.backgroundColor, 'background-color');\r\n\r\n // Ensure chat input also follows dual mode if provided, or defaults?\r\n // User only asked for background color \"of the entire app\".\r\n applyColor(config.chatInputColor, 'chat-input-color');\r\n\r\n // Text Colors\r\n applyColor(config.textAltColor, 'text-alt-color');\r\n applyColor(config.textColor, 'text-color');\r\n applyColor(config.secondaryTextColor, 'secondary-text-color');\r\n applyColor(config.hintTextColor, 'hint-text-color');\r\n\r\n // Button Colors\r\n applyColor(config.buttonColor, 'button-color');\r\n\r\n // Message Colors\r\n applyColor(config.userMessageColor, 'user-message-color');\r\n applyColor(config.botMessageColor, 'bot-message-color');\r\n\r\n // Message Text Colors\r\n applyColor(config.userTextColor, 'user-text-color');\r\n applyColor(config.botTextColor, 'bot-text-color');\r\n\r\n // Borders\r\n applyColor(config.borderColor, 'border-color');\r\n applyColor(config.borderShadowColor, 'border-shadow-color');\r\n applyColor(config.borderTopColor, 'border-top-color');\r\n\r\n // Indicators\r\n applyColor(config.typingIndicatorColor, 'typing-indicator-color');\r\n\r\n // Utility Colors\r\n applyColor(config.white, 'white');\r\n applyColor(config.black, 'black');\r\n applyColor(config.grey, 'grey');\r\n applyColor(config.red, 'red');\r\n applyColor(config.yellow, 'yellow');\r\n applyColor(config.orange, 'orange');\r\n applyColor(config.green, 'green');\r\n applyColor(config.blue, 'blue');\r\n }\r\n}\r\n","import { Logger } from './../utils/logger.service';\r\nimport { Injectable, NgZone } from '@angular/core';\r\nimport { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { StorageService } from '../auth/storage.service';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n constructor(\r\n private ngZone: NgZone,\r\n private tokenStorage: StorageService,\r\n private http: HttpClient,\r\n ) { }\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n // TODO: Returning an Observable wrapper around Angular's HttpClient progress events is appropriate,\r\n // but ensures the manual line-splitting logic handles all UTF-8 characters and multi-line data correctly.\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n // Note: Authorization header is added automatically by AuthInterceptor\r\n let requestHeaders = new HttpHeaders({\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n });\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach((key) => {\r\n requestHeaders = requestHeaders.set(key, headers[key]);\r\n });\r\n }\r\n\r\n const req = this.http.request('POST', url, {\r\n body,\r\n headers: requestHeaders,\r\n reportProgress: true,\r\n observe: 'events',\r\n responseType: 'text',\r\n });\r\n\r\n let lastLoaded = 0;\r\n\r\n const sub = req.subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.DownloadProgress) {\r\n // Process the new chunk of data\r\n const fullText = (event as any).partialText;\r\n if (!fullText) return;\r\n\r\n const newText = fullText.slice(lastLoaded);\r\n lastLoaded = fullText.length;\r\n\r\n const lines = newText.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.trim() === '') continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n // TODO: ngZone.run() usage within a tight loop (SSE stream) can be expensive. \r\n // Consider using discrete signals or a more optimized zone strategy.\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.response_id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n Logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n } else if (event.type === HttpEventType.Response) {\r\n this.ngZone.run(() => observer.complete());\r\n }\r\n },\r\n error: (err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n },\r\n complete: () => {\r\n this.ngZone.run(() => observer.complete());\r\n },\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n}\r\n","import { Logger } from './../../../core/utils/logger.service';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest, ChatMessage } from '../model/chat-history.model';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n Logger.info('ChatApiService: Initialized');\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Promise<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.http.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions', request, showLoader);\r\n }\r\n\r\n getChatSession(\r\n chatSessionId: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<ChatMessage[]>> {\r\n return this.http.get(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n // }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.clearChatHistory(\r\n // { chat_session_ids: [chatSessionId], delete_all: false },\r\n // showLoader,\r\n // );\r\n // }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Promise<ApiResponse<void>> {\r\n const body = { chat_session_ids: [chatSessionId], delete_all: false };\r\n return this.http.delete('chats/sessions', body, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Promise<ApiResponse<void>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n clearChatHistory(request?: object, showLoader = false): Promise<ApiResponse<void>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ChatApiService } from './chat-api.service';\r\nimport { ChatSessionDto } from '../model/chat-session.model';\r\nimport { Message } from '../../../core/models/message';\r\nimport { SnackbarUtils } from '../../../shared/snackbar/snackbar.utils';\r\nimport { ChatSessionResponse, ChatMessage } from '../model/chat-history.model';\r\nimport { Logger } from '../../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private chatApiService = inject(ChatApiService);\r\n\r\n // History State Signals\r\n public sessions = signal<ChatSessionDto[]>([]);\r\n public isLoading = signal<boolean>(false);\r\n public isLoadingMore = signal<boolean>(false);\r\n public hasMore = signal<boolean>(true);\r\n public historyOffset = signal<number>(0);\r\n public isCacheValid = signal<boolean>(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n public mapSessionResponseToSession(\r\n sessionResponse: ChatSessionResponse,\r\n userId: string,\r\n ): ChatSessionDto {\r\n // Use last_message_at or created_at or current time\r\n const timestamp = sessionResponse.last_message_at\r\n ? new Date(sessionResponse.last_message_at)\r\n : sessionResponse.created_at\r\n ? new Date(sessionResponse.created_at)\r\n : new Date();\r\n\r\n Logger.info('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session if they exist\r\n let messages: Message[] = [];\r\n if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {\r\n messages = sessionResponse.messages.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n\r\n // Use response_id as primary ID, fallback to chat_session_id\r\n const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';\r\n\r\n return {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all chat sessions for a specific user\r\n */\r\n async loadSessions(userId: string, forceRefresh = false): Promise<void> {\r\n Logger.info('loadSessions called', { userId, forceRefresh });\r\n\r\n if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {\r\n Logger.info('Cache is valid. Skipping API call.');\r\n return;\r\n }\r\n\r\n this.isLoading.set(true);\r\n this.historyOffset.set(0);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset: 0 });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set(remoteSessions);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(remoteSessions.length);\r\n this.isCacheValid.set(true);\r\n\r\n Logger.info(`Loaded ${remoteSessions.length} sessions. Cache valid: true`);\r\n } else {\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load history');\r\n Logger.error('ChatHistoryService: Failed to load history', err);\r\n this.sessions.set([]);\r\n this.hasMore.set(false);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreSessions(userId: string): Promise<void> {\r\n if (!this.hasMore() || this.isLoadingMore()) return;\r\n\r\n const offset = this.historyOffset();\r\n this.isLoadingMore.set(true);\r\n\r\n try {\r\n const result = await this.chatApiService.getChatHistory({ limit: 50, offset });\r\n\r\n if (result?.success && result.data?.sessions) {\r\n const remoteSessions = result.data.sessions.map((s) =>\r\n this.mapSessionResponseToSession(s, userId),\r\n );\r\n const hasMore =\r\n (result.data.offset ?? 0) + remoteSessions.length < (result.data.total ?? 0);\r\n\r\n this.sessions.set([...this.sessions(), ...remoteSessions]);\r\n this.hasMore.set(hasMore);\r\n this.historyOffset.set(offset + remoteSessions.length);\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load more history');\r\n Logger.error('ChatHistoryService: Failed to load more history', err);\r\n } finally {\r\n this.isLoadingMore.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Load messages for a specific session\r\n */\r\n async loadSessionMessages(sessionId: string): Promise<Message[]> {\r\n try {\r\n const result = await this.chatApiService.getChatSession(sessionId);\r\n\r\n if (result.success && result.data) {\r\n // Interleave user and assistant messages\r\n const messages: ChatMessage[] = [];\r\n const users = result.data.filter((m) => m.role === 'user');\r\n const assistants = result.data.filter((m) => m.role === 'model');\r\n const maxLength = Math.max(users.length, assistants.length);\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n if (users[i]) messages.push(users[i]);\r\n if (assistants[i]) messages.push(assistants[i]);\r\n }\r\n\r\n return messages.map((msg) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to load messages');\r\n Logger.error('ChatHistoryService: Failed to load messages', err);\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n async deleteSession(sessionId: string, userId: string): Promise<void> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.deleteChatSession(sessionId);\r\n if (result?.success) {\r\n this.sessions.update((prev) => prev.filter((s) => s.response_id !== sessionId));\r\n SnackbarUtils.success('Conversation deleted successfully');\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to delete conversation');\r\n Logger.error('ChatHistoryService: Failed to delete session', err);\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Delete all history\r\n */\r\n async deleteAllHistory(userId: string): Promise<void> {\r\n this.isLoading.set(true);\r\n try {\r\n const result = await this.chatApiService.clearChatHistory({ delete_all: true });\r\n if (result?.success) {\r\n this.sessions.set([]);\r\n this.isCacheValid.set(false);\r\n SnackbarUtils.success('Chat history cleared');\r\n }\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to clear history');\r\n Logger.error('ChatHistoryService: Failed to clear history', err);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Update session title\r\n */\r\n async updateSessionTitle(sessionId: string, newTitle: string, userId: string): Promise<boolean> {\r\n this.processingSessionId.set(sessionId);\r\n try {\r\n const result = await this.chatApiService.updateChatTitle(sessionId, newTitle);\r\n const success = !!result?.success;\r\n\r\n if (success) {\r\n this.sessions.update((prev) =>\r\n prev.map((s) => (s.response_id === sessionId ? { ...s, title: newTitle } : s)),\r\n );\r\n SnackbarUtils.success('Title updated successfully');\r\n }\r\n return success;\r\n } catch (err) {\r\n SnackbarUtils.error('Failed to update title');\r\n Logger.error('ChatHistoryService: Failed to update title', err);\r\n return false;\r\n } finally {\r\n this.processingSessionId.set(null);\r\n }\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n invalidateCache(): void {\r\n // TODO\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMore.set(true);\r\n }\r\n\r\n /**\r\n * Clear all history state\r\n */\r\n clearState(): void {\r\n this.sessions.set([]);\r\n this.isLoading.set(false);\r\n this.isLoadingMore.set(false);\r\n this.hasMore.set(true);\r\n this.historyOffset.set(0);\r\n this.isCacheValid.set(false);\r\n this.processingSessionId.set(null);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Advanced configuration for DoohBot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","import { Injectable, signal, computed, effect, Signal } from '@angular/core';\r\nimport { Message } from '../../core/models/message';\r\n\r\n/**\r\n * ChatUIStateService - Centralized UI state management\r\n *\r\n * Manages all UI-related state for the chat component including:\r\n * - Chat window open/close state\r\n * - History sidebar visibility\r\n * - Unread message tracking\r\n * - Fullscreen state\r\n *\r\n * This service uses Angular signals for reactive state management,\r\n * allowing components to subscribe to state changes efficiently.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatUIStateService {\r\n //! ===================== UI STATE SIGNALS============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Reference to current messages (injected from outside)\r\n */\r\n private messagesSignal: Signal<Message[]> = signal<Message[]>([]);\r\n\r\n //! ===================== COMPUTED SIGNALS ======================\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messagesSignal();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'model');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messagesSignal();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n // TODO: allowSignalWrites: true is a design smell in Angular. \r\n // It's better to trigger 'markAsRead' explicitly via events or a dedicated method call when the Relevant UI state changes.\r\n { allowSignalWrites: true },\r\n );\r\n\r\n //! =================== PUBLIC METHODS ===========================\r\n\r\n /**\r\n * Set the messages signal reference from an external source\r\n * This allows the UI state service to track messages from MessageService\r\n */\r\n setMessagesSignal(messagesSignal: Signal<Message[]>): void {\r\n this.messagesSignal = messagesSignal;\r\n }\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const messages = this.messagesSignal();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n}\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSessionDto } from './model/chat-session.model';\r\nimport { ChatHistoryService } from './services/chat-history.service';\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { SnackbarUtils } from '../../shared/snackbar/snackbar.utils';\r\nimport { ChatApiError } from '../../core/models/api-request.model';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport { ChatRequest } from './model/chat-request.model';\r\nimport { ChatStreamMessage } from './model/chat-stream-message.model';\r\nimport { AuthService } from './../../core/auth/auth.service';\r\nimport { ChatUIStateService } from './chat-ui-state.service';\r\nimport { DoohbotConfigService } from '../../core/config/doohbot-config.service';\r\nimport { Logger } from '../../core/utils/logger.service';\r\nimport { MarkdownService } from '../../core/services/markdown.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private apiService = inject(ChatApiService);\r\n private authService = inject(AuthService);\r\n private configService = inject(DoohbotConfigService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private chatUIStateService = inject(ChatUIStateService);\r\n private markdownService = inject(MarkdownService);\r\n private chatSessions = this.chatHistoryService.sessions;\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n public showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'model');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n // Active session\r\n private activeSession: ChatSessionDto | null = null;\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n\r\n //! Controls whether to use Streaming API (default) or Standard API\r\n // public isStreaming = computed(() => !this.configService.api);\r\n public isStreaming = computed(() => !this.configService.useNonStreamingChat());\r\n\r\n // TODO: Use specific ChatStreamMessage[] type for messagesStream.\r\n messagesStream: Array<ChatStreamMessage> = [];\r\n currentResponse = '';\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n Logger.info('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Create a new chat session\r\n */\r\n createSession(userId: string, sessionId: string): ChatSessionDto {\r\n return {\r\n response_id: sessionId, // Backend will assign ID after first message\r\n last_message_at: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n userId,\r\n };\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(sessionId?: string): void {\r\n const userId = this.authService.getUserId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n\r\n this.activeSession = this.createSession(userId, sessionId || '');\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSessionDto): void {\r\n Logger.info(\r\n '[ChatService] Loading session:',\r\n session.response_id,\r\n 'Messages:',\r\n session.messages.length,\r\n );\r\n this.activeSession = session;\r\n // Load session messages and convert markdown for completed model messages\r\n this.messages.set(\r\n session.messages.map((m) =>\r\n m.sender === 'model' && m.completed\r\n ? {\r\n ...m,\r\n textHtml: this.markdownService.convert(m.text),\r\n }\r\n : m,\r\n ),\r\n );\r\n Logger.info('[ChatService] Messages signal updated. Current count:', this.messages().length);\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSessionDto | null {\r\n return this.activeSession;\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n }\r\n\r\n /**\r\n * Continue a chat session\r\n */\r\n public async continueSession(sessionId: string): Promise<void> {\r\n Logger.info(`[ChatService] continuing session: ${sessionId}`);\r\n const result = await this.chatHistoryService.loadSessionMessages(sessionId);\r\n const loadedMessages = result || [];\r\n const sessionFromList = this.chatSessions().find((s) => s.response_id === sessionId);\r\n\r\n if (sessionFromList) {\r\n sessionFromList.messages = loadedMessages;\r\n this.loadSession(sessionFromList);\r\n } else {\r\n const timestamp =\r\n loadedMessages.length > 0\r\n ? loadedMessages[loadedMessages.length - 1].timestamp || new Date()\r\n : new Date();\r\n\r\n const userId = this.authService.getUserId();\r\n if (!userId) {\r\n throw new Error('Unauthorized user');\r\n }\r\n\r\n const newSession: ChatSessionDto = {\r\n response_id: sessionId,\r\n last_message_at: timestamp,\r\n title: 'Previous Conversation',\r\n messages: loadedMessages,\r\n userId,\r\n };\r\n this.loadSession(newSession);\r\n }\r\n this.chatUIStateService.openChat();\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string, maxLength: number = 4000): Promise<void> {\r\n const trimmedText = text.trim();\r\n if (!trimmedText) return;\r\n\r\n if (trimmedText.length > maxLength) {\r\n SnackbarUtils.error('Message too long.');\r\n return;\r\n }\r\n\r\n const requestSession = this.activeSession;\r\n\r\n this.addMessage({\r\n sender: 'user',\r\n text: trimmedText,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n this.isLoadingApi.set(true);\r\n\r\n try {\r\n const request = this.buildChatRequest(trimmedText);\r\n\r\n if (this.isStreaming()) {\r\n // STREAMING HANDLES MODEL MESSAGE ITSELF\r\n await this.stream(request);\r\n } else {\r\n // NON-STREAMING RETURNS FULL TEXT\r\n const response = await this.ask(request);\r\n\r\n if (this.activeSession === requestSession && response) {\r\n this.addMessage({\r\n sender: 'model',\r\n text: response,\r\n completed: true,\r\n isHistory: false,\r\n id: this.generateMessageId(),\r\n });\r\n }\r\n }\r\n } finally {\r\n if (this.activeSession === requestSession) {\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a unique message ID to prevent collisions\r\n */\r\n private generateMessageId(): string {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Builds a chat request payload with the given user text and optional active session\r\n * @param {string} userInput - The text provided by the user\r\n * @returns {ChatRequest} - A chat request payload with the user text and optional active session\r\n * @memberof ChatService\r\n */\r\n\r\n private buildChatRequest(userText: string): ChatRequest {\r\n const request: ChatRequest = {\r\n query: userText,\r\n organization_id: this.authService.getOrganizationId() || '',\r\n prompt_mode: this.promptMode(),\r\n };\r\n\r\n // Continue conversation if active session exists and has a backend ID\r\n if (this.activeSession?.response_id) {\r\n request.response_id = this.activeSession.response_id;\r\n Logger.info('>>>> conversation continued:', this.activeSession.response_id);\r\n } else {\r\n Logger.info('>>>> new conversation started');\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Send chat message using standard endpoint and return the response content.\r\n */\r\n private async ask(request: ChatRequest): Promise<string> {\r\n Logger.info('>>>>Using Standard Chat Endpoint<<<<');\r\n\r\n const currentSession = this.activeSession;\r\n\r\n try {\r\n const response = await this.apiService.sendMessage(request, true); // returns Promise<ApiResponse<ChatResponse>>\r\n\r\n if (this.activeSession === currentSession) {\r\n this.isLoadingApi.set(false);\r\n }\r\n\r\n if (response?.success && response.data) {\r\n if (\r\n this.activeSession === currentSession &&\r\n this.activeSession &&\r\n !this.activeSession.response_id\r\n ) {\r\n // First message response - capture the real session ID\r\n this.activeSession.response_id = response.data.id;\r\n // Invalidate cache to ensure history list updates\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n return response.data.content || this.getFallbackError();\r\n } else {\r\n return this.getFallbackError();\r\n }\r\n } catch (error) {\r\n Logger.error('Ask error:', error);\r\n\r\n if (this.activeSession === currentSession) {\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n }\r\n\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n private async stream(request: ChatRequest): Promise<void> {\r\n Logger.info('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n const assistantMessage: Message = {\r\n id: this.generateMessageId(),\r\n sender: 'model',\r\n text: '',\r\n chunks: [],\r\n timestamp: new Date(),\r\n completed: false,\r\n isHistory: false,\r\n showSuggestions: false,\r\n };\r\n\r\n const requestSession = this.activeSession;\r\n const streamComplete$ = new Subject<void>();\r\n let hasStarted = false;\r\n\r\n this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n if (!hasStarted) {\r\n hasStarted = true;\r\n this.isBotTyping.set(false);\r\n\r\n this.addMessage(assistantMessage);\r\n\r\n // capture backend session id once\r\n if (this.activeSession && !this.activeSession.response_id && chunk.response_id) {\r\n this.activeSession.response_id = chunk.response_id;\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n }\r\n\r\n if (!chunk.content) return;\r\n\r\n const newText = assistantMessage.text + chunk.content;\r\n assistantMessage.text = newText;\r\n\r\n const html = this.markdownService.convert(newText);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id ? { ...m, text: newText, textHtml: html } : m,\r\n ),\r\n );\r\n },\r\n complete: () => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) => (m.id === assistantMessage.id ? { ...m, completed: true } : m)),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n error: () => {\r\n if (this.activeSession !== requestSession) return;\r\n\r\n const fallback = this.getFallbackError();\r\n const html = this.markdownService.convert(fallback);\r\n\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? { ...m, text: fallback, textHtml: html, completed: true }\r\n : m,\r\n ),\r\n );\r\n\r\n streamComplete$.next();\r\n streamComplete$.complete();\r\n },\r\n });\r\n\r\n await lastValueFrom(streamComplete$);\r\n }\r\n}\r\n","import { Component, input, output, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\nimport { ChatService } from '../../chat.service';\r\nimport { ChatUIStateService } from '../../chat-ui-state.service';\r\nimport { doohbotConst } from '../../../../const/doohbot-constant';\r\n\r\n@Component({\r\n selector: 'app-chat-header',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatMenuModule],\r\n templateUrl: './chat-header.component.html',\r\n styleUrls: ['./chat-header.component.scss'],\r\n})\r\nexport class ChatHeaderComponent {\r\n //inputs\r\n isAuthenticated = input(false);\r\n isFullScreen = input(false);\r\n settingsMenu = input<any>();\r\n isNewChatDisabled = input(false);\r\n\r\n //outputs\r\n toggleChat = output<void>();\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n clearChat = output<void>();\r\n\r\n //const\r\n readonly doohbotConst = doohbotConst;\r\n\r\n public themeService = inject(ThemeService);\r\n public chatService = inject(ChatService);\r\n private uiState = inject(ChatUIStateService);\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onStartNewConversation() {\r\n // Logger.warn('Starting new conversation...');\r\n this.chatService.startNewSession();\r\n this.uiState.closeHistorySidebar();\r\n }\r\n}\r\n","<div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" [src]=\" doohbotConst.appLogo\" alt=\"Logo\" />\r\n <h2>{{ doohbotConst.appTitle }}</h2>\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- History Button -->\r\n\r\n <!-- add chat Button -->\r\n @if (isAuthenticated()) {\r\n <button class=\"header-button\" (click)=\"onStartNewConversation()\" title=\"Start new conversation\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- history Button -->\r\n @if (isAuthenticated() && !isFullScreen()) {\r\n <button class=\"header-button\" (click)=\"onToggleHistorySidebar()\" title=\"Chat History\">\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- more Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>minimize</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatIconModule],\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n})\r\nexport class LoginFormComponent {\r\n @Input() isLoggingIn: boolean = false;\r\n\r\n @Output() loginSubmit = new EventEmitter<{\r\n username: string;\r\n password: string;\r\n rememberMe: boolean;\r\n }>();\r\n @Output() cancel = new EventEmitter<void>();\r\n\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showPassword = false;\r\n public rememberMe = false;\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onLoginSubmit() {\r\n if (this.loginUsername && this.loginPassword) {\r\n this.loginSubmit.emit({\r\n username: this.loginUsername.toLowerCase(),\r\n password: this.loginPassword,\r\n rememberMe: this.rememberMe,\r\n });\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n>\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button type=\"submit\" class=\"auth-btn primary\" [disabled]=\"loginForm.invalid || isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chat-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chat-footer.component.html',\r\n styleUrls: ['./chat-footer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChatFooterComponent {\r\n showDisclaimer = input(false);\r\n}\r\n","@if (showDisclaimer()) {\r\n<div class=\"chat-footer-container\">\r\n <p class=\"disclaimer\">AI-generated content may not be accurate.</p>\r\n</div>\r\n}","export const AppEntity = {\r\n amp: '&',\r\n lt: '<',\r\n gt: '>',\r\n quot: '"',\r\n apos: ''',\r\n at: '@',\r\n};\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { AppEntity } from '../../../../const/html-entities';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-preferences-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule, MatFormFieldModule, MatSelectModule],\r\n templateUrl: './preferences-section.component.html',\r\n styleUrls: ['./preferences-section.component.scss'],\r\n})\r\nexport class PreferencesSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() defaultColor: string = 'doohbot';\r\n @Input() username: string = 'User';\r\n @Input() userImageUrl: string | null = null;\r\n @Input() userRole: string = 'Doohbot User';\r\n\r\n appEntity = AppEntity;\r\n\r\n get initials(): string {\r\n return this.username ? this.username.charAt(0).toUpperCase() : 'U';\r\n }\r\n\r\n @Output() onThemeSelect = new EventEmitter<'light' | 'dark' | 'auto'>();\r\n @Output() onLanguageSelect = new EventEmitter<string>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onReset = new EventEmitter<void>();\r\n\r\n public languages = [\r\n { code: 'en', label: 'English' },\r\n { code: 'es', label: 'Spanish' },\r\n { code: 'fr', label: 'French' },\r\n { code: 'de', label: 'German' },\r\n { code: 'it', label: 'Italian' },\r\n { code: 'pt', label: 'Portuguese' },\r\n { code: 'zh', label: 'Chinese' },\r\n { code: 'ja', label: 'Japanese' },\r\n { code: 'ko', label: 'Korean' },\r\n { code: 'ar', label: 'Arabic' },\r\n { code: 'hi', label: 'Hindi' },\r\n ];\r\n\r\n // Color and Style helpers removed\r\n\r\n getThemeIcon(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'light_mode';\r\n case 'dark': return 'dark_mode';\r\n default: return 'brightness_auto';\r\n }\r\n }\r\n\r\n getThemeLabel(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'Light Mode';\r\n case 'dark': return 'Dark Mode';\r\n default: return 'System';\r\n }\r\n }\r\n\r\n getLanguageLabel(code: string): string {\r\n return this.languages.find(l => l.code === code)?.label || 'Select';\r\n }\r\n\r\n // Style and Picker helpers removed\r\n}\r\n","<div class=\"preferences-container\">\r\n <header class=\"pane-header\">\r\n <h1>General & Profile</h1>\r\n <p>Manage your profile and customize how your assistant looks.</p>\r\n </header>\r\n\r\n <div class=\"profile-card\">\r\n <div class=\"avatar-section\">\r\n <div class=\"letter-avatar\" [class.has-image]=\"!!userImageUrl\">\r\n @if (userImageUrl) {\r\n <img [src]=\"userImageUrl\" [alt]=\"username\" class=\"profile-img\" />\r\n } @else {\r\n {{ initials }}\r\n }\r\n </div>\r\n <div class=\"user-main-info\">\r\n <h2>{{ username }}</h2>\r\n <p class=\"role-badge\">{{ userRole }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-grid\">\r\n <div class=\"info-item\">\r\n <label>Full Name</label>\r\n <div class=\"info-value\">{{ username }}</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Email Address</label>\r\n <div class=\"info-value\">user@adzen.tech</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Organization</label>\r\n <div class=\"info-value\">Adzen Tech Private Limited</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Member Since</label>\r\n <div class=\"info-value\">January 2026</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Appearance Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Appearance</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select [value]=\"settings.appearance.theme\" (selectionChange)=\"onThemeSelect.emit($event.value)\">\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getThemeIcon(settings.appearance.theme) }}</mat-icon>\r\n <span>{{ getThemeLabel(settings.appearance.theme) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"light\">\r\n <div class=\"option-content\">\r\n <mat-icon>light_mode</mat-icon>\r\n <span>Light Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"dark\">\r\n <div class=\"option-content\">\r\n <mat-icon>dark_mode</mat-icon>\r\n <span>Dark Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"auto\">\r\n <div class=\"option-content\">\r\n <mat-icon>brightness_auto</mat-icon>\r\n <span>System</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Language Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Language</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select [value]=\"settings.appearance.language\" (selectionChange)=\"onLanguageSelect.emit($event.value)\">\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <span>{{ getLanguageLabel(settings.appearance.language) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n @for (lang of languages; track lang.code) {\r\n <mat-option [value]=\"lang.code\">\r\n {{ lang.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Voice Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Voice</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Cove</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Data Controls Placeholder -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Data controls</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Manage</button>\r\n </div>\r\n </div>-->\r\n </div>\r\n\r\n <div class=\"section-actions\">\r\n <button mat-button class=\"pill-btn\" (click)=\"onReset.emit()\">Reset to defaults</button>\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" (click)=\"onSave.emit()\">\r\n Apply Changes\r\n </button>\r\n </div>\r\n</div>","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-terms-section',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './terms-section.component.html',\r\n styleUrls: ['./terms-section.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TermsSectionComponent { }\r\n","<div class=\"terms-container\">\r\n <header class=\"pane-header\">\r\n <h1>Terms and Conditions</h1>\r\n <!-- <p class=\"last-updated\">Last updated: January 9, 2026</p> -->\r\n </header>\r\n\r\n <div class=\"terms-card\">\r\n <div class=\"terms-content\">\r\n <section>\r\n <h4>1. Acceptance of Terms</h4>\r\n <p>By using Doohbot, you agree to comply with and be bound by these terms and conditions. Please read\r\n them\r\n carefully.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>2. Privacy & Data</h4>\r\n <p>We value your privacy. Your chat history and personalization settings are stored locally or securely\r\n on\r\n our servers to improve your experience.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>3. Usage Guidelines</h4>\r\n <p>Doohbot is intended for professional use within the Doohclick ecosystem. Misuse or automated scraping\r\n is\r\n strictly prohibited.</p>\r\n </section>\r\n\r\n <div class=\"full-terms-link\">\r\n <a href=\"#\">View Full Terms and Conditions →</a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, inject, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\nexport interface ActiveSession {\r\n id: string;\r\n device: string;\r\n location: string;\r\n created: string;\r\n updated: string;\r\n isCurrent?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-account-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatButtonModule, MatTooltipModule, MatMenuModule],\r\n templateUrl: './account-section.component.html',\r\n styleUrls: ['./account-section.component.scss']\r\n})\r\nexport class AccountSectionComponent {\r\n // private dialogService = inject(DialogService);\r\n private authService = inject(AuthService);\r\n // private cd = inject(ChangeDetectorRef);\r\n\r\n @Input() organizationId: string = '';\r\n public isCopied = false;\r\n\r\n constructor(\r\n private dialogService: DialogService,\r\n private cd: ChangeDetectorRef) { }\r\n\r\n ngOnInit() {\r\n if (!this.organizationId) {\r\n this.organizationId = this.authService.getOrganizationId() || '';\r\n }\r\n }\r\n\r\n @Output() onDeleteAllHistory = new EventEmitter<void>();\r\n @Output() onLogout = new EventEmitter<void>();\r\n @Output() onLogoutAll = new EventEmitter<void>();\r\n @Output() onLogoutSession = new EventEmitter<string>();\r\n @Output() onDeleteAccount = new EventEmitter<void>();\r\n\r\n public confirmLogout() {\r\n this.dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to log out?',\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogout.emit();\r\n });\r\n }\r\n\r\n public sessions: ActiveSession[] = [\r\n {\r\n id: 'session-1',\r\n device: 'Chrome (Windows)',\r\n location: 'Kathmandu, Bagmati Province, NP',\r\n created: 'Jan 9, 2026, 9:21 AM',\r\n updated: 'Jan 9, 2026, 9:21 AM',\r\n isCurrent: true\r\n }\r\n ];\r\n\r\n copyOrgId() {\r\n const orgId = this.authService.getOrganizationId();\r\n if (orgId) {\r\n navigator.clipboard.writeText(orgId);\r\n this.isCopied = true;\r\n this.cd.detectChanges();\r\n\r\n setTimeout(() => {\r\n this.isCopied = false;\r\n this.cd.detectChanges();\r\n }, 800);\r\n }\r\n }\r\n\r\n confirmLogoutAll() {\r\n this.dialogService.open({\r\n title: 'Log out of all devices',\r\n message: 'Are you sure you want to log out of all active devices? You will be signed out everywhere except here.',\r\n confirmText: 'Log out all',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutAll.emit();\r\n });\r\n }\r\n\r\n confirmLogoutSession(session: ActiveSession) {\r\n this.dialogService.open({\r\n title: 'Log out of session',\r\n message: `Are you sure you want to log out from ${session.device} at ${session.location}?`,\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutSession.emit(session.id);\r\n });\r\n }\r\n\r\n confirmDeleteAllHistory() {\r\n this.dialogService.open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAllHistory.emit();\r\n });\r\n }\r\n\r\n confirmDeleteAccount() {\r\n this.dialogService.open({\r\n title: 'Delete Your Account',\r\n message: 'This will permanently delete your account and all associated data. This action is irreversible. Are you absolutely sure?',\r\n confirmText: 'Delete Account',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'person_remove'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAccount.emit();\r\n });\r\n }\r\n}\r\n","<div class=\"account-container\">\r\n <header class=\"pane-header\">\r\n <h1>Account Settings</h1>\r\n <p>Manage your account details and personal information.</p>\r\n </header>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Logout row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Log out</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn primary\" (click)=\"confirmLogout()\">Logout</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Delete all chats row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Delete all chats</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmDeleteAllHistory()\">Delete all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Export data row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Export data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Export</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Org ID row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Organization ID</span>\r\n <span class=\"row-sublabel\">Used for workspace identification</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <code class=\"org-id\">{{ organizationId }}</code>\r\n <button mat-icon-button (click)=\"copyOrgId()\" [matTooltip]=\"isCopied ? 'Copied!' : 'Copy ID'\">\r\n <mat-icon>{{ isCopied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Logout all row -->\r\n <!-- <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Global Logout</span>\r\n <span class=\"row-sublabel\">Sign out from all active devices</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmLogoutAll()\">Logout all</button>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Delete account row -->\r\n <!-- <div class=\"settings-row no-border\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label danger-text\">Delete account</span>\r\n <span class=\"row-sublabel\">Permanently delete your profile and data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger-filled\" (click)=\"confirmDeleteAccount()\">Delete Account</button>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Active Sessions Section -->\r\n <!-- <div class=\"sessions-section\">\r\n <h3>Active sessions</h3>\r\n <div class=\"sessions-table-container\">\r\n <table class=\"sessions-table\">\r\n <thead>\r\n <tr>\r\n <th>Device</th>\r\n <th>Location</th>\r\n <th>Created</th>\r\n <th>Updated</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (session of sessions; track session.id) {\r\n <tr [class.current]=\"session.isCurrent\">\r\n <td>\r\n <div class=\"device-cell\">\r\n <mat-icon>{{ session.device.includes('Windows') ? 'laptop' : 'smartphone' }}</mat-icon>\r\n <div class=\"device-info\">\r\n <span class=\"device-name\">{{ session.device }}</span>\r\n @if (session.isCurrent) {\r\n <span class=\"current-badge\">Current</span>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n <td>{{ session.location }}</td>\r\n <td>{{ session.created }}</td>\r\n <td>{{ session.updated }}</td>\r\n <td class=\"action-cell\">\r\n @if (!session.isCurrent) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"sessionMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #sessionMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item (click)=\"confirmLogoutSession(session)\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Log out of session</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div> -->\r\n</div>","import { DialogService } from './dialog.service';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Utility class for common dialog operations\r\n * Provides reusable dialog configurations for consistency across the application\r\n */\r\nexport class DialogUtils {\r\n /**\r\n * Show a logout confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmLogout(\r\n dialogService: DialogService,\r\n confirmButtonColor: 'primary' | 'accent' | 'warn' = 'warn'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to logout?',\r\n confirmText: 'Logout',\r\n cancelText: 'Cancel',\r\n icon: 'logout',\r\n confirmButtonColor: confirmButtonColor,\r\n });\r\n }\r\n\r\n /**\r\n * Show a reset confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Optional name of what is being reset (default: 'preferences')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmReset(\r\n dialogService: DialogService,\r\n itemName: string = 'preferences'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Reset to Defaults',\r\n message: `Are you sure you want to reset ${itemName} to default settings? This action cannot be undone.`,\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n icon: 'restart_alt',\r\n confirmButtonColor: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Show a delete confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDelete(\r\n dialogService: DialogService,\r\n itemName: string = 'this item'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Show a clear all confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of what is being cleared (e.g., 'chat history', 'all sessions')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmClearAll(\r\n dialogService: DialogService,\r\n itemName: string = 'all items'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Clear All',\r\n message: `Are you sure you want to clear ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n });\r\n }\r\n\r\n /**\r\n * Show a discard changes confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDiscardChanges(dialogService: DialogService): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Discard Changes',\r\n message: 'You have unsaved changes. Are you sure you want to discard them?',\r\n confirmText: 'Discard',\r\n cancelText: 'Keep Editing',\r\n confirmButtonColor: 'warn',\r\n icon: 'warning',\r\n });\r\n }\r\n}\r\n\r\n\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-instruction-section',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatButtonModule],\r\n templateUrl: './instruction-section.component.html',\r\n styleUrls: ['./instruction-section.component.scss'],\r\n})\r\nexport class InstructionSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() hasChanges = false;\r\n @Output() onSave = new EventEmitter<void>();\r\n}","<div class=\"instruction-container\">\r\n <header class=\"pane-header\">\r\n <h1>Personalization</h1>\r\n <p>Tell us more about yourself and how you want the assistant to respond.</p>\r\n </header>\r\n\r\n <div class=\"instruction-card\">\r\n <div class=\"instruction-fields\">\r\n <div class=\"field-item\">\r\n <label>What should the assistant know about you?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.preferences\"\r\n placeholder=\"e.g. I prefer code examples in TypeScript...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"field-item\">\r\n <label>How should the assistant respond?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.instructions\"\r\n placeholder=\"e.g. Be concise and use bullet points...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"section-actions\">\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" [disabled]=\"!hasChanges\" (click)=\"onSave.emit()\">\r\n Save\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule, CommonModule],\r\n})\r\nexport class SnackBar implements OnInit {\r\n // private snackBarRef = inject(MatSnackBarRef);\r\n // private data = inject(MAT_SNACK_BAR_DATA);\r\n\r\n public message: string | null = null;\r\n public type: SnackBarError = 'error';\r\n\r\n constructor(\r\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\r\n private snackBarRef: MatSnackBarRef<any>\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.message = this.data.message;\r\n this.type = this.data.type || 'error';\r\n }\r\n\r\n close() {\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n get icon(): string {\r\n switch (this.type) {\r\n case 'success':\r\n return 'check_circle';\r\n case 'error':\r\n return 'error';\r\n case 'warn':\r\n return 'warning';\r\n case 'info':\r\n return 'info';\r\n default:\r\n return 'info';\r\n }\r\n }\r\n}\r\n","<div class=\"snackbar-message\" [ngClass]=\"'type-' + type\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">{{ icon }}</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\nimport { SnackBar } from './snackbar.component';\r\nimport { SnackbarUtils } from './snackbar.utils';\r\n\r\nexport interface SnackbarConfig {\r\n message: string;\r\n duration?: number;\r\n type: SnackBarError;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnackbarService {\r\n // private snackBar = inject(MatSnackBar);\r\n\r\n constructor(private snackBar: MatSnackBar) {\r\n SnackbarUtils.init(this);\r\n }\r\n\r\n // Generic show method\r\n private show(message: string, duration: number, type: SnackBarError) {\r\n this.snackBar.openFromComponent(SnackBar, {\r\n duration: duration,\r\n data: { message, type },\r\n horizontalPosition: 'end',\r\n verticalPosition: 'bottom',\r\n panelClass: [`snackbar-${type}`]\r\n });\r\n }\r\n\r\n // Convenience methods\r\n success(message: string, duration: number = 3000) {\r\n this.show(message, duration, 'success');\r\n }\r\n\r\n warn(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'warn');\r\n }\r\n\r\n error(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'error');\r\n }\r\n\r\n info(message: string, duration: number = 4000) {\r\n this.show(message, duration, 'info');\r\n }\r\n\r\n clear() {\r\n this.snackBar.dismiss();\r\n }\r\n}\r\n","import { Component, inject, OnDestroy, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';\r\nimport { TermsSectionComponent } from './sections/terms/terms-section.component';\r\nimport { AccountSectionComponent } from './sections/account/account-section.component';\r\nimport { ChatHistoryService } from '../chat/services/chat-history.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { PersonalizationService, PersonalizationSettings } from './personalization.service';\r\nimport { DialogService } from '../../shared/dialog/dialog.service';\r\nimport { DialogUtils } from '../../shared/dialog/dialog.utils';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\nimport { InstructionSectionComponent } from './sections/instruction/instruction-section.component';\r\n\r\n@Component({\r\n selector: 'app-personalization-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTabsModule,\r\n MatSlideToggleModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n PreferencesSectionComponent,\r\n InstructionSectionComponent,\r\n TermsSectionComponent,\r\n AccountSectionComponent,\r\n ],\r\n templateUrl: './personalization-dialog.component.html',\r\n styleUrls: ['./personalization-dialog.component.scss'],\r\n})\r\nexport class PersonalizationDialogComponent implements OnDestroy {\r\n // private dialogRef = inject(MatDialogRef<PersonalizationDialogComponent>);\r\n // private dialogService = inject(DialogService);\r\n public personalization = inject(PersonalizationService);\r\n private authService = inject(AuthService);\r\n private chatHistory = inject(ChatHistoryService);\r\n // private snackbar = inject(SnackbarService);\r\n\r\n // Local copy of settings for editing\r\n public settings: PersonalizationSettings = JSON.parse(\r\n JSON.stringify(this.personalization.settings()),\r\n );\r\n\r\n public activeSection = 'preferences';\r\n\r\n public sections = [\r\n { id: 'preferences', label: 'General', icon: 'tune', type: 'item' },\r\n { id: 'general', label: 'Personalization', icon: 'settings_suggest', type: 'item' },\r\n { id: 'account_settings', label: 'Account & Security', icon: 'manage_accounts', type: 'item' },\r\n { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },\r\n ];\r\n\r\n // colorTokens removed\r\n\r\n private themeService = inject(ThemeService);\r\n private isSaved = false;\r\n\r\n constructor(\r\n private dialogRef: MatDialogRef<PersonalizationDialogComponent>,\r\n private dialogService: DialogService,\r\n private snackbar: SnackbarService,\r\n ) {\r\n effect(() => {\r\n const s = this.personalization.settings();\r\n this.settings = structuredClone(s);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.personalization.loadCustomInstructions();\r\n }\r\n\r\n onSave() {\r\n if (this.activeSection === 'preferences') {\r\n this.isSaved = true;\r\n this.personalization.updateAppearance(this.settings.appearance);\r\n // Re-apply to ensure consistency (effect handles it, but just in case)\r\n this.snackbar.success('Appearance settings saved');\r\n } else if (this.activeSection === 'general') {\r\n this.personalization.saveCustomInstructions(this.settings.customInstructions);\r\n this.snackbar.success('Settings saved');\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close(false);\r\n // ngOnDestroy will handle revert\r\n }\r\n\r\n ngOnDestroy() {\r\n // No color revert needed since primaryColor is config-driven\r\n }\r\n\r\n onReset() {\r\n DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Only reset the current section\r\n if (this.activeSection === 'preferences') {\r\n // Reset only appearance settings to defaults\r\n this.personalization.resetToDefaults();\r\n // Re-clone settings to update UI\r\n this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));\r\n }\r\n }\r\n });\r\n }\r\n\r\n selectTheme(theme: 'light' | 'dark' | 'auto') {\r\n this.settings.appearance.theme = theme;\r\n }\r\n\r\n selectLanguage(language: string) {\r\n this.settings.appearance.language = language;\r\n }\r\n\r\n selectSection(sectionId: string) {\r\n if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {\r\n this.activeSection = sectionId;\r\n }\r\n }\r\n\r\n get hasChanges(): boolean {\r\n if (this.activeSection === 'preferences') return this.hasPreferencesChanges();\r\n if (this.activeSection === 'general') return this.hasInstructionChanges();\r\n return false;\r\n }\r\n\r\n hasPreferencesChanges(): boolean {\r\n const original = this.personalization.settings().appearance;\r\n const current = this.settings.appearance;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n hasInstructionChanges(): boolean {\r\n const original = this.personalization.settings().customInstructions;\r\n const current = this.settings.customInstructions;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n get username(): string {\r\n return this.authService.loggedInUserName();\r\n }\r\n\r\n get userImageUrl(): string | null {\r\n return this.authService.loggedInUserImageUrl();\r\n }\r\n\r\n get userRole(): string {\r\n return this.authService.loggedInUserRole();\r\n }\r\n\r\n // Color helpers removed\r\n\r\n async deleteAllHistory() {\r\n const userId = this.authService.getUserId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n }\r\n\r\n logoutAllDevices() {\r\n console.log('Logging out of all devices...');\r\n // Implement service call when API is ready\r\n }\r\n\r\n logout() {\r\n this.authService.logout();\r\n this.dialogRef.close(true);\r\n }\r\n\r\n deleteAccount() {\r\n console.log('Deleting account...');\r\n // Implement service call when API is ready\r\n }\r\n}\r\n","<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"dialog-content-body\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div class=\"nav-item\" [class.active]=\"activeSection === section.id\" (click)=\"selectSection(section.id)\">\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section [settings]=\"settings\" [username]=\"username\" [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\" (onThemeSelect)=\"selectTheme($event)\" (onLanguageSelect)=\"selectLanguage($event)\"\r\n (onSave)=\"onSave()\" (onReset)=\"onReset()\">\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Security Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section (onDeleteAllHistory)=\"deleteAllHistory()\" (onLogout)=\"logout()\"\r\n (onLogoutAll)=\"logoutAllDevices()\" (onDeleteAccount)=\"deleteAccount()\"></app-account-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-instruction-section [settings]=\"settings\" [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"></app-instruction-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </div>\r\n</div>","import {\r\n Component,\r\n input,\r\n output,\r\n TrackByFunction,\r\n OnDestroy,\r\n OnInit,\r\n DestroyRef,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { ChatHeaderComponent } from '../chat-header/chat-header.component';\r\nimport { LoginFormComponent } from '../../../login/login-form.component';\r\nimport { ChatFooterComponent } from '../chat-footer/chat-footer.component';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { ChatSessionDto } from '../../model/chat-session.model';\r\nimport { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';\r\nimport { LoginRequest } from 'projects/doohbot/src/lib/core/auth/models/login-request.model';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ChatHistorySidebarComponent,\r\n ChatHeaderComponent,\r\n LoginFormComponent,\r\n ChatFooterComponent,\r\n FormsModule,\r\n MatDialogModule,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy {\r\n //inputs\r\n isChatOpen = input(false);\r\n enableDrag = input(false);\r\n enableResize = input(false);\r\n isFullScreen = input(false);\r\n isStreaming = input(true);\r\n messages = input<Message[]>([]);\r\n isBotTyping = input(false);\r\n suggestedMessages = input<string[]>([]);\r\n predefinedMessages = input<string[]>([]);\r\n userName = input('');\r\n trackByMessageId = input<TrackByFunction<Message>>((index, item) => item.id ?? index);\r\n messageError = input<string | null>(null);\r\n showSuggestionChips = input(false);\r\n isHistorySidebarOpen = input(false);\r\n chatSessions = input<ChatSessionDto[]>([]);\r\n chatHistoryUserName = input('User');\r\n\r\n // auth inputs\r\n isLoggingIn = input(false);\r\n authError = input<string | null>(null);\r\n authSuccess = input<string | null>(null);\r\n isLoadingSessions = input(false);\r\n hasMoreSessions = input(false);\r\n isLoadingMoreSessions = input(false);\r\n processingSessionId = input<string | null>(null);\r\n themeConfig = input<DoohbotThemeConfig | undefined>();\r\n buttonStyle = input('fab');\r\n\r\n //outputs\r\n toggleChat = output<void>();\r\n toggleFullScreen = output<void>();\r\n toggleHistorySidebar = output<void>();\r\n openSettings = output<void>();\r\n suggestionClick = output<string>();\r\n send = output<string>();\r\n clearMessageError = output<void>();\r\n clearChat = output<void>();\r\n sessionSelected = output<ChatSessionDto>();\r\n sessionDeleted = output<string>();\r\n loadMoreSessions = output<void>();\r\n refreshSessions = output<void>();\r\n sessionRenamed = output<{ sessionId: string; newTitle: string }>();\r\n deleteAllSessions = output<void>();\r\n\r\n // auth outputs\r\n loginSubmit = output<LoginRequest>();\r\n logout = output<void>();\r\n //signal\r\n public isAuthenticated = signal(false);\r\n\r\n //services\r\n public themeService = inject(ThemeService);\r\n public authService = inject(AuthService);\r\n\r\n // UI state\r\n public showLoginForm = signal(false);\r\n\r\n public canDrag = computed(() => {\r\n return this.enableDrag() && this.buttonStyle() === 'fab' && !this.isFullScreen();\r\n });\r\n\r\n public canResize = computed(() => {\r\n return this.enableResize() && this.buttonStyle() === 'fab' && !this.isFullScreen();\r\n });\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private destroyRef: DestroyRef,\r\n ) {\r\n // Reaction for auth/login state changes\r\n let isFirstRun = true;\r\n effect(\r\n () => {\r\n const authenticated = this.isAuthenticated();\r\n const loggingIn = this.isLoggingIn();\r\n\r\n if (isFirstRun) {\r\n untracked(() => {\r\n isFirstRun = false;\r\n });\r\n return;\r\n }\r\n\r\n // Handle authentication or logging in status changes\r\n if (authenticated || loggingIn) {\r\n this.showLoginForm.set(false);\r\n } else {\r\n // Only show login if we were trying to log in and failed/stopped (transition to !loggingIn),\r\n // and we are not authenticated.\r\n this.showLoginForm.set(true);\r\n }\r\n },\r\n { allowSignalWrites: true }, //TODO\r\n );\r\n }\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onLoginClick() {\r\n this.showLoginForm.set(true);\r\n }\r\n\r\n onLoginSubmit(param: LoginRequest) {\r\n this.loginSubmit.emit(param);\r\n }\r\n\r\n onCancelLogin() {\r\n this.showLoginForm.set(false);\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onOpenPersonalization() {\r\n this.dialog.open(PersonalizationDialogComponent, {\r\n width: '1100px',\r\n height: '700px',\r\n maxWidth: '95vw',\r\n panelClass: 'personalization-dialog-panel',\r\n });\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearAuthError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n\r\n onLogout() {\r\n this.logout.emit();\r\n }\r\n\r\n onSessionSelected(session: ChatSessionDto) {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onSessionDeleted(sessionId: string) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n\r\n onSessionRenamed(event: { sessionId: string; newTitle: string }) {\r\n this.sessionRenamed.emit(event);\r\n }\r\n\r\n onDeleteAllSessions() {\r\n this.deleteAllSessions.emit();\r\n }\r\n\r\n onPopoutShown(win: Window) {\r\n // Apply theme classes\r\n const activeTheme = this.themeService.activeTheme();\r\n // Logger.info('Popout shown, applying theme:', activeTheme);\r\n\r\n const body = win.document.body;\r\n // We cannot use renderer easily on another document without custom renderer factory,\r\n // but native DOM manipulation is fine here since it's a separate window object.\r\n body.classList.remove('light-theme', 'dark-theme');\r\n body.classList.add(activeTheme);\r\n\r\n // Apply CSS variables\r\n this.themeService.applyCssVariables(body, this.themeConfig());\r\n }\r\n\r\n ngOnInit() {\r\n // Initialization logic if needed\r\n\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((value) => {\r\n this.isAuthenticated.set(value);\r\n // Logger.info('Is Authenticated:', value);\r\n });\r\n }\r\n\r\n ngOnDestroy() { }\r\n}\r\n","@if (isChatOpen()) {\r\n<div draggableDialog [enableDrag]=\"canDrag()\" resizableDialog [enableResize]=\"canResize()\" class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen()\" [class.layout-sidebar]=\"buttonStyle().includes('sidebar')\">\r\n <!-- chat window header -->\r\n <app-chat-header [isAuthenticated]=\"isAuthenticated()\" [isFullScreen]=\"isFullScreen()\" [settingsMenu]=\"settingsMenu\"\r\n [isNewChatDisabled]=\"messages().length === 0\" (toggleChat)=\"onToggleChat()\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\" (toggleHistorySidebar)=\"onToggleHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"></app-chat-header>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [class.sidebar-closed]=\"(!isHistorySidebarOpen() && !isFullScreen()) || (isFullScreen() && !isAuthenticated())\"\r\n [sessions]=\"chatSessions()\" [isOpen]=\"isHistorySidebarOpen() || (isFullScreen() && isAuthenticated())\"\r\n [userName]=\"chatHistoryUserName()\" [isLoading]=\"isLoadingSessions()\" [hasMoreSessions]=\"hasMoreSessions()\"\r\n [isLoadingMore]=\"isLoadingMoreSessions()\" [isFullScreen]=\"isFullScreen()\"\r\n [processingSessionId]=\"processingSessionId()\" (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\" (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\" (sessionRenamed)=\"onSessionRenamed($event)\" (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onToggleHistorySidebar()\">\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen() && !isFullScreen()\">\r\n <!-- Messages / Welcome Screen -->\r\n @if (!showLoginForm()) {\r\n <app-message-list [messages]=\"messages()\" [isBotTyping]=\"isBotTyping()\" [isStreaming]=\"isStreaming()\"\r\n [predefinedMessages]=\"predefinedMessages()\" [userName]=\"userName()\" [isAuthenticated]=\"isAuthenticated()\"\r\n [isLoggingIn]=\"isLoggingIn()\" [trackByMessageId]=\"trackByMessageId()\"\r\n (suggestionClick)=\"onSuggestionClick($event)\" (loginClick)=\"onLoginClick()\"></app-message-list>\r\n }\r\n\r\n @if (showSuggestionChips() && isAuthenticated()) {\r\n <app-chips [messages]=\"suggestedMessages()\" [disabled]=\"isBotTyping()\"\r\n (chipClick)=\"onSuggestionClick($event)\"></app-chips>\r\n }\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n @if (isAuthenticated()) {\r\n <app-message-input [isBotTyping]=\"isBotTyping()\" (send)=\"onSend($event)\"></app-message-input>\r\n }\r\n\r\n <!-- Login Form -->\r\n @if (showLoginForm() && !isAuthenticated()) {\r\n <app-login-form [isLoggingIn]=\"isLoggingIn()\" (loginSubmit)=\"onLoginSubmit($event)\"\r\n (cancel)=\"onCancelLogin()\"></app-login-form>\r\n }\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <!-- <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar> -->\r\n\r\n <!-- footer -->\r\n <app-chat-footer [showDisclaimer]=\"messages().length > 0\"></app-chat-footer>\r\n </div>\r\n </div>\r\n</div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Personalization -->\r\n @if (isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onOpenPersonalization()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>settings_suggest</mat-icon>\r\n <span>Personalization</span>\r\n </button>\r\n }\r\n\r\n <!-- Change Theme -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen() ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n @if (isAuthenticated() && messages().length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon> clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (isAuthenticated()) {\r\n <button mat-menu-item (click)=\"onLogout()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n})\r\nexport class FullscreenDirective {\r\n private isFullScreen = false;\r\n private preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n @Input() fullscreenTarget: string = '.chat-window';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n public toggle(): void {\r\n const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);\r\n if (!targetEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: targetEl.style.width,\r\n height: targetEl.style.height,\r\n left: targetEl.style.left,\r\n top: targetEl.style.top,\r\n };\r\n\r\n targetEl.style.width = '';\r\n targetEl.style.height = '';\r\n targetEl.style.left = '';\r\n targetEl.style.top = '';\r\n targetEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n targetEl.style.width = this.preFullscreenState.width;\r\n targetEl.style.height = this.preFullscreenState.height;\r\n targetEl.style.left = this.preFullscreenState.left;\r\n targetEl.style.top = this.preFullscreenState.top;\r\n targetEl.style.transform = ''; // Clear transform to allow CSS transitions/classes\r\n }\r\n }\r\n }\r\n\r\n public getFullscreenState(): boolean {\r\n return this.isFullScreen;\r\n }\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { DOOHBOT_CONFIG } from '../config/doohbot-config.token';\r\nimport { DoohbotConfig } from '../config/doohbot-config.model';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LicenseService {\r\n constructor(\r\n private http: HttpClient,\r\n @Inject(DOOHBOT_CONFIG) private config: DoohbotConfig,\r\n ) { }\r\n\r\n /**\r\n * Loads license file from a public asset URL.\r\n * Library-safe: works only with HTTP-accessible paths.\r\n */\r\n async loadLicenseFile(): Promise<Map<string, string> | undefined> {\r\n const licenseUrl = this.config.licenseFilePath;\r\n\r\n if (!licenseUrl) {\r\n Logger.warn('[LicenseService] No licenseFilePath provided');\r\n return undefined;\r\n }\r\n\r\n try {\r\n const data = await firstValueFrom(this.http.get<Record<string, string>>(licenseUrl));\r\n\r\n if (!data || typeof data !== 'object') {\r\n throw new Error('Invalid license file');\r\n }\r\n\r\n return new Map(Object.entries(data));\r\n } catch (error) {\r\n Logger.error('[LicenseService] Failed to load license file:', licenseUrl, error);\r\n return undefined;\r\n }\r\n }\r\n\r\n // async loadLicenseFile(filePath?: string): Promise<void> {\r\n // try {\r\n // const finalPath = filePath || this.configService.licenseFilePath;\r\n\r\n // const data = await firstValueFrom(this.http.get<any>(finalPath));\r\n // if (!data) {\r\n // throw new Error('Empty license file');\r\n // }\r\n\r\n // this.processFlatMapLicense(data);\r\n\r\n // // // Detection: Hierarchical Format (subjectId/licenses array)\r\n // // if (data.licenses && Array.isArray(data.licenses)) {\r\n // // this.processHierarchicalLicense(data);\r\n // // }\r\n // // // Detection: Flat Map Format (packageId: key)\r\n // // else {\r\n // // this.processFlatMapLicense(data);\r\n // // }\r\n // } catch (error) {\r\n // // Industry pattern: Silent loading for optional registry files\r\n // Logger.info(\r\n // '[LicenseService] No external license file found or failed to load. Falling back to AppConst.',\r\n // );\r\n // this.licenses.set(null);\r\n // }\r\n // }\r\n\r\n // private processFlatMapLicense(data: Record<string, string>): void {\r\n // // Flat-map format: { \"tenantName\": \"license_key\" }\r\n // // Convert each entry to: tenant:tenantName -> { doohbot: license_key }\r\n\r\n // // const subjectMap = new Map<string, LicensePackage>();\r\n // // Object.entries(data).forEach(([tenantName, licenseCode]) => {\r\n // // const tenantKey = `tenant:${tenantName}`;\r\n // // subjectMap.set(tenantKey, {\r\n // // doohbot: licenseCode,\r\n // // });\r\n // // });\r\n\r\n // const licenseKey = data[]\r\n // this.licenses.set();\r\n // // this.registry.set({\r\n // // accountId: 'FLAT_MAP_REGISTRY',\r\n // // subjectLicenses: subjectMap,\r\n // // });\r\n\r\n // Logger.info(`[LicenseService] Flat-map registry loaded with ${subjectMap.size} tenant(s)`);\r\n // }\r\n\r\n // private processHierarchicalLicense(data: LicenseFileContent): void {\r\n // const subjectMap = new Map<string, LicensePackage>();\r\n\r\n // data.licenses.forEach((license) => {\r\n // const key = `${license.subjectType}:${license.subjectId}`;\r\n // subjectMap.set(key, license.packages);\r\n // });\r\n\r\n // this.registry.set({\r\n // accountId: data.accountId,\r\n // subjectLicenses: subjectMap,\r\n // });\r\n\r\n // Logger.info(`[LicenseService] Hierarchical Registry loaded for account: ${data.accountId}`);\r\n // }\r\n\r\n /**\r\n * Resolve the correct license key based on context and requested package\r\n * @param context The current licensing context (tenant, user, roles)\r\n * @param packageId The ID of the package requesting a license\r\n * @returns The resolved license key, or null if unauthorized\r\n */\r\n // resolveLicenseCode(context: LicensingContext, packageId: string): string | null {\r\n // // Hierarchical Registry (Most Specific)\r\n // const keyFromRegistry = this.resolveFromRegistry(context, packageId);\r\n // if (keyFromRegistry) return keyFromRegistry;\r\n\r\n // Logger.warn(\r\n // `[LicenseService] No license found for package: ${packageId} and user: ${context.principalId}`,\r\n // );\r\n // return null;\r\n // }\r\n\r\n // private resolveFromRegistry(context: LicensingContext, packageId: string): string | null {\r\n // const reg = this.registry();\r\n // if (!reg) return null;\r\n\r\n // // Strict Account Check\r\n // if (reg.accountId !== 'EXTERNAL_OVERRIDE' && reg.accountId !== context.tenantId) {\r\n // Logger.error(\r\n // `[LicenseService] Account mismatch! Registry: ${reg.accountId}, Context: ${context.tenantId}`,\r\n // );\r\n // return null;\r\n // }\r\n\r\n // const subjectsToSearch = [\r\n // `user:${context.principalId}`,\r\n // ...(context.roles?.map((r) => `role:${r}`) || []),\r\n // `tenant:${context.tenantId}`,\r\n // 'tenant:default', // Fallback for flat-map external files\r\n // ];\r\n\r\n // for (const subjectKey of subjectsToSearch) {\r\n // const packages = reg.subjectLicenses.get(subjectKey);\r\n // if (packages && packages[packageId]) {\r\n // Logger.debug(`[LicenseService] Resolved key for ${packageId} via Registry (${subjectKey})`);\r\n // return packages[packageId];\r\n // }\r\n // }\r\n // return null;\r\n // }\r\n\r\n /**\r\n * Resolves the license key for the current tenant.\r\n */\r\n // resolveTenantLicenseCode(tenancyName?: string): string | null {\r\n // const activeTenancy = tenancyName || this.configService.tenancyName;\r\n\r\n // if (!activeTenancy) {\r\n // Logger.warn('[LicenseService] No tenancy name found.');\r\n // return null;\r\n // }\r\n\r\n // const reg = this.registry();\r\n // if (!reg) {\r\n // Logger.error('[LicenseService] License registry not loaded.');\r\n // return null;\r\n // }\r\n\r\n // const tenantLicenses = reg.subjectLicenses.get(`tenant:${activeTenancy}`);\r\n // const licenseCode = tenantLicenses?.['doohbot'] || null;\r\n\r\n // if (licenseCode) {\r\n // Logger.info(`[LicenseService] Resolved Doohbot license for: ${activeTenancy}`);\r\n // } else {\r\n // Logger.warn(`[LicenseService] No license key found for tenant: ${activeTenancy}`);\r\n // }\r\n\r\n // return licenseCode;\r\n // }\r\n\r\n /**\r\n * Check if a registry is currently loaded\r\n */\r\n // isRegistryLoaded(): boolean {\r\n // return this.registry() !== null;\r\n // }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Renderer2,\r\n signal,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { doohbotConst } from './const/doohbot-constant';\r\nimport { LoginRequest } from './core/auth/models/login-request.model';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\nimport { PredefinedMessages, SuggestedMessages } from './predefined_messages';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { FullscreenDirective } from './core/directives/fullscreen/fullscreen.directive';\r\nimport { ChatHistoryService } from './app/chat/services/chat-history.service';\r\nimport { ChatUIStateService } from './app/chat/chat-ui-state.service';\r\nimport { ChatSessionDto } from './app/chat/model/chat-session.model';\r\nimport { ChatService } from './app/chat/chat.service';\r\nimport { DialogService } from './shared/dialog/dialog.service';\r\nimport { DialogUtils } from './shared/dialog/dialog.utils';\r\nimport { PersonalizationService } from './app/personalization/personalization.service';\r\nimport { LicenseService } from './core/services/license.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { Message } from './core/models/message';\r\nimport { SnackbarUtils } from './shared/snackbar/snackbar.utils';\r\nimport { SnackbarService } from './shared/snackbar/snackbar.service';\r\n\r\n/**\r\n * Doohbot Main Component\r\n * Root component of the Doohbot library\r\n */\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DoohbotComponent implements OnInit, OnDestroy {\r\n /**\r\n * Federated authentication token from the host application.\r\n *\r\n * Used for SSO / federated login. The token must be issued by a\r\n * trusted issuer configured in the Doohbot admin panel.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [federatedAuthToken]=\"authToken\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() federatedAuthToken?: string;\r\n\r\n /**\r\n * Whether the user session should be persisted across browser restarts.\r\n *\r\n * When `true`, Doohbot stores auth state in `localStorage`.\r\n * When `false`, `sessionStorage` is used instead.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [rememberMe]=\"true\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() rememberMe?: boolean;\r\n\r\n /**\r\n * License file json object.\r\n *\r\n * Required only when the `licenseFilePath` is not passed from `provideDoohbot()`.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseFile]=\"licenseFile\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseFile?: Map<string, string>;\r\n\r\n /**\r\n * License code used to activate licensed features.\r\n *\r\n * Required only when multiple licenses are configured.\r\n * Can change dynamically per tenant, user, or role.\r\n *\r\n * @example\r\n * ```html\r\n * <app-doohbot [licenseCode]=\"licenseCode\"></app-doohbot>\r\n * ```\r\n */\r\n @Input() licenseCode?: string;\r\n\r\n // UI State signals\r\n public isChatOpen = signal(false);\r\n public isHistorySidebarOpen = signal(false);\r\n public isFullScreen = signal(false);\r\n // TODO: Refactor 'any' to specific types (e.g., Signal<number> or number) for better type safety.\r\n public unreadCount: any;\r\n\r\n // Chat State signals\r\n public messages = signal<Message[]>([]);\r\n public isBotTyping = signal(false);\r\n // TODO: Use a more descriptive type for streaming state.\r\n public isStreaming: any;\r\n // TODO: Use a typed Error model instead of 'any'.\r\n public messageError: any;\r\n // TODO: Define a boolean or Signal<boolean> type.\r\n public showSuggestionChips: any;\r\n public chatSessions = signal<ChatSessionDto[]>([]);\r\n public hasMoreHistory = signal(false);\r\n public isLoadingMore = signal(false);\r\n public isLoadingSessions = signal(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n // Auth State signals\r\n public isAuthenticated = signal<boolean>(false);\r\n public isLoggingIn = signal(false);\r\n public authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n\r\n private destroyIsAuthenticated$ = new Subject<void>();\r\n\r\n // Personalization\r\n // TODO: Avoid 'any' for styles. Use a typed object or CSS record.\r\n public activeButtonStyle: any;\r\n\r\n // Configuration exposure for template\r\n public get enableDrag(): boolean {\r\n return this.configService?.theme()?.enableDrag ?? false;\r\n }\r\n\r\n public get enableResize(): boolean {\r\n return this.configService?.theme()?.enableResize ?? false;\r\n }\r\n\r\n public userName = signal<string>('User');\r\n public predefinedMessages = signal<string[]>(PredefinedMessages);\r\n public suggestedMessages = signal<string[]>(SuggestedMessages);\r\n public maxMessageLength = signal<number>(1000);\r\n\r\n // Constants\r\n readonly doohbotConst = doohbotConst;\r\n\r\n // Context cleanup\r\n // TODO: Consider moving context management into a dedicated ContextService to decouple it from the UI component.\r\n private contextCleanup?: () => void;\r\n\r\n // ========================= Component refs ======================\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n @ViewChild(FullscreenDirective) fullscreenDirective!: FullscreenDirective;\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n private dialogService: DialogService,\r\n private snackbarService: SnackbarService,\r\n private chatHistory: ChatHistoryService,\r\n private uiState: ChatUIStateService,\r\n private themeService: ThemeService,\r\n private authService: AuthService,\r\n private chatService: ChatService,\r\n private personalizationService: PersonalizationService,\r\n private licenseService: LicenseService,\r\n private configService: DoohbotConfigService,\r\n ) {\r\n // Theme management effect\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n\r\n // Apply theme configuration from global config\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n // Apply palette class to host for robust variable inheritance (only to library for global styles)\r\n const paletteClasses = ['db-theme-doohbot', 'db-theme-aqua', 'db-theme-candy', 'db-theme-forest', 'db-theme-midnight', 'db-theme-sunset', 'db-theme-slate'];\r\n paletteClasses.forEach((cls) => this.renderer.removeClass(host, cls));\r\n const palette = themeConfig.palette || 'doohbot';\r\n this.renderer.addClass(host, `db-theme-${palette}`);\r\n }\r\n });\r\n }\r\n\r\n async ngOnInit() {\r\n Logger.info('Initializing DoohbotComponent');\r\n\r\n this.initVariableState();\r\n\r\n // Button style is now handled directly via configService.theme()\r\n\r\n // License\r\n if (!this.licenseFile) {\r\n // Resolve using licenseFilePath\r\n this.licenseFile = await this.licenseService.loadLicenseFile();\r\n }\r\n if (this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n Logger.info('licenseFile changed', this.licenseFile);\r\n }\r\n\r\n // Apply theme from global configuration early to register root element\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n this.themeService.setThemeConfig(themeConfig, this.elementRef.nativeElement);\r\n }\r\n\r\n // Init federated auth\r\n this.authService.initFederatedAuthFlow();\r\n this.authService.initNormalLoginAuthState();\r\n\r\n // Auth state\r\n this.authService.isAuthenticated$\r\n .pipe(takeUntil(this.destroyIsAuthenticated$))\r\n .subscribe((value) => {\r\n this.isAuthenticated.set(value);\r\n if (value) {\r\n this.initializeUI();\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['licenseFile'] && this.licenseFile) {\r\n this.authService.setLicenseFile(this.licenseFile);\r\n Logger.info('licenseFile changed', this.licenseFile);\r\n }\r\n\r\n if (changes['licenseCode'] && this.licenseCode) {\r\n this.authService.setLicenseCode(this.licenseCode);\r\n Logger.info('licenseCode changed', this.licenseCode);\r\n }\r\n\r\n if (changes['federatedAuthToken'] && this.federatedAuthToken) {\r\n this.authService.setFederatedAuthToken(this.federatedAuthToken);\r\n Logger.info('federatedAuthToken changed', this.federatedAuthToken);\r\n }\r\n\r\n if (changes['rememberMe'] && this.rememberMe) {\r\n this.authService.setRememberMe(this.rememberMe);\r\n Logger.info('rememberMe changed', this.rememberMe);\r\n }\r\n }\r\n\r\n initVariableState() {\r\n // UI State signals\r\n this.isChatOpen = this.uiState.isChatOpen;\r\n this.isHistorySidebarOpen = this.uiState.isHistorySidebarOpen;\r\n this.isFullScreen = this.uiState.isFullScreen;\r\n this.unreadCount = this.uiState.unreadCount;\r\n\r\n // Chat State signals\r\n this.messages = this.chatService.messages;\r\n this.isBotTyping = this.chatService.isBotTyping;\r\n this.isStreaming = this.chatService.isStreaming;\r\n this.messageError = computed(() => this.chatService.apiError()?.message || null);\r\n this.showSuggestionChips = this.chatService.showSuggestionChips;\r\n this.chatSessions = this.chatHistory.sessions;\r\n this.hasMoreHistory = this.chatHistory.hasMore;\r\n this.isLoadingMore = this.chatHistory.isLoadingMore;\r\n this.isLoadingSessions = this.chatHistory.isLoading;\r\n this.processingSessionId = this.chatHistory.processingSessionId;\r\n\r\n // Auth State signals\r\n // this.isAuthenticated = this.chatFacade.isAuthenticated;\r\n // TODO\r\n this.isLoggingIn = this.authService.isLoggingIn;\r\n this.authError = this.authService.authError;\r\n this.authSuccess = this.authService.authSuccess;\r\n // TODO\r\n // Personalization\r\n this.activeButtonStyle = computed(() => this.configService.theme()?.buttonStyle || 'fab');\r\n\r\n // Setup messages signal ref for UI state service\r\n this.uiState.setMessagesSignal(this.chatService.messages);\r\n }\r\n\r\n private initializeUI() {\r\n // TODO\r\n // Apply theme from global configuration\r\n const themeConfig = this.configService.theme();\r\n if (themeConfig) {\r\n this.themeService.setThemeConfig(themeConfig, this.elementRef.nativeElement);\r\n }\r\n\r\n // Set user metadata\r\n this.userAvatarUrl();\r\n this.updateUserName();\r\n\r\n // Start new session\r\n this.chatService.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n if (!this.contextCleanup) {\r\n // TODO\r\n this.uiState.resetLastRead();\r\n }\r\n }\r\n\r\n //! ====================== AUTHENTICATION ==================\r\n onLogin(param: LoginRequest): void {\r\n this.authService.login(param);\r\n }\r\n\r\n performLogout() {\r\n this.dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to logout?',\r\n icon: 'logout',\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.authService.logout();\r\n });\r\n }\r\n\r\n //! ====================== CHAT OPERATIONS =====================\r\n\r\n toggleChat(): void {\r\n this.uiState.toggleChat();\r\n }\r\n\r\n async sendMessage(text: string): Promise<void> {\r\n await this.chatService.sendMessage(text, this.maxMessageLength());\r\n // Invalidate cache after sending message\r\n // TODO\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n clearChat(): void {\r\n const userId = this.authService.getUserId() || '';\r\n this.chatService.clearMessages();\r\n }\r\n\r\n clearMessageError(): void {\r\n // TODO\r\n this.chatService.apiError.set(null);\r\n }\r\n\r\n //! ===================== SESSION MANAGEMENT =======================\r\n\r\n toggleHistorySidebar(): void {\r\n const isNowOpen = !this.uiState.isHistorySidebarOpen();\r\n if (isNowOpen) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n }\r\n this.uiState.toggleHistorySidebar();\r\n }\r\n\r\n loadChatSession(session: ChatSessionDto): void {\r\n if (!session.response_id) {\r\n return;\r\n }\r\n Logger.info(`Session selected: ${session.response_id}. continuing session...`);\r\n this.chatService.continueSession(session.response_id);\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n async deleteSession(sessionId: string): Promise<void> {\r\n Logger.info(`Deleting session: ${sessionId}`);\r\n const userId = this.authService.getUserId() || '';\r\n\r\n await this.chatHistory.deleteSession(sessionId, userId.toString());\r\n // Invalidate cache after deletion\r\n this.chatHistory.invalidateCache();\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === sessionId) {\r\n Logger.info('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n\r\n // this.chatHistory.deleteSession(sessionId, userId.toString()).subscribe(() => {\r\n // // Invalidate cache after deletion\r\n // this.chatHistory.invalidateCache();\r\n\r\n // // If deleted session is currently active, start a new one\r\n // const activeSession = this.chatService.getActiveSession();\r\n // if (activeSession?.id === sessionId) {\r\n // Logger.info('Active session was deleted, starting a new one.');\r\n // this.chatService.startNewSession();\r\n // }\r\n // });\r\n }\r\n\r\n async deleteAllSessions(): Promise<void> {\r\n Logger.info('Deleting all chat sessions');\r\n const userId = this.authService.getUserId() || '';\r\n await this.chatHistory.deleteAllHistory(userId);\r\n this.chatService.clearMessages();\r\n\r\n // this.chatHistory.deleteAllHistory(userId.toString()).subscribe({\r\n // next: () => {\r\n // this.chatService.clearMessages();\r\n // },\r\n // });\r\n }\r\n\r\n async renameSession(event: { sessionId: string; newTitle: string }): Promise<void> {\r\n Logger.info(`Renaming session ${event.sessionId} to ${event.newTitle}`);\r\n const userId = this.authService.getUserId() || '';\r\n const result = await this.chatHistory.updateSessionTitle(\r\n event.sessionId,\r\n event.newTitle,\r\n userId.toString(),\r\n );\r\n if (result) {\r\n // If updated session is currently active, update its title in ChatService\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.response_id === event.sessionId) {\r\n activeSession.title = event.newTitle;\r\n }\r\n }\r\n }\r\n\r\n private async loadUserSessions(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Initiating loadUserSessions for user: ${userId}`);\r\n // TODO\r\n await this.chatHistory.loadSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n async loadMoreHistory(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Loading more sessions for user: ${userId}`);\r\n // TODO\r\n await this.chatHistory.loadMoreSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Manually refresh history\r\n */\r\n async refreshHistory(): Promise<void> {\r\n const userId = this.authService.getUserId() || '';\r\n Logger.info(`Refreshing sessions for user: ${userId}`);\r\n this.chatHistory.invalidateCache();\r\n // TODO\r\n await this.chatHistory.loadSessions(userId, true); // force refresh\r\n }\r\n\r\n //! ======================== FULLSCREEN =====================\r\n\r\n toggleFullScreen(): void {\r\n if (this.fullscreenDirective) {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.getFullscreenState();\r\n this.uiState.setFullscreen(isFullscreen);\r\n\r\n if (isFullscreen) {\r\n this.refreshHistory();\r\n }\r\n }\r\n }\r\n\r\n //! ================== UTILITY METHODS =======================\r\n\r\n // TODO: Using id || index for trackBy is a good start, but ensure 'item' is properly typed to avoid runtime 'any' issues.\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n /**\r\n * Resolve and update the username from all available sources\r\n */\r\n public updateUserName() {\r\n if (!this.isAuthenticated()) {\r\n this.userName.set('');\r\n return;\r\n }\r\n this.userName.set(this.authService.loggedInUserName());\r\n // Logger.info('User name updated:', this.userName());\r\n\r\n // const loggedInName = this.authService.getLoggedInUserName();\r\n // const contextName = this.userContext?.userName;\r\n // const configName = this.configService?.config.authToken ? 'User' : ''; // simplified username logic\r\n\r\n // if (configName) {\r\n // this.userName = configName;\r\n // } else if (loggedInName) {\r\n // this.userName = loggedInName;\r\n // } else {\r\n // this.userName.set('User');\r\n // }\r\n\r\n Logger.info('Resolved userName:', this.userName);\r\n }\r\n\r\n userAvatarUrl(): string {\r\n return doohbotConst.userAvatar;\r\n }\r\n\r\n ngOnDestroy() {\r\n Logger.info('🎯 DOOHBOT COMPONENT DESTROYED');\r\n this.destroyIsAuthenticated$.next();\r\n this.destroyIsAuthenticated$.complete();\r\n\r\n // Clean up subscriptions\r\n if (this.contextCleanup) {\r\n this.contextCleanup();\r\n }\r\n }\r\n}\r\n","<app-chat-button [buttonStyle]=\"activeButtonStyle()\" [isChatOpen]=\"isChatOpen()\" [unreadCount]=\"unreadCount()\"\r\n (toggle)=\"toggleChat()\">\r\n</app-chat-button>\r\n\r\n@if (isChatOpen()) {\r\n<app-chat-window appFullscreen [isChatOpen]=\"isChatOpen()\" [enableDrag]=\"enableDrag\" [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\" [messages]=\"messages()\" [isBotTyping]=\"isBotTyping()\" [isStreaming]=\"isStreaming()\"\r\n [predefinedMessages]=\"predefinedMessages()\" [suggestedMessages]=\"suggestedMessages()\" [userName]=\"userName()\"\r\n [trackByMessageId]=\"trackByMessageId\" [messageError]=\"messageError()\" [showSuggestionChips]=\"showSuggestionChips()\"\r\n [buttonStyle]=\"activeButtonStyle()\" [isHistorySidebarOpen]=\"isHistorySidebarOpen()\" [chatSessions]=\"chatSessions()\"\r\n [isLoadingSessions]=\"isLoadingSessions()\" [processingSessionId]=\"processingSessionId()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\" [isLoadingMoreSessions]=\"isLoadingMore()\" [chatHistoryUserName]=\"userName()\"\r\n [isLoggingIn]=\"isLoggingIn()\" [authError]=\"authError()\" [authSuccess]=\"authSuccess()\" (toggleChat)=\"toggleChat()\"\r\n (loginSubmit)=\"onLogin($event)\" (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\" (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\" (sessionRenamed)=\"renameSession($event)\"\r\n (loadMoreSessions)=\"loadMoreHistory()\" (refreshSessions)=\"refreshHistory()\" (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\" (clearMessageError)=\"clearMessageError()\" (clearChat)=\"clearChat()\"\r\n (deleteAllSessions)=\"deleteAllSessions()\" (logout)=\"performLogout()\"></app-chat-window>\r\n}\r\n\r\n<!-- Skeleton Loader while auth is unknown or refreshing -->\r\n<!-- @if (isChatOpen() && (authStatus() === 'expired')) {\r\n<div class=\"auth-loading-skeleton\">\r\n <div class=\"skeleton-header\"></div>\r\n <div class=\"skeleton-messages\"></div>\r\n <div class=\"skeleton-input\"></div>\r\n</div>\r\n} -->","import { DoohbotConfig } from './doohbot-config.model';\r\nimport { DEFAULT_DOOHBOT_CONFIG } from './doohbot-config.default';\r\n\r\n/**\r\n * Merges user-provided config overrides with defaults.\r\n *\r\n * @param overrides - Partial config to override defaults\r\n * @returns Fully resolved DoohbotConfig object\r\n */\r\nexport function resolveDoohbotConfig(overrides?: Partial<DoohbotConfig>): DoohbotConfig {\r\n return {\r\n ...DEFAULT_DOOHBOT_CONFIG,\r\n ...overrides,\r\n };\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, switchMap } from 'rxjs/operators';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { Logger } from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(private authService: AuthService) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authReq = this.addAuthHeader(req);\r\n\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !this.authService.isAuthUrl(authReq.url)\r\n ) {\r\n Logger.error('[AuthInterceptor] 401 detected, attempting refresh');\r\n\r\n // Refresh if expired/unauthenticated during http request\r\n return this.authService.refreshLogin().pipe(\r\n switchMap((result) => {\r\n if (!result?.access_token) {\r\n Logger.error('[AuthInterceptor] Refresh failed, clearing auth');\r\n this.authService.clear();\r\n return throwError(() => error);\r\n }\r\n\r\n Logger.info('[AuthInterceptor] Token refreshed, retrying request');\r\n return next.handle(this.addAuthHeader(req));\r\n }),\r\n catchError((refreshErr) => {\r\n Logger.error('[AuthInterceptor] Refresh error', refreshErr);\r\n this.authService.clear();\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private addAuthHeader(req: HttpRequest<any>): HttpRequest<any> {\r\n if (this.authService.isAuthUrl(req.url)) return req;\r\n\r\n const token = this.authService.getAccessToken();\r\n if (!token) return req;\r\n\r\n return req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n });\r\n }\r\n}\r\n","import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';\r\nimport { DOOHBOT_CONFIG, DoohbotConfig } from '../public-api';\r\nimport { resolveDoohbotConfig } from './core/config/doohbot-config.resolver';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { Logger } from './core/utils/logger.service';\r\nimport { DoohbotConfigService } from './core/config/doohbot-config.service';\r\n\r\n/**\r\n * Provides all necessary Doohbot dependencies for standalone Angular applications.\r\n *\r\n * This provider:\r\n * - Registers the Doohbot configuration via dependency injection\r\n * - Registers HTTP interceptors required for authentication and licensing\r\n * - Does NOT provide `HttpClientModule` — the host application must provide it\r\n *\r\n * Use this when you want Doohbot to manage authentication, licensing,\r\n * and API integration automatically.\r\n *\r\n * @param config Partial configuration. Missing values are resolved using library defaults.\r\n * @returns EnvironmentProviders for use with `bootstrapApplication`\r\n *\r\n * @example\r\n * ```ts\r\n * // main.ts\r\n * import { bootstrapApplication } from '@angular/platform-browser';\r\n * import { importProvidersFrom } from '@angular/core';\r\n * import { HttpClientModule } from '@angular/common/http';\r\n * import { AppComponent } from './app/app.component';\r\n * import { provideDoohbot } from 'doohbot';\r\n *\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * importProvidersFrom(HttpClientModule),\r\n * provideDoohbot({\r\n * environment: 'production',\r\n * licenseFilePath: 'assets/doohbot_license.json',\r\n * // Optional api configuration if want to use your own api\r\n * api: {\r\n * apiBaseUrl: 'https://api.doohbot.com/',\r\n * apiKey: 'your-api-key',\r\n * },\r\n * // Optional theme configuration if want to match doohbot to your application theme\r\n * theme: {\r\n * buttonStyle: 'fab',\r\n * primaryColor: '#4f46e5',\r\n * backgroundColor: '#ffffff',\r\n * textColor: '#111827',\r\n * fontFamily: 'Inter, Roboto, sans-serif',\r\n * enableDrag: true,\r\n * enableResize: true\r\n * }\r\n * }),\r\n * ],\r\n * }).catch(console.error);\r\n * ```\r\n */\r\nexport function provideDoohbot(config: Partial<DoohbotConfig> = {}) {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: DOOHBOT_CONFIG,\r\n useValue: resolveDoohbotConfig(config),\r\n },\r\n DoohbotConfigService,\r\n\r\n // Init logger\r\n Logger,\r\n {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n deps: [Logger],\r\n useFactory: (logger: Logger) => () => {\r\n Logger.init(logger);\r\n },\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ]);\r\n}\r\n","/**\r\n * public-api.ts\r\n * Main public API surface of the Doohbot library.\r\n * Exports all necessary modules, components, services, and models.\r\n * Consumers should only import from this file.\r\n */\r\n\r\n// Components\r\nexport { DoohbotComponent } from './lib/doohbot.component';\r\nexport { DoohbotConfigService } from './lib/core/config/doohbot-config.service';\r\nexport { Logger } from './lib/core/utils/logger.service';\r\n\r\n// Providers\r\nexport { provideDoohbot } from './lib/doohbot.providers';\r\n\r\n// Configuration\r\nexport type { DoohbotConfig } from './lib/core/config/doohbot-config.model';\r\nexport type { DoohbotApiConfig } from './lib/core/models/api-config.model';\r\nexport type { DoohbotThemeConfig } from './lib/core/models/theme-config.model';\r\nexport { DOOHBOT_CONFIG } from './lib/core/config/doohbot-config.token';\r\nexport { resolveDoohbotConfig } from './lib/core/config/doohbot-config.resolver';\r\nexport { doohbotConst } from './lib/const/doohbot-constant';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.MarkdownService","i2","i3","i1.DialogService","i1.DoohbotConfigService","i2.DoohbotConfigService","i1.HttpService","i2.StorageService","i3.DoohbotConfigService","i2.PersonalizationService","i1.StorageService","i2.HttpStreamService","i4","i2.DialogService","i3.SnackbarService","i2.SnackbarService","i3.ChatHistoryService","i4.ChatUIStateService","i5.ThemeService","i6.AuthService","i7.ChatService","i8.PersonalizationService","i9.LicenseService","i10.DoohbotConfigService","catchError","switchMap","i1.AuthService"],"mappings":"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"}
|