llm-agent-plugin/src/css/styles.css
2025-10-05 00:41:46 +03:00

916 lines
27 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* src/styles.css или куда ты добавляешь стили */
/* CSS переменные, чтобы создать атмосферу Шира из "Властелина колец" */
:root {
/* Общие стили узлов графа */
--node-padding: 10px;
--node-border-radius: 5px;
--node-font-size: 14px;
--node-font-weight: bold;
--node-text-align: center;
/* Переменные для текста */
--font-text-size: 14px;
--font-monospace: 'Roboto Mono', monospace;
--border-color-light: #d3cbbd; /* Светлая граница, землистая */
--border-color-dark: #a99b87; /* Темная граница, землистая */
--background-modifier-form-field: #f5efe1; /* Светлый земляной фон для полей */
--background-modifier-form-field-highlighted: #e4dccf; /* Немного темнее для выделенных полей */
--node-text-color: var(
--text-normal
); /* Используем общую переменную для текста узлов */
}
/* Определение для светлой темы */
.theme-light {
/* Цвета для кнопок и интерактивных элементов (светлая тема) */
--button-primary-background: #5a8f6a; /* Насыщенный ширский зеленый для кнопок */
--button-primary-hover-background: #4a7a5c; /* Темнее для наведения */
--button-primary-text-color: #ffffff; /* Белый текст */
--button-secondary-background: #d9d1bf; /* Светлый землистый для второстепенных кнопок */
--button-secondary-hover-background: #c4bda9; /* Темнее для наведения */
--button-secondary-text-color: #333333; /* Темный текст для второстепенных */
/* Цвета сообщений чата */
--llm-user-border-color: #79a07e; /* Ширский зеленый */
--llm-user-background-color: #e6f2e6; /* Очень светлый ширский зеленый */
--llm-llm-border-color: #b2a27e; /* Нейтральный, землистый оттенок */
--llm-llm-background-color: #f8f3e9; /* Светлый кремовый */
--llm-tool-border-color: #b08d57; /* Древесный коричневый */
--llm-tool-background-color: #fdf4e3; /* Светлый песочный */
--llm-error-border-color: #c25b5b; /* Приглушенный красный */
--llm-error-background-color: #f7e0e0; /* Светлый приглушенный красный */
--llm-assistant-border-color: #9c9c8f; /* Серый камень */
--llm-assistant-background-color: #ecece4; /* Светло-серый, землистый */
/* Переменные для текста (светлая тема) */
--text-normal: #333;
--text-muted: #666;
--background-secondary-alt: #f0f0f0;
--text-accent: #007bff;
}
/* Определение для тёмной темы */
.theme-dark {
/* Цвета для кнопок и интерактивных элементов (темная тема) */
--button-primary-background: #4a7a5c; /* Более глубокий зеленый для темной темы */
--button-primary-hover-background: #3a6a4c;
--button-primary-text-color: #ffffff;
--button-secondary-background: #a99d8b; /* Более темный землистый */
--button-secondary-hover-background: #948d7b;
--button-secondary-text-color: #f0f0f0;
/* Переменные для темной темы, сохраняющие "ширскую" атмосферу */
--llm-user-border-color: #5a8f6a; /* Темнее зеленый */
--llm-user-background-color: #2b3a2d; /* Глубокий зеленый фон */
--llm-llm-border-color: #8c7e60; /* Темный землистый */
--llm-llm-background-color: #3a3227; /* Темный кремовый/коричневый */
--llm-tool-border-color: #806842; /* Темный древесный коричневый */
--llm-tool-background-color: #3b2c1c; /* Глубокий песочный/коричневый */
--llm-error-border-color: #9c4b4b; /* Более глубокий красный */
--llm-error-background-color: #4a2d2d; /* Темный приглушенный красный */
--llm-assistant-border-color: #7c7c70; /* Темный серый камень */
--llm-assistant-background-color: #3a3a35; /* Глубокий серо-землистый */
/* Переменные для текста (темная тема) */
--text-normal: #f0f0f0; /* Светлый текст */
--text-muted: #b0b0b0; /* Светлый приглушенный текст */
--background-secondary-alt: #2a2a2a; /* Темный фон */
--text-accent: #6aa84f; /* Более приглушенный зеленый акцент */
}
.llm-agent-chat-panel .message-type-user {
border: 1px solid var(--llm-user-border-color); /* Цвет для user */
background-color: var(
--llm-user-background-color
); /* Светло-голубой фон для user */
}
.llm-agent-chat-panel .message-type-llm {
border: 1px solid var(--llm-llm-border-color); /* Цвет для llm */
background-color: var(
--llm-llm-background-color
); /* Светло-зеленый фон для llm */
}
.llm-agent-chat-panel .message-type-tool {
border: 1px solid var(--llm-tool-border-color); /* Цвет для tool */
background-color: var(
--llm-tool-background-color
); /* Светло-оранжевый фон для tool */
}
.llm-agent-chat-panel .message-type-error {
border: 1px solid var(--llm-error-border-color); /* Красный цвет для error */
background-color: var(
--llm-error-background-color
); /* Светло-красный фон для error */
}
.llm-agent-chat-panel .message-type-assistant {
border: 1px solid var(--llm-assistant-border-color); /* Цвет для assistant */
background-color: var(
--llm-assistant-background-color
); /* Светло-серый фон для assistant */
}
/* Общие стили для сообщений */
.llm-agent-chat-panel .message {
margin-bottom: 10px;
display: flex; /* Flex-контейнер для всего сообщения */
flex-direction: column; /* Элементы внутри сообщения будут выстраиваться вертикально */
padding: 10px; /* Общие отступы для всего сообщения */
border-radius: 5px;
max-width: 80%; /* Ограничение ширины сообщения */
word-break: break-word; /* Разбиение слов для длинных сообщений */
overflow-wrap: break-word; /* Перенос слов */
}
.llm-agent-chat-panel .message.user {
margin-left: auto; /* Выравнивание по правому краю для пользователя */
}
.llm-agent-chat-panel .message.assistant {
margin-right: auto; /* Выравнивание по левому краю для ассистента, если потребуется */
}
.chat-meta {
margin-bottom: 5px; /* Отступ между мета-информацией и содержимым */
}
.chat-sender-info {
display: flex; /* Делаем sender-info flex-контейнером */
align-items: center; /* Выравнивание иконки и текста по центру */
gap: 8px; /* Расстояние между иконкой и текстом */
}
.chat-message-icon svg {
width: 20px; /* Размер иконки */
height: 20px;
flex-shrink: 0; /* Предотвращает сжатие иконки */
}
.chat-role-label {
font-weight: bold;
font-size: 0.9em;
color: var(--text-muted);
}
.chat-message-content {
font-size: var(--font-text-size);
line-height: 1.5;
color: var(--text-normal);
user-select: text; /* Разрешить выделение текста внутри содержимого */
}
/* ----------------------------------------------- Chat Panel Styles -------------------------------------------------------- */
.llm-agent-chat-panel {
display: flex;
flex-direction: column;
height: 100%;
}
.chat-history {
flex-grow: 1;
overflow-y: auto;
padding: 10px;
-webkit-user-select: text; /* Разрешить выделение для WebKit-браузеров */
-moz-user-select: text; /* Разрешить выделение для Firefox */
user-select: text; /* Стандартное свойство для выделения текста */
scroll-behavior: smooth;
}
/* Стили для inline-кода в сообщениях */
.chat-message-content code {
background-color: var(--background-secondary-alt);
border-radius: 4px;
padding: 2px 4px;
font-family: var(--font-monospace);
font-size: 0.9em;
color: var(--text-accent);
}
/* Стили для блоков кода (pre) */
.chat-message-content pre {
white-space: pre-wrap; /* Сохраняет пробелы и переносит строки, когда это необходимо */
word-break: break-word; /* Разбивает длинные слова, чтобы они помещались в контейнер */
overflow-x: auto; /* Добавляет горизонтальную прокрутку, если содержимое все же не помещается */
}
/* Убедимся, что стили code внутри pre не конфликтуют с родительским pre */
.chat-message-content pre code {
background-color: transparent; /* Убираем фон, так как он уже задан для pre */
}
/* Стиль для форм ввода чата */
.chat-input-form {
display: flex;
padding: 10px;
border-top: 1px solid #eee;
gap: 10px;
}
.command-input {
position: relative;
flex-grow: 1;
}
#message-input {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
scroll-margin-bottom: 30px; /* Добавляет отступ в 20px снизу при прокрутке к этому элементу */
}
.submit-button {
padding: 4px 8px; /* Восстанавливаем паддинг */
border: none; /* Убираем рамку */
border-radius: 8px;
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
/* Явно переопределяем стили, которые могли быть затронуты */
width: auto; /* Убедимся, что ширина не ограничена */
height: auto; /* Убедимся, что высота не ограничена */
background-color: var(
--button-primary-background
) !important; /* Используем переменную для основного цвета кнопки */
color: var(
--button-primary-text-color
) !important; /* Используем переменную для цвета текста кнопки */
opacity: 1; /* Если .clickable-icon устанавливает opacity */
display: inline-flex; /* Или flex, если нужно выравнивание элементов внутри */
align-items: center; /* Для вертикального выравнивания контента, если display: flex */
justify-content: center; /* Для горизонтального выравнивания контента, если display: flex */
}
#send-button:hover {
background-color: var(
--button-primary-hover-background
) !important; /* Переменная для наведения */
}
/* Добавляем стили для нового интерфейса ввода */
.chat-input-container {
border-top: 1px solid var(--background-modifier-border);
padding: 8px 10px 4px 10px;
position: relative;
}
.scroll-container {
overflow-y: auto;
scrollbar-width: thin;
max-height: 70vh;
margin-bottom: 8px;
}
/*.message-input-editor {
outline: none;
font-size: 14px;
line-height: 1.4;
min-height: 20px;
padding: 8px 0;
color: var(--text-normal);
position: relative;
}*/
.message-input-editor {
min-height: 20px;
max-height: 200px;
overflow-y: auto;
word-wrap: break-word;
white-space: pre-wrap;
}
.message-input-editor.is-empty::before {
content: attr(data-placeholder);
color: var(--text-muted);
position: absolute;
pointer-events: none;
}
.message-input-editor[data-placeholder]::before {
content: attr(data-placeholder);
color: var(--text-muted);
position: absolute;
pointer-events: none;
opacity: 0.6;
}
.message-input-editor.is-empty[data-placeholder]::before {
display: block;
}
.message-input-editor:not(.is-empty)[data-placeholder]::before,
.message-input-editor:focus[data-placeholder]::before {
display: none;
}
.message-input-editor .reference-box {
display: inline-flex !important;
vertical-align: middle;
margin: 0 1px;
}
.message-input-editor .reference-box:focus {
outline: 2px solid var(--interactive-accent);
outline-offset: 1px;
}
.chat-controls {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: var(--text-muted);
}
.control-buttons-left {
display: flex;
align-items: center;
gap: 8px;
}
.control-buttons-right {
display: flex;
align-items: center;
gap: 8px;
}
.model-select-container {
position: relative;
}
.model-select-button {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
border: none;
border-radius: 8px;
background-color: var(
--button-secondary-background
); /* Используем переменную для второстепенных кнопок */
color: var(
--button-secondary-text-color
); /* Используем переменную для текста второстепенных кнопок */
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
}
.model-select-button:hover {
background-color: var(
--button-secondary-hover-background
); /* Используем переменную для наведения второстепенных кнопок */
filter: brightness(1.1); /* Можно оставить или скорректировать под тему */
}
.model-name {
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dropdown-icon {
width: 12px;
height: 12px;
flex-shrink: 0;
}
.model-dropdown {
position: absolute;
/* Убираем жесткое bottom: 100%; т.к. позиционирование будет задаваться в JS */
/* bottom: 100%; */
left: 0;
/* right: 0; */ /* Это может привести к растягиванию, лучше оставить auto или задать ширину */
width: max-content; /* Чтобы дропдаун не растягивался на всю ширину родителя */
min-width: 150px; /* Минимальная ширина */
background-color: var(
--background-primary
); /* Предполагается, что --background-primary есть и подходит */
border: 1px solid var(--border-color-dark); /* Используем новую переменную для границы */
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Можно скорректировать тень в соответствии с темой */
z-index: 1000;
/* margin-bottom: 4px; */ /* Это будет задавать JS через top/bottom */
max-height: 200px;
overflow-y: auto;
}
.model-option {
padding: 8px 12px;
cursor: pointer;
font-size: 11px;
color: var(--text-normal);
transition: background-color 0.2s;
}
.model-option:hover {
}
.model-option.selected {
background-color: var(
--background-modifier-selected
); /* Или другой подходящий цвет */
color: var(--text-highlighted); /* Или другой подходящий цвет */
}
.model-option:first-child {
border-radius: 8px 8px 0 0;
}
.model-option:last-child {
border-radius: 0 0 8px 8px;
}
.submit-button {
padding: 4px 8px;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
}
.submit-button:hover:enabled {
filter: brightness(1.25);
}
.submit-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.submit-text {
font-family: system-ui, -apple-system, sans-serif;
}
/* Обновляем стили для suggestions */
.suggestions {
position: absolute;
bottom: 100%;
left: 0;
right: 0;
background-color: var(
--background-primary
); /* Предполагается, что --background-primary есть и подходит */
border: 1px solid var(--border-color-dark); /* Используем новую переменную для границы */
border-radius: 8px;
max-height: 150px;
overflow-y: auto;
z-index: 100;
margin-bottom: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Можно скорректировать тень в соответствии с темой */
}
.suggestion-item {
padding: 8px 12px;
cursor: pointer;
font-size: 12px;
color: var(--text-normal);
transition: background-color 0.2s;
}
.suggestion-item:hover {
}
.suggestion-item.selected {
background-color: var(--background-modifier-selected);
color: var(--text-highlighted);
}
/* Удаляем старые стили для chat-input-form и message-input */
.chat-input-form {
display: none;
}
#message-input {
display: none;
}
/* ----------------------------------------------- Reference System Styles --------------------------------------------------- */
/* Reference Boxes */
.reference-box {
display: inline-flex;
align-items: center;
padding: 2px 6px;
border-radius: 4px;
font-size: 11px;
margin: 0 2px;
cursor: pointer;
user-select: none;
vertical-align: middle;
transition: all 0.2s ease;
}
.reference-box:hover {
opacity: 0.8;
transform: translateY(-1px);
}
.reference-box-icon {
width: 12px;
height: 12px;
margin-right: 4px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.reference-box-name {
font-weight: 500;
white-space: nowrap;
}
/* Файлы - одинарная ссылка @ */
.reference-box.file.single {
background: rgba(100, 150, 255, 0.1);
border: 1px solid rgba(100, 150, 255, 0.3);
color: var(--text-normal);
}
/* Файлы - постоянная ссылка @@ */
.reference-box.file.permanent {
background: rgba(100, 150, 255, 0.2);
border: 1px solid rgba(100, 150, 255, 0.6);
color: var(--text-normal);
font-weight: 600;
}
.reference-box.file.permanent .reference-box-name {
font-weight: 600;
}
/* Перебиваем стиль Obsidian для prompt*/
.reference-box.prompt {
display: inline-flex;
flex-direction: row;
box-shadow: var(--shadow-l);
z-index: auto;
position: static;
top: auto;
width: auto;
max-width: none;
max-height: none;
overflow: hidden;
}
/* Промпты - одинарная ссылка # */
.reference-box.prompt.single {
background: rgba(255, 150, 100, 0.1);
border: 1px solid rgba(255, 150, 100, 0.3);
color: var(--text-normal);
}
/* Промпты - постоянная ссылка ## */
.reference-box.prompt.permanent {
background: rgba(238, 122, 69, 0.2);
border: 1px solid rgba(255, 150, 100, 0.6);
color: var(--text-normal);
font-weight: 600;
}
.reference-box.prompt.permanent .reference-box-name {
font-weight: 600;
}
/* Reference Autocomplete */
.reference-autocomplete {
/* 200px для 5 элементов, возможно, нужно заменить на расчёт с помощью padding и размером шрифта */
--item-height: 33px; /* высота одного элемента */
--visible-items: 10; /* количество видимых элементов */
position: absolute;
background: var(--background-primary);
border: 1px solid var(--border-color);
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 1000;
max-height: calc(var(--item-height) * var(--visible-items));
overflow-y: auto;
min-width: 250px;
max-width: 400px;
}
.reference-option {
display: flex;
align-items: center;
padding: 8px 12px;
cursor: pointer;
font-size: 12px;
color: var(--text-normal);
transition: background-color 0.2s;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.reference-option:hover,
.reference-option.selected {
background-color: var(--background-modifier-hover);
}
.reference-option:last-child {
border-bottom: none;
}
.reference-option-icon {
width: 16px;
height: 16px;
margin-right: 8px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-muted);
}
.reference-option-name {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 500;
}
.reference-option-path {
font-size: 10px;
color: var(--text-muted);
margin-left: 8px;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Темная тема */
.theme-dark .reference-autocomplete {
background: var(--background-primary);
border-color: var(--border-color);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.theme-dark .reference-option:hover,
.theme-dark .reference-option.selected {
background-color: rgba(255, 255, 255, 0.1);
}
/* Светлая тема */
.theme-light .reference-autocomplete {
background: #ffffff;
border-color: #e0e0e0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.theme-light .reference-option:hover,
.theme-light .reference-option.selected {
background-color: rgba(0, 0, 0, 0.05);
}
/* Скроллбар для автокомплита */
.reference-autocomplete::-webkit-scrollbar {
width: 6px;
}
.reference-autocomplete::-webkit-scrollbar-track {
background: transparent;
}
.reference-autocomplete::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-bg);
border-radius: 3px;
}
.reference-autocomplete::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-bg-hover);
}
/* ----------------------------------------------- Settings Views ------------------------------------------------------------ */
.setting-item.llm-agent-excluded-folder-item {
padding-left: 30px; /* Отступ для элементов списка */
border-left: 2px solid var(--background-modifier-border); /* Разделитель */
margin-bottom: 5px;
margin-top: 5px;
}
.setting-item.llm-agent-excluded-folder-item .setting-item-control {
display: flex;
align-items: center;
gap: 5px;
}
.setting-item.llm-agent-excluded-folder-item .setting-item-control input {
flex-grow: 1; /* Поле ввода занимает все доступное пространство */
}
/* ----------------------------------------------- Obsidian core override ------------------------------------------------------------ */
.status-bar-item {
display: none;
padding: 0;
&.plugin-editor-width-slider {
display: inline-flex;
& .editor-width-slider {
width: 80px !important;
}
& .editor-width-slider-value {
padding: 4px 3px !important;
font-size: 10px !important;
margin: 0 !important;
}
}
}
/* ----------------------------------------------- Graph Panel Styles --------------------------------------------------------------- */
.llm-agent-graph-main {
display: flex;
height: 100%;
width: 100%;
/* background-color: var(--background-primary); */
}
.llm-agent-history-sidebar {
border-right: 1px solid var(--background-modifier-border);
overflow-y: auto;
background-color: var(--background-secondary);
transition: width 0.3s ease, min-width 0.3s ease, border-right 0.3s ease;
min-width: 0;
}
.llm-agent-history-sidebar.expanded {
width: 200px;
min-width: 200px;
}
.llm-agent-history-sidebar.collapsed {
width: 0;
min-width: 0;
border-right: none;
overflow: hidden;
}
.graph-title-generated {
color: var(--text-normal);
}
.graph-title-pending {
color: var(--text-muted);
}
.react-flow__node-default,
.react-flow__node-user,
.react-flow__node-llm,
.react-flow__node-tool,
.react-flow__node-error,
.react-flow__node-assistant {
padding: var(--node-padding);
border-radius: var(--node-border-radius);
text-align: var(--node-text-align);
font-size: var(--node-font-size);
font-weight: var(--node-font-weight);
color: var(--node-text-color);
}
.react-flow__node-user {
border: 1px solid var(--llm-user-border-color);
background-color: var(
--llm-user-background-color
);
}
.react-flow__node-llm {
border: 1px solid var(--llm-llm-border-color);
background-color: var(
--llm-llm-background-color
);
}
.react-flow__node-tool {
border: 1px solid var(--llm-tool-border-color);
background-color: var(
--llm-tool-background-color
);
}
.react-flow__node-error {
border: 1px solid var(--llm-error-border-color);
background-color: var(
--llm-error-background-color
);
}
.react-flow__node-assistant {
border: 1px solid var(--llm-assistant-border-color);
background-color: var(--llm-assistant-background-color);
}
.react-flow__node {
font-size: 12px !important;
padding: 4px 8px !important;
min-width: 100px !important;
max-width: 130px !important;
min-height: 30px !important;
border-radius: 6px !important;
}
.react-flow__node-default {
width: auto !important;
height: auto !important;
}
/* Стиль для выделенных узлов */
.react-flow__node.selected-node {
border-color: var(--interactive-accent-hover); /* Яркая рамка */
box-shadow: 0 0 0 2px var(--interactive-accent-hover); /* Более заметная тень */
}
/* Стиль для кнопок внутри узла (например, кнопки удаления) */
.react-flow__node button.node-delete-button {
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
color: var(--text-error); /* Цвет для кнопки удаления */
cursor: pointer;
font-size: 0.8em;
padding: 3px 6px;
margin-top: 5px;
transition: all 0.2s ease-in-out;
}
.react-flow__node button.node-delete-button:hover {
background-color: var(--background-modifier-error-hover);
color: var(--text-on-accent);
}
/* Стиль для рёбер */
.react-flow__edge-path {
stroke: var(--background-modifier-border);
stroke-width: 1.5;
}
/* Общие стили для глобальных кнопок действий */
.graph-view-toolbar {
position: absolute;
top: 10px;
left: 10px; /* Рядом с кнопкой переключения */
z-index: 50;
display: flex;
flex-direction: column; /* Вертикальное расположение */
gap: 10px; /* Отступ между кнопками */
}
.global-action-button {
background-color: var(--background-secondary-alt);
border: 1px solid var(--background-modifier-border);
height: auto;
border-radius: 8px;
padding: 10px 10px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 1.2em;
color: var(--text-normal);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
transition: background-color 0.2s ease, color 0.2s ease;
}
.global-action-button:hover {
background-color: var(--background-modifier-hover);
color: var(--interactive-accent);
}
/* Tooltip стили для глобальных кнопок */
[data-tooltip]:hover:after {
content: attr(data-tooltip);
position: absolute;
left: calc(100% + 10px); /* Справа от кнопки */
top: 50%;
transform: translateY(-50%);
white-space: nowrap;
background-color: var(--background-modifier-hover);
color: var(--text-normal);
padding: 5px 8px;
border-radius: 4px;
font-size: 0.8em;
z-index: 100; /* Чтобы быть над всем */
}