{% extends "base.html" %}
{% block title %}TelePush — Панель{% endblock %}

{% block content %}
<!-- Счётчик аккаунтов вынесен в sidebar как badge к «Менеджер аккаунтов» (см. base.html). -->
<span id="accounts-count" style="display:none;">0</span>

<!-- Активные задачи. Плашка внизу страницы (position:fixed), появляется только при активной задаче. -->
<div id="active-jobs" style="display:none;position:fixed;bottom:12px;left:50%;transform:translateX(-50%);z-index:80;max-width:640px;width:calc(100vw - 280px);"></div>

<!-- TAB «Главная» (dashboard) удалён. -->

<!-- ═══ TAB: Рассылка по чатам ═══ -->
<div class="section active" id="tab-spam">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-megaphone text-info"></i> Рассылка по чатам</div>
        <div class="card-body">
            <!-- Убрана отдельная «активный акк» строка — только мульти-пикер. -->
            <div class="d-flex align-center gap-2 mb-2 flex-wrap" style="font-size:0.78rem;">
                <button class="btn btn-accent btn-sm" onclick="openSpamMultiPicker()" style="font-size:0.78rem;padding:5px 14px;">
                    <i class="bi bi-people"></i> Выбрать аккаунты
                </button>
                <span id="spam-multi-count" style="color:var(--warning);font-weight:600;">не выбрано</span>
                <button class="btn btn-outline btn-sm" onclick="clearMultiSelected()" style="font-size:0.72rem;padding:4px 10px;" data-tip="Снять выбор всех аккаунтов">
                    <i class="bi bi-x-circle"></i> Снять
                </button>
            </div>
            <div class="info-box">
                Отправляет текст во все выбранные чаты с каждого выбранного акка. Для уникализации: <code>{привет|здравствуйте}</code>. Лимит и тайминги применяются к каждому акку.
            </div>
            <div class="d-flex gap-3 mb-2 align-center flex-wrap">
                <label class="ad-check m-0"><input type="radio" name="spam-mode" id="spam-mode-text" value="text" checked onchange="onSpamModeChange()"> <span>Свой текст</span></label>
                <label class="ad-check m-0"><input type="radio" name="spam-mode" id="spam-mode-forward" value="forward" onchange="onSpamModeChange()"> <span>Пересылка из чата</span></label>
            </div>

            <div id="spam-mode-text-block">
                <div class="d-flex gap-2 align-center mb-1 flex-wrap">
                    <label class="form-label m-0">Текст сообщения <span class="tt" data-tip="Формат текста сообщения. «Обычный» — текст как есть. «Markdown» — поддержка **жирного**, *курсива*, [ссылок](url). «HTML» — теги <b>жирный</b>, <i>курсив</i>, <a href>ссылка</a>.">?</span></label>
                    <select class="form-control" id="spam-parse-mode" style="width:auto;font-size:0.72rem;padding:3px 8px;">
                        <option value="">Обычный</option>
                        <option value="md">Markdown</option>
                        <option value="html">HTML</option>
                    </select>
                </div>
                <textarea class="form-control mb-2" id="spam-tpl" rows="3"
                    placeholder="Напишите текст. Для вариантов: {привет|здравствуйте}"></textarea>
                <button type="button" class="btn btn-outline btn-sm mb-2" onclick="spintaxPreview('spam-tpl','spam-tpl-preview')">
                    <i class="bi bi-eye"></i> Предпросмотр спинтакса
                </button>
                <div id="spam-tpl-preview" class="spintax-preview" style="display:none;"></div>
            </div>

            <div id="spam-mode-forward-block" style="display:none;">
                <label class="form-label">Источник для пересылки</label>
                <div class="grid-2 mb-2">
                    <input type="text" class="form-control" id="spam-forward-chat" placeholder="@channel или ID чата откуда пересылать">
                    <input type="number" class="form-control" id="spam-forward-msg-id" placeholder="ID сообщения" min="1">
                </div>
                <div class="info-box fs-70">
                    Перешлёт сообщение #N из канала. Контент сохранится 1-в-1 (форматирование, медиа, эмбеды) — выглядит как обычный share.
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-arrow-repeat"></i> Цикличная рассылка</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="spam-loop"> <span>Повторять задачу каждые N часов<span class="ad-hint">После завершения текущего прохода — рестарт через указанное время</span></span></label>
                    <div style="display:flex;gap:8px;align-items:center;margin-top:6px;font-size:0.74rem;color:var(--text-muted-strong);">
                        Каждые
                        <input type="number" class="form-control" id="spam-loop-hours" value="6" min="1" max="168" style="width:80px;">
                        часов
                    </div>
                </div>
            </details>

            <div class="d-flex gap-2 mb-2 flex-wrap">
                <button class="btn btn-info btn-sm" onclick="collectTargets()">
                    <i class="bi bi-search"></i> Найти чаты аккаунта
                </button>
                <button class="btn btn-outline btn-sm" onclick="toggleManualTargets('spam')">
                    <i class="bi bi-pencil"></i> Вручную
                </button>
                <button class="btn btn-outline btn-sm" onclick="clearTargets('spam')">
                    <i class="bi bi-trash text-danger"></i>
                </button>
            </div>

            <div id="spam-manual" style="display:none;" class="mb-2">
                <textarea class="form-control" id="spam-targets-input" rows="3"
                    placeholder="ID, @username или ссылка t.me/ — по одному на строке&#10;-1001234567890&#10;@mychat&#10;https://t.me/mychat"></textarea>
                <button class="btn btn-outline btn-sm mt-2" onclick="addManualTargets('spam')">
                    <i class="bi bi-plus"></i> Добавить
                </button>
            </div>

            <div class="d-flex align-center gap-2 mb-2 mt-2 flex-wrap">
                <label class="form-label" style="margin:0;font-size:0.78rem;">Лимит сообщений с одного акка <span class="tt" data-tip="Сколько сообщений максимум разрешено одному аккаунту в этой задаче. 0 — без лимита (акк льёт пока не получит спам-блок). 50–100 — щадящий режим для тёплых акков. 200+ — для прогретых.">?</span></label>
                <input type="number" class="form-control" id="spam-max-per-acc"
                       value="0" min="0" max="2000" step="1"
                       style="width:90px;font-size:0.8rem;padding:4px 8px;">
                <span class="text-sm text-muted fs-70">
                    0 = до спам-блока
                </span>
            </div>

            <div class="d-flex align-center gap-2 mb-2 flex-wrap">
                <label class="form-label" style="margin:0;font-size:0.78rem;">Сколько ошибок спам-блока пропускать <span class="tt" data-tip="Telegram иногда выдаёт ЛОЖНЫЙ спам-блок на конкретного получателя (а не на акк). Софт пропустит N таких ошибок подряд и продолжит к следующему чату. На (N+1)-м проверит акк через @SpamBot — если @SpamBot подтвердит что акк живой, остановит ТОЛЬКО этот акк и продолжит остальными. Дефолт 3.">?</span></label>
                <input type="number" class="form-control" id="spam-pf-tolerance"
                       value="3" min="0" max="20" step="1"
                       style="width:90px;font-size:0.8rem;padding:4px 8px;">
                <span class="text-sm text-muted fs-70">
                    0 = стопать на первом
                </span>
            </div>

            <label class="opt-row mb-2">
                <input type="checkbox" id="spam-dedup-history" checked>
                Не повторять рассылку в чаты куда этот текст уже отправляли <span class="tt" data-tip="Софт запоминает в какие чаты успешно отправил этот текст. Повторный запуск с тем же текстом пропустит эти чаты и отправит только в новые. Безопасно — Telegram не любит повтор того же текста в одни и те же чаты.">?</span>
            </label>

            <div class="d-flex align-center justify-between">
                <span class="text-sm text-muted">
                    <i class="bi bi-chat-dots"></i> <span id="spam-count">0</span> чатов
                </span>
                <div class="d-flex gap-3 align-center">
                    <button class="btn btn-outline btn-sm" onclick="exportSpamResults()" data-tip="Выгрузка результатов: куда ушло / где не вышло (спам-блок, нет прав, флуд)">
                        <i class="bi bi-folder2-open"></i> Выгрузка
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="retryFailedSpam()" data-tip="Запустить ещё раз только по тем чатам, где не получилось">
                        <i class="bi bi-arrow-counterclockwise"></i> Повторить <i class="bi bi-x-circle text-danger"></i>
                    </button>
                    <label class="form-label m-0" data-tip="Сколько акков одновременно ведут рассылку. 0 = все выбранные параллельно. N = только N в работе, остальные ждут слот. Каждый акк через свой прокси.">Потоки <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                    <input type="number" class="form-control" id="spam-threads" value="0" min="0" max="100" style="width:70px;">
                    <button class="btn btn-accent btn-sm" onclick="startSpam()" id="btn-spam" disabled
                            data-tip="Лимиты Telegram: новые акки ~5-10 сообщений/час, прогретые до 30-50/час. PeerFlood (спам-фильтр) = 6 часов cooldown.">
                        <i class="bi bi-send"></i> Старт
                    </button>
                    <button class="btn btn-danger btn-sm" onclick="stopSpam()" id="btn-spam-stop" disabled data-tip="Остановить запущенную рассылку">
                        <i class="bi bi-stop-fill"></i> Стоп
                    </button>
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="spam-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок<span class="ad-hint">Заблокированные пропустим, чисто-живые пойдут в работу</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="spam-solve-captcha"> <span>Решать капчу в чатах<span class="ad-hint">Если в чате есть бот-капча (Shieldy и др.) — попробуем нажать «я не бот»</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="spam-keep-online"> <span>Держать аккаунт онлайн во время работы<span class="ad-hint">Аккаунт показывается онлайн в Telegram пока идёт задача</span></span></label>
                </div>
            </details>
        </div>
    </div>

    <!-- Тайминги рассылки по чатам -->
    <details class="card mb-3" style="padding:0;">
        <summary style="padding:14px 16px;cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;font-weight:500;font-size:0.92rem;">
            <i class="bi bi-clock text-info"></i> Тайминги рассылки
            <span class="ts-sync-badge" style="margin-left:auto;font-size:0.7rem;color:var(--text-muted);font-weight:normal;" title="Статус синхронизации с бэк-эндом — что реально записано в настройках">✓ сохранено</span>
        </summary>
        <div style="padding:0 16px 16px 16px;">
            <div class="info-box info-box--warning">
                Чем быстрее тайминги — тем выше шанс вечный спам-блок. Для новых акков ставьте паузы x2.
            </div>
            <div class="grid-3 mb-2">
                <div class="mb-2"><label class="form-label">Мин. пауза (сек) <span class="tt" data-tip="Минимальная пауза между двумя сообщениями с одного акка. Софт ждёт случайное число секунд между «мин» и «макс» — выглядит менее как бот. Чем больше — тем меньше шанс вечный спам-блок.">?</span></label><input type="range" class="range-slider" id="s-spam-min" min="3" max="30" value="6"><span class="text-sm text-muted" id="v-spam-min">6</span></div>
                <div class="mb-2"><label class="form-label">Макс. пауза (сек) <span class="tt" data-tip="Максимальная пауза между сообщениями. Реальная задержка = случайное значение между «мин» и «макс». Если поставить «макс» = «мин» — поведение станет одинаковым каждый раз (палится).">?</span></label><input type="range" class="range-slider" id="s-spam-max" min="5" max="60" value="14"><span class="text-sm text-muted" id="v-spam-max">14</span></div>
                <input type="hidden" id="s-spam-burst" value="999999">
                <div class="mb-2"><label class="form-label">Длинная пауза мин (сек) <span class="tt" data-tip="Минимальная длинная пауза — срабатывает после серии сообщений (см. «До паузы»). Софт ждёт случайное число между «мин» и «макс», потом продолжает. 120с = 2 минуты отдыха минимум.">?</span></label><input type="range" class="range-slider" id="s-spam-burst-pause-min" min="30" max="600" value="120"><span class="text-sm text-muted" id="v-spam-burst-pause-min">120</span></div>
                <div class="mb-2"><label class="form-label">Длинная пауза макс (сек) <span class="tt" data-tip="Максимальная длинная пауза. Совмещает с «мин» — софт берёт случайное число секунд из этого диапазона. 240с = до 4 минут.">?</span></label><input type="range" class="range-slider" id="s-spam-burst-pause-max" min="60" max="1200" value="240"><span class="text-sm text-muted" id="v-spam-burst-pause-max">240</span></div>
                <div class="mb-2"><label class="form-label">Стоп при FloodWait > (сек) <span class="tt" data-tip="Если Telegram попросил подождать N секунд — задача стопается только если N БОЛЬШЕ порога. Дефолт 300 (5 мин). Меньше — пережидаем и продолжаем. Поставь 600 чтобы дать больше шансов.">?</span></label><input type="range" class="range-slider" id="s-spam-floodwait-stop" min="60" max="900" value="300"><span class="text-sm text-muted" id="v-spam-floodwait-stop">300</span></div>
            </div>
        </div>
    </details>
</div>

<!-- ═══ TAB: DM Рассылка ═══ -->
<div class="section" id="tab-dm">
    <div class="card mb-3">
        <div class="card-header">
            <i class="bi bi-person-lines-fill" style="color:var(--pink);"></i> Рассылка в личные сообщения
        </div>
        <div class="card-body">
            <!-- Убран acc-selector — только мульти-пикер -->
            <div class="d-flex align-center gap-2 mb-2 flex-wrap" style="font-size:0.78rem;">
                <button class="btn btn-accent btn-sm" onclick="openDmMultiPicker()" style="font-size:0.78rem;padding:5px 14px;">
                    <i class="bi bi-people"></i> Выбрать аккаунты
                </button>
                <span id="dm-multi-count" style="color:var(--warning);font-weight:600;">не выбрано</span>
                <button class="btn btn-outline btn-sm" onclick="clearMultiSelected()" style="font-size:0.72rem;padding:4px 10px;" data-tip="Снять выбор всех аккаунтов">
                    <i class="bi bi-x-circle"></i> Снять
                </button>
            </div>
            <div class="info-box">
                Рассылка в ЛС по списку с каждого выбранного акка. Вставьте @username или загрузите .txt файл. Лимит и тайминги применяются к каждому акку.
            </div>
            <div class="d-flex gap-2 align-center mb-1 flex-wrap">
                <label class="form-label m-0">Текст сообщения <span class="tt" data-tip="Формат текста в ЛС. «Обычный» — как есть. «Markdown» — поддержка **жирного**, *курсива*, [ссылок](url). «HTML» — теги <b>жирный</b>, <i>курсив</i>, <a href>ссылка</a>.">?</span></label>
                <select class="form-control" id="dm-parse-mode" style="width:auto;font-size:0.72rem;padding:3px 8px;">
                    <option value="">Обычный</option>
                    <option value="md">Markdown</option>
                    <option value="html">HTML</option>
                </select>
            </div>
            <textarea class="form-control mb-2" id="dm-tpl" rows="3"
                placeholder="Напишите текст для личных сообщений. Варианты: {привет|здравствуйте}. Имя получателя: %name%"></textarea>
            <div class="text-sm text-muted mb-2" style="font-size:0.78rem;">
                <i class="bi bi-person-badge"></i> Персонализация: <code>%name%</code> (имя получателя),
                <code>%username%</code>, <code>%first_name%</code>, <code>%fullname%</code> — подставятся под каждого.
                Пусто → <code>%name%</code> станет «друг».
            </div>
            <div class="d-flex gap-2 mb-2 flex-wrap">
                <button type="button" class="btn btn-outline btn-sm" onclick="spintaxPreview('dm-tpl','dm-tpl-preview')">
                    <i class="bi bi-eye"></i> Предпросмотр спинтакса
                </button>
                <button type="button" class="btn btn-outline btn-sm" onclick="aiSpintaxGenerate('dm-tpl')" data-tip="Превратит твой шаблон в spintax-строку через ваш AI-ключ (Настройки → AI)">
                    <i class="bi bi-magic"></i> AI-варианты
                </button>
            </div>
            <div id="dm-tpl-preview" class="spintax-preview" style="display:none;"></div>

            <details class="ad-block">
                <summary><i class="bi bi-arrow-repeat"></i> Цикличная рассылка</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="dm-loop"> <span>Повторять задачу каждые N часов</span></label>
                    <div style="display:flex;gap:8px;align-items:center;margin-top:6px;font-size:0.74rem;color:var(--text-muted-strong);">
                        Каждые <input type="number" class="form-control" id="dm-loop-hours" value="6" min="1" max="168" style="width:80px;"> часов
                    </div>
                </div>
            </details>

            <label class="form-label">Кому отправить (@username, ID или ссылка t.me/)</label>
            <textarea class="form-control mb-2" id="dm-targets-input" rows="4"
                placeholder="@username1&#10;@username2&#10;t.me/user3&#10;123456789"
                oninput="_dmTargetsAutoload(this)"
                onblur="if(this.value.trim()) loadDmTargets();"></textarea>

            <div class="d-flex gap-2 mb-2 flex-wrap">
                <button class="btn btn-pink btn-sm" onclick="loadDmTargets()">
                    <i class="bi bi-search"></i> Загрузить
                </button>
                <label class="btn btn-outline btn-sm" style="cursor:pointer;margin:0;display:flex;align-items:center;">
                    <i class="bi bi-file-text"></i> .txt
                    <input type="file" accept=".txt" style="display:none" onchange="loadDmFile(this)">
                </label>
                <button class="btn btn-outline btn-sm" onclick="clearTargets('dm')">
                    <i class="bi bi-trash text-danger"></i>
                </button>
            </div>

            <div id="dm-trigger-warn" style="display:none;" class="mb-2 text-sm text-warning">
                <i class="bi bi-exclamation-triangle"></i> <span id="dm-trigger-words"></span>
            </div>

            <div class="d-flex align-center gap-2 mb-2 flex-wrap">
                <label class="form-label" style="margin:0;font-size:0.78rem;">Лимит сообщений с одного акка <span class="tt" data-tip="Сколько ЛС-сообщений максимум разрешено одному аккаунту. Дефолт 15 — безопасный порог под PeerFlood (TG отзывает за 30+ ЛС в час). Поднимай до 30-80 для прогретых акков. 0 — без лимита (риск).">?</span></label>
                <input type="number" class="form-control" id="dm-max-per-acc"
                       value="15" min="0" max="2000" step="1"
                       style="width:90px;font-size:0.8rem;padding:4px 8px;">
                <span class="text-sm text-muted fs-70">
                    15 = безопасно. 0 = до спам-блока.
                </span>
            </div>

            <div class="d-flex align-center gap-2 mb-2 flex-wrap">
                <label class="form-label" style="margin:0;font-size:0.78rem;">Сколько ошибок спам-блока пропускать <span class="tt" data-tip="Telegram иногда выдаёт ЛОЖНЫЙ спам-блок на конкретного получателя (а не на акк). Софт пропустит N таких ошибок подряд и продолжит к следующему юзеру. На (N+1)-м проверит акк через @SpamBot — если @SpamBot подтвердит что акк живой, остановит ТОЛЬКО этот акк и продолжит остальными. Дефолт 3.">?</span></label>
                <input type="number" class="form-control" id="dm-pf-tolerance"
                       value="3" min="0" max="20" step="1"
                       style="width:90px;font-size:0.8rem;padding:4px 8px;">
                <span class="text-sm text-muted fs-70">
                    0 = стопать на первом
                </span>
            </div>

            <label class="opt-row mb-2">
                <input type="checkbox" id="dm-dedup-history" checked>
                Не повторять отправку тем кому уже писали этот текст <span class="tt" data-tip="Софт запоминает кому и какой текст уже отправлен (или окончательно не удался: приватность/блок/бан). Повторный запуск с тем же текстом пропускает их и шлёт только новым. Идеально для «10 акков × лимит 20 = 200, в файле 500 → повторный запуск возьмёт оставшиеся 300». Если хочешь снова отправить тем же — измени текст или сбрось историю в Настройках.">?</span>
            </label>

            <div class="d-flex align-center justify-between">
                <span class="text-sm text-muted">
                    <i class="bi bi-people"></i> <span id="dm-count">0</span> юзеров
                </span>
                <div class="d-flex gap-3 align-center">
                    <button class="btn btn-outline btn-sm" onclick="exportDmResults()" data-tip="Выгрузка результатов: кому дошло / кому не дошло (приватность/спам/не найден)">
                        <i class="bi bi-folder2-open"></i> Выгрузка
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="retryFailedDm()" data-tip="Запустить ещё раз только по тем юзерам, где не получилось">
                        <i class="bi bi-arrow-counterclockwise"></i> Повторить <i class="bi bi-x-circle text-danger"></i>
                    </button>
                    <button class="btn btn-pink btn-sm" onclick="startDm()" id="btn-dm" disabled
                            data-tip="Лимиты Telegram: новые акки безопасно ~20-50 ЛС/день, прогретые до 200-300/день. PeerFlood = 6ч cooldown.">
                        <i class="bi bi-send"></i> Старт
                    </button>
                    <button class="btn btn-danger btn-sm" onclick="stopDm()" id="btn-dm-stop" disabled data-tip="Остановить рассылку в ЛС">
                        <i class="bi bi-stop-fill"></i> Стоп
                    </button>
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="dm-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок<span class="ad-hint">Заблокированные пропустим</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="dm-keep-online"> <span>Держать аккаунт онлайн во время работы</span></label>
                    <label class="ad-check"><input type="checkbox" id="dm-view-profile"> <span>Смотреть профиль перед отправкой<span class="ad-hint" style="color:#f59e0b">⚠ Включай только для прогретых акков. На свежих 10× view_profile к незнакомым целям подряд — bot-сигнатура для TG, рискует отзывом сессии.</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="dm-view-photo"> <span>Смотреть фото профиля<span class="ad-hint" style="color:#f59e0b">⚠ Та же история — на свежих акках усиливает риск revoke.</span></span></label>
                </div>
            </details>
        </div>
    </div>

    <!-- Автоответчик — inline expandable секция в табе ЛС (вместо отдельной вкладки). -->
    <details class="card mb-3" style="padding:0;border-left:3px solid #34d399;">
        <summary style="padding:14px 16px;cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;font-weight:500;font-size:0.92rem;">
            <i class="bi bi-reply" style="color:#34d399;"></i> Автоответчик на входящие ЛС
            <span style="margin-left:auto;font-size:0.7rem;color:var(--text-muted);font-weight:normal;">авто-ответ на каждое первое сообщение</span>
        </summary>
        <div style="padding:0 16px 16px 16px;">
            <div style="font-size:0.75rem;color:var(--text-muted);margin-bottom:12px;">
                Один автоответ на юзера. Спинтакс <code>{Привет|Здравствуйте}</code>. Подробные настройки — на отдельной странице.
            </div>
            <button type="button" onclick="showTab('autoreply')" class="btn btn-accent" style="width:100%;">
                <i class="bi bi-gear"></i> Открыть полные настройки автоответчика
            </button>
        </div>
    </details>

    <!-- Тайминги ЛС -->
    <details class="card mb-3" style="padding:0;">
        <summary style="padding:14px 16px;cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;font-weight:500;font-size:0.92rem;">
            <i class="bi bi-clock" style="color:var(--pink);"></i> Тайминги ЛС
            <span class="ts-sync-badge" style="margin-left:auto;font-size:0.7rem;color:var(--text-muted);font-weight:normal;" title="Статус синхронизации с бэк-эндом — что реально записано в настройках">✓ сохранено</span>
        </summary>
        <div style="padding:0 16px 16px 16px;">
            <div class="info-box info-box--warning">
                В ЛС лимиты жёстче чем в чатах — Telegram быстро дает вечный спам-блок. Минимум 30+ сек паузы.
            </div>
            <div class="grid-3 mb-2">
                <div class="mb-2"><label class="form-label">Мин. пауза (сек) <span class="tt" data-tip="Минимальная пауза между двумя ЛС с одного акка. В ЛС лимиты жёстче чем в чатах — Telegram быстро банит за частую активность. Рекомендую 30+ секунд минимум.">?</span></label><input type="range" class="range-slider" id="s-dm-min" min="10" max="120" value="35"><span class="text-sm text-muted" id="v-dm-min">35</span></div>
                <div class="mb-2"><label class="form-label">Макс. пауза (сек) <span class="tt" data-tip="Максимальная пауза между ЛС. Софт берёт случайное число между «мин» и «макс» — не одинаковая задержка каждый раз. 90с — норм для ЛС, 60-180с безопаснее.">?</span></label><input type="range" class="range-slider" id="s-dm-max" min="20" max="300" value="90"><span class="text-sm text-muted" id="v-dm-max">90</span></div>
                <input type="hidden" id="s-dm-burst" value="999999">
                <div class="mb-2"><label class="form-label">Длинная пауза мин (сек) <span class="tt" data-tip="Минимальная длинная пауза после серии ЛС (см. «До паузы»). 300с = 5 минут отдыха минимум. В ЛС безопаснее 5-15 минут.">?</span></label><input type="range" class="range-slider" id="s-dm-burst-pause-min" min="60" max="900" value="300"><span class="text-sm text-muted" id="v-dm-burst-pause-min">300</span></div>
                <div class="mb-2"><label class="form-label">Длинная пауза макс (сек) <span class="tt" data-tip="Максимальная длинная пауза. Случайное значение между «мин» и «макс». 600с = до 10 минут — типичная пауза для ЛС.">?</span></label><input type="range" class="range-slider" id="s-dm-burst-pause-max" min="120" max="1800" value="600"><span class="text-sm text-muted" id="v-dm-burst-pause-max">600</span></div>
                <div class="mb-2"><label class="form-label">Стоп при FloodWait > (сек) <span class="tt" data-tip="Если Telegram попросил подождать N секунд — задача стопается только если N БОЛЬШЕ порога. Дефолт 300 (5 мин). FW короче — пережидаем и продолжаем. В ЛС лимиты жёстче, можешь поставить 600.">?</span></label><input type="range" class="range-slider" id="s-dm-floodwait-stop" min="60" max="900" value="300"><span class="text-sm text-muted" id="v-dm-floodwait-stop">300</span></div>
            </div>
        </div>
    </details>
</div>

<!-- ═══ TAB: Подписка ═══ -->
<div class="section" id="tab-join">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-box-arrow-in-right text-success"></i> Вступление в чаты и группы</div>
        <div class="card-body">
            <!-- Убран acc-selector — только мульти-пикер -->
            <div class="d-flex align-center gap-2 mb-2 flex-wrap" style="font-size:0.78rem;">
                <button class="btn btn-accent btn-sm" onclick="openJoinMultiPicker()" style="font-size:0.78rem;padding:5px 14px;">
                    <i class="bi bi-people"></i> Выбрать аккаунты
                </button>
                <span id="join-multi-count" style="color:var(--warning);font-weight:600;">не выбрано</span>
                <button class="btn btn-outline btn-sm" onclick="clearMultiSelected()" style="font-size:0.72rem;padding:4px 10px;" data-tip="Снять выбор всех аккаунтов">
                    <i class="bi bi-x-circle"></i> Снять
                </button>
            </div>
            <div class="info-box info-box--success">
                Вступление в чаты по списку ссылок с каждого выбранного акка. Дубликаты уберутся автоматически. Лимит и тайминги применяются к каждому акку.
            </div>
            <label class="form-label">Список ссылок (по одной на строке)</label>
            <textarea class="form-control mb-2" id="join-links" rows="5"
                placeholder="https://t.me/channel1&#10;https://t.me/+invite_hash&#10;@username"
                oninput="updateJoinCount()"></textarea>

            <div class="d-flex gap-2 mb-2 flex-wrap">
                <label class="btn btn-outline btn-sm" style="cursor:pointer;margin:0;display:flex;align-items:center;">
                    <i class="bi bi-file-text"></i> Загрузить .txt
                    <input type="file" accept=".txt" style="display:none" onchange="loadJoinFile(this)">
                </label>
                <button class="btn btn-outline btn-sm" onclick="document.getElementById('join-links').value='';">
                    <i class="bi bi-trash text-danger"></i>
                </button>
            </div>

            <div class="d-flex align-center gap-2 mb-2 flex-wrap">
                <label class="form-label" style="margin:0;font-size:0.78rem;">Лимит подписок с одного акка <span class="tt" data-tip="Сколько подписок разрешено одному аккаунту за задачу. 0 — без лимита, идёт до конца списка или пока Telegram не выкинет FloodWait. Безопасно: 20–30 для свежих, 50+ для прогретых.">?</span></label>
                <input type="number" class="form-control" id="join-max-per-acc"
                       value="0" min="0" max="2000" step="1"
                       style="width:90px;font-size:0.8rem;padding:4px 8px;">
                <span class="text-sm text-muted fs-70">
                    0 = без лимита
                </span>
            </div>

            <label class="opt-row mb-2">
                <input type="checkbox" id="join-dedup-history" checked>
                Не повторять подписки куда этот акк уже подписан <span class="tt" data-tip="Софт запоминает ссылки на которые акк успешно подписался (или окончательно не смог — закрытый канал/бан). Повторный запуск с тем же списком автоматически пропустит эти ссылки и попробует только новые. TTL 30 дней. Снять галку — игнорировать историю.">?</span>
            </label>

            <label class="opt-row mb-2">
                <input type="checkbox" id="s-join-autopilot" checked>
                🔄 Автопилот: пережидать FloodWait и дописывать остаток <span class="tt" data-tip="«Поставил и забыл» (пока софт открыт). При FloodWait акк сам ждёт, тормозит и дописывает оставшиеся ссылки до конца — с длинными паузами на отдых (анти-разлогин: до 4 циклов, потом стоп с остатком). Снять галку — старое поведение: акк останавливается после 3 FloodWait, остаток дописываешь вручную/на другом акке.">?</span>
            </label>

            <label class="opt-row mb-2">
                <input type="checkbox" id="s-join-fw-wait">
                Ждать любой FloodWait и продолжать <span id="s-join-fw-wait-note" class="text-muted" style="font-size:0.78rem;"></span> <span class="tt" data-tip="Работает ТОЛЬКО при выключенном Автопилоте (иначе Автопилот сам решает, что делать с FloodWait). Если включено без Автопилота — задача никогда не останавливается на FloodWait, акк спит ровно столько секунд сколько просит Telegram и работает дальше; порог «Стоп при FloodWait» игнорируется. ⚠️ Опасно для длинных списков: FloodWait'ы копятся (273→550→1690с) → возможен разлогин. Поэтому рекомендуется Автопилот.">?</span>
            </label>
            <script>
            // «Ждать любой FloodWait» не действует при включённом Автопилоте: в join.py
            // autopilot-ветка перекрывает wait_continue (if autopilot … elif wait_continue).
            // Гасим чекбокс, чтобы не путать (юзер 2026-06-17).
            (function() {
                function _syncJoinFw() {
                    var ap = document.getElementById('s-join-autopilot');
                    var fw = document.getElementById('s-join-fw-wait');
                    var note = document.getElementById('s-join-fw-wait-note');
                    if(!ap || !fw) return;
                    var row = fw.closest('.opt-row');
                    fw.disabled = ap.checked;
                    if(row) row.style.opacity = ap.checked ? '0.5' : '1';
                    if(note) note.textContent = ap.checked ? '(не действует — управляет Автопилот)' : '';
                }
                var ap = document.getElementById('s-join-autopilot');
                if(ap) ap.addEventListener('change', _syncJoinFw);
                _syncJoinFw();
                setTimeout(_syncJoinFw, 1500);
                window._syncJoinFw = _syncJoinFw;
            })();
            </script>

            <div class="d-flex align-center justify-between">
                <span class="text-sm text-muted">
                    <i class="bi bi-link-45deg"></i> <span id="join-count">0</span> ссылок
                </span>
                <div class="d-flex gap-3 align-center">
                    <button class="btn btn-outline btn-sm" onclick="exportJoinResults()" data-tip="Выгрузка результатов последней подписки: отдельно подписавшиеся и отдельно ошибки — для перезапуска на другом аккаунте">
                        <i class="bi bi-folder2-open"></i> Выгрузка
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="retryFailedJoin()" data-tip="Подставить в список только те ссылки, где не вышло — и нажать Старт на выбранном аккаунте">
                        <i class="bi bi-arrow-counterclockwise"></i> Повторить <i class="bi bi-x-circle text-danger"></i>
                    </button>
                    <label class="form-label m-0" data-tip="Сколько акков одновременно подписываются. 0 = все выбранные параллельно. N = только N в работе.">Потоки <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                    <input type="number" class="form-control" id="join-threads" value="0" min="0" max="100" style="width:70px;">
                    <button class="btn btn-success btn-sm" onclick="startJoin()" id="btn-join" disabled
                            data-tip="Лимиты Telegram: подписка ~50 чатов/час безопасно, ChannelsTooMuch при ~500 общем числе чатов на акке (надо чистить).">
                        <i class="bi bi-play-fill"></i> Старт
                    </button>
                    <button class="btn btn-danger btn-sm" onclick="stopJoin()" id="btn-join-stop" disabled data-tip="Остановить вступление">
                        <i class="bi bi-stop-fill"></i> Стоп
                    </button>
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="join-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок</span></label>
                    <label class="ad-check"><input type="checkbox" id="join-solve-captcha"> <span>Решать капчу-боты в чатах<span class="ad-hint">Shieldy / MissRose / Combot — нажмём «я не бот»</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="join-keep-online"> <span>Держать аккаунт онлайн во время работы</span></label>
                    <label class="ad-check"><input type="checkbox" id="join-auto-leave-no-write"> <span>Сразу выйти если в чате нельзя писать<span class="ad-hint">Broadcast-каналы без права писать / группы где запрещена отправка — выйдем сразу после вступления</span></span></label>
                </div>
            </details>
        </div>
    </div>

    <!-- Тайминги вкладки Подписка (раскрывашка) -->
    <details class="card mb-3" style="padding:0;">
        <summary style="padding:14px 16px;cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;font-weight:500;font-size:0.92rem;">
            <i class="bi bi-clock text-success"></i> Тайминги подписки
            <span class="ts-sync-badge" style="margin-left:auto;font-size:0.7rem;color:var(--text-muted);font-weight:normal;" title="Статус синхронизации с бэк-эндом — что реально записано в настройках">✓ сохранено</span>
        </summary>
        <div style="padding:0 16px 16px 16px;">
            <div class="info-box info-box--warning">
                Чем быстрее тайминги — тем выше шанс бана. Для новых акков ставьте паузы x2.
            </div>
            <div class="grid-3 mb-2">
                <div class="mb-2"><label class="form-label">Пауза между (сек) <span class="tt" data-tip="Базовая пауза между двумя подписками с одного акка. Например 18 — после каждой подписки следующая через 18 секунд. Telegram любит подписки 30+ сек, новым аккам ставь 30-45с.">?</span></label><input type="range" class="range-slider" id="s-join-interval" min="5" max="60" value="18"><span class="text-sm text-muted" id="v-join-interval">18</span></div>
                <div class="mb-2"><label class="form-label">Случайность ±сек <span class="tt" data-tip="Случайный разброс к базовой паузе. Если «Пауза между» = 18 и «Случайность» = 3 — реальная пауза будет от 18 до 21с (а не ровно 18 каждый раз). Делает поведение менее как у бота. 0 = всегда ровно 18с (хуже).">?</span></label><input type="range" class="range-slider" id="s-join-jitter" min="0" max="15" value="3"><span class="text-sm text-muted" id="v-join-jitter">3</span></div>
                <input type="hidden" id="s-join-max" value="999999">
                <div class="mb-2"><label class="form-label">Длинная пауза мин (сек) <span class="tt" data-tip="Минимальная длинная пауза после серии подписок (см. «До паузы»). 180с = 3 минуты отдыха минимум. Чем больше — тем безопаснее для свежего акка.">?</span></label><input type="range" class="range-slider" id="s-join-break" min="60" max="600" value="180"><span class="text-sm text-muted" id="v-join-break">180</span></div>
                <div class="mb-2"><label class="form-label">Длинная пауза макс (сек) <span class="tt" data-tip="Максимальная длинная пауза. Совмещает с «мин» — софт берёт случайное число секунд из этого диапазона. 360с = до 6 минут.">?</span></label><input type="range" class="range-slider" id="s-join-break-max" min="120" max="1200" value="360"><span class="text-sm text-muted" id="v-join-break-max">360</span></div>
                <div class="mb-2"><label class="form-label">Стоп при FloodWait > (сек) <span class="tt" data-tip="Если Telegram попросил подождать N секунд — задача останавливается только если N БОЛЬШЕ этого порога. Дефолт 300 (5 мин). FloodWait короче — просто пережидаем и продолжаем. Research 2025-2026: FW < 5 мин это норма пейсинга Telegram, не сигнал паники. Поставь 600 если хочешь дать больше шансов; 60 — старое жёсткое поведение (стоп при любом FW > 1 мин).">?</span></label><input type="range" class="range-slider" id="s-join-floodwait-stop" min="60" max="900" value="300"><span class="text-sm text-muted" id="v-join-floodwait-stop">300</span></div>
            </div>
        </div>
    </details>
</div>

<!-- ═══ TAB: Инвайтер ═══ -->
<div class="section" id="tab-invite">
    <div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px;">
        <button class="btn btn-outline btn-sm" onclick="inviteShowSubtab('main')" id="inv-sub-main" style="font-weight:500;"><i class="bi bi-list-ul"></i> Список чатов <span id="inv-chats-cnt" class="badge ml-1">0</span></button>
        <button class="btn btn-outline btn-sm" onclick="inviteShowSubtab('userdb')" data-tip="Кому уже отправляли инвайты — чтобы не звать повторно"><i class="bi bi-people"></i> История приглашённых <span id="inv-userdb-cnt" class="badge ml-1">0</span></button>
        <button class="btn btn-outline btn-sm" onclick="inviteShowSubtab('reports')"><i class="bi bi-clipboard-data"></i> Отчёты</button>
    </div>

    <!-- ── Sub-tab: Список чатов ── -->
    <div id="inv-tab-main">
        <div class="card mb-3">
            <div class="card-body">
                <div class="info-box info-box--warning" style="margin-bottom:14px;font-size:0.78rem;">
                    Акки сами вступают в чат при старте и выходят после завершения.
                </div>

                <label class="form-label">Режим работы <span class="tt" data-tip="Обычный — аккаунты-инвайтеры уже состоят в чате и приглашают сами по очереди. Через админку — главный аккаунт временно даёт остальным права администратора (на инвайт), потом снимает обратно. Полезно для свежих акков и для чатов где у обычных юзеров нет прав приглашать.">?</span></label>
                <select class="form-control mb-3" id="inv-mode" onchange="inviteToggleAdminBlock()">
                    <option value="direct">Обычный (без админки)</option>
                    <option value="via_admin">Через админку</option>
                </select>

                <label class="form-label">Целевой чат / канал <span class="tt" data-tip="Сюда инвайтим юзеров. Можно: @username (только для публичных чатов), числовой ID вида -1001234567890, или ссылку https://t.me/...">?</span></label>
                <input type="text" class="form-control mb-3" id="invite-chat"
                    placeholder="@chatname или -1001234567890 или https://t.me/chatname">

                <div id="inv-admin-block" style="display:none;">
                    <div class="callout callout-info mb-3" style="background:rgba(139,92,246,0.08);border-left:3px solid var(--accent-light);padding:12px 14px;border-radius:6px;font-size:0.74rem;line-height:1.6;">
                        <div style="font-weight:600;color:var(--accent-light);margin-bottom:6px;"><i class="bi bi-diagram-3"></i> Как работает «через админку»</div>
                        <div style="color:var(--text-secondary);">
                            <b>1.</b> Главный админ <b>уже в чате</b> и имеет право «Добавлять администраторов».<br>
                            <b>2.</b> Софт автоматически промоутит первых 3 акка в seed-админов (с правом промоутить других) — это нужно чтобы дальше нагрузка распределилась.<br>
                            <b>3.</b> Seed-админы по очереди промоутят остальных акков в простых админов с правом инвайта.<br>
                            <b>4.</b> Каждый промоутнутый акк инвайтит свою порцию юзеров.<br>
                            <b>5.</b> После инвайта софт <b>сам</b> снимает админку с акка (демоут).<br>
                            <b>Плюс режима:</b> работает даже если у обычных юзеров чата отключено право приглашать, плюс свежие акки выживают дольше (Telegram мягче к админам).<br>
                            <b>Минус:</b> главный админ должен быть надёжным акком в чате, и Telegram имеет лимит ~50 админов на чат — если уже близко, режим не сработает.
                        </div>
                    </div>
                    <label class="form-label">Главный админ <span class="tt" data-tip="Аккаунт который выдаст права остальным. Должен УЖЕ быть в чате и иметь право «Добавлять администраторов». Достаточно одного на всю задачу.">?</span></label>
                    <input type="text" class="form-control mb-3" id="inv-main-admin"
                        placeholder="79xxxxxxxxx — номер акка-главного-админа">
                </div>

                <label class="form-label">Кого инвайтим (юзернеймы / user_id, по строке)</label>
                <textarea class="form-control mb-2" id="invite-targets" rows="6"
                    placeholder="@user1&#10;@user2&#10;123456789"></textarea>
                <div style="display:flex;align-items:center;gap:8px;margin-bottom:12px;">
                    <button type="button" class="btn btn-outline btn-sm fs-72" onclick="loadInviteFromParser()"><i class="bi bi-magic"></i> Из парсинга</button>
                    <button type="button" class="btn btn-outline btn-sm fs-72" onclick="document.getElementById('invite-targets-file').click()"><i class="bi bi-file-earmark-text"></i> Из .txt</button>
                    <button type="button" class="btn btn-outline btn-sm fs-72" onclick="loadInviteFromUserdb()"><i class="bi bi-database"></i> Из базы юзеров</button>
                    <input type="file" id="invite-targets-file" accept=".txt,.csv" style="display:none" onchange="onInviteTargetsFile(event)">
                    <span id="invite-targets-count" style="margin-left:auto;font-size:0.72rem;color:var(--text-muted);"></span>
                </div>

                <details class="mb-3" open>
                    <summary style="cursor:pointer;font-size:0.78rem;color:var(--accent-light);padding:6px 0;font-weight:500;">
                        <i class="bi bi-people-fill"></i> Аккаунты-инвайтеры
                    </summary>
                    <div style="padding:8px 0 0 0;">
                        <div class="d-flex align-center gap-2 mb-2">
                            <button type="button" class="btn btn-outline btn-sm" onclick="openInviteAccPopup()" id="btn-invite-acc-pick">
                                <i class="bi bi-people"></i> Выбрать аккаунты
                            </button>
                            <span class="text-sm text-muted" id="invite-acc-count">все живые</span>
                            <span class="tt" data-tip="Если ничего не выбрано — софт автоматически использует ВСЕХ живых акков (не мёртвые, не замороженные). Если выбрал несколько — будет идти только по ним. Кнопка «Сбросить» снимает выбор → опять всех живых.">?</span>
                            <button type="button" class="btn btn-outline btn-sm" style="margin-left:auto;font-size:0.66rem;" onclick="clearInviteAccs()">
                                <i class="bi bi-x"></i> Сбросить (=все живые)
                            </button>
                        </div>
                        <div id="invite-acc-list" class="d-flex flex-wrap gap-2 mb-2" style="display:none;"></div>
                        <div style="font-size:0.66rem;color:var(--text-muted);line-height:1.5;">
                            Если ничего не выбрано — софт распределит инвайт по всем живым аккам автоматически.
                        </div>
                    </div>
                </details>
            </div>
        </div>

        <!-- Тайминги -->
        <div class="card mb-3">
            <div class="card-header"><i class="bi bi-sliders"></i> Тайминги и лимиты</div>
            <div class="card-body">
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Пауза между инвайтами с акка (мин, сек) <span class="tt" data-tip="Минимальная пауза между двумя инвайтами с одного и того же акка. Софт делает random.uniform(min, max) каждый раз. Чем больше — тем меньше шанс вечный спам-блок. Минимум 30с рекомендую.">?</span></label>
                        <input type="number" class="form-control" id="invite-pause-min" value="60" min="5" max="600">
                    </div>
                    <div>
                        <label class="form-label fs-72">Пауза между инвайтами с акка (макс, сек) <span class="tt" data-tip="Максимальная пауза. Случайное значение между min и max делает поведение менее ботоподобным. На практике обсуждений 2024-2025: 120с+ значительно снижает риск спам-блока против 30-70с.">?</span></label>
                        <input type="number" class="form-control" id="invite-pause-max" value="120" min="6" max="900">
                    </div>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Лимит успешных инвайтов с акка подряд <span class="tt" data-tip="После N успешных инвайтов с этого акка софт переключается на следующий из пула, чтобы не сжечь его в вечный спам-блок. По умолчанию 20-40, для очень свежих акков понизь до 10.">?</span></label>
                        <input type="number" class="form-control" id="invite-max-per-acc" value="40" min="1" max="500">
                    </div>
                    <div>
                        <label class="form-label fs-72">Кулдаун после PeerFlood, мин <span class="tt" data-tip="Если акк получил PeerFlood (Telegram забанил инвайт), он помечается как сожжённый и не используется в течение N минут. Дефолт 1440 (24ч) — research 2025-2026: Telegram реально снимает PeerFlood за 24-72ч; ретрай через 60 мин ловит 2-й PeerFlood и сжигает акк навсегда. Если жёстко — поставь 4320 (3 суток).">?</span></label>
                        <input type="number" class="form-control" id="invite-flood-cooldown" value="1440" min="10" max="10080">
                    </div>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Ежечасный лимит на акк <span class="tt" data-tip="Максимум инвайтов с одного акка за последний час. Сильная защита от вечный спам-блок — софт сам считает скользящее окно за час и не использует акк если упёрся в лимит.">?</span></label>
                        <input type="number" class="form-control" id="invite-hourly-limit" value="40" min="1" max="200">
                    </div>
                    <div>
                        <label class="form-label fs-72">Стоп после N подряд privacy <span class="tt" data-tip="Если N подряд юзеров отказали по приватности — задача останавливается. Полезно если список плохой (все стоят с приватностью «не разрешать инвайты») — лучше остановить и попробовать другой источник юзеров. 0 = не останавливать.">?</span></label>
                        <input type="number" class="form-control" id="invite-stop-on-privacy" value="0" min="0" max="100">
                    </div>
                </div>
            </div>
        </div>

        <!-- Доп опции -->
        <div class="card mb-3">
            <div class="card-header cursor-pointer" onclick="this.nextElementSibling.style.display = this.nextElementSibling.style.display==='none'?'':'none'">
                <i class="bi bi-three-dots"></i> Дополнительные опции
            </div>
            <div class="card-body" style="display:none;">
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Сколько спамблоков пропускать с акка <span class="tt" data-tip="После N подряд вечный спам-блок от одного акка софт окончательно помечает его «сожжённым» и переносит в папку «После инвайта/Спамблок». Дефолт 1 = после первого вечный спам-блок переносим. Если поставить 3 — даём акку 3 шанса (но это редко имеет смысл, после первого спамблока он уже не работает).">?</span></label>
                        <input type="number" class="form-control" id="inv-spamblock-skip" value="1" min="0" max="100">
                    </div>
                    <div>
                        <label class="form-label fs-72">Лимит «списаний» на акк <span class="tt" data-tip="«Списание» = после инвайта юзер мгновенно вылетает из чата (Telegram отбрасывает за защиту от спама). Telegram отвечает софту что инвайт прошёл, но юзера в чате нет. Если N таких списаний на одном акке — пометить его как сжёгся. По умолчанию 999 = практически выкл.">?</span></label>
                        <input type="number" class="form-control" id="inv-chargeback" value="999" min="1" max="100000">
                    </div>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Лимит больших задержек в чате <span class="tt" data-tip="Когда акк получает большую флуд-блок (часы/сутки) — это часто значит что что-то не так с самим чатом (Telegram считает его проблемным). Если в одном чате накопилось N таких задержек, инвайт в этот чат останавливается. По умолчанию 9999 = выкл.">?</span></label>
                        <input type="number" class="form-control" id="inv-big-fw" value="9999" min="1" max="100000">
                    </div>
                    <div>
                        <label class="form-label fs-72">Пауза между вступлениями акков в чат (сек) <span class="tt" data-tip="Каждый аккаунт вступает в чат по очереди — пауза между вступлениями случайная в этом диапазоне. Растягиваем массовое вступление чтобы не словить флуд-блок и не показывать «волну» новых участников. По умолчанию 7-15 сек.">?</span></label>
                        <div class="row-gap-6" >
                            <input type="number" class="form-control flex-1" id="inv-delay-join-min" value="7" min="0" max="600">
                            <input type="number" class="form-control flex-1" id="inv-delay-join-max" value="15" min="1" max="900">
                        </div>
                    </div>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label fs-72">Пауза между выдачей прав и инвайтом (сек) <span class="tt" data-tip="В режиме «Через админку» — пауза между выдачей прав каждому акку. И во всех режимах — пауза после выдачи прав, перед началом приглашений. Слишком быстро — главный акк может схлопотать флуд-блок.">?</span></label>
                        <div class="row-gap-6" >
                            <input type="number" class="form-control flex-1" id="inv-delay-promote-min" value="5" min="0" max="600">
                            <input type="number" class="form-control flex-1" id="inv-delay-promote-max" value="12" min="1" max="900">
                        </div>
                    </div>
                    <div>
                        <label class="form-label fs-72">Помощников у главного админа <span class="tt" data-tip="Только в режиме «Через админку». Главный админ выдаст права на «добавление админов» сразу нескольким аккам — они станут помощниками и помогут раздавать права остальным. 1 = всех делает один главный (медленно для 30+ акков). 3-5 — оптимально. Больше — главный риск переутомить себя и схлопотать флуд-блок.">?</span></label>
                        <input type="number" class="form-control" id="inv-cascade-seed" value="3" min="1" max="20">
                    </div>
                </div>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:8px;">
                    <input type="checkbox" id="inv-set-spamblock" checked> Запоминать кому уже отправляли инвайты <span class="tt" data-tip="После инвайта юзер попадает в базу с пометкой (приглашён / приватность / спам-блок). В следующий раз инвайтер пропустит таких — не спам ему повторно.">?</span>
                </label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:8px;">
                    <input type="checkbox" id="inv-skip-chatinvalid" checked> Пропускать ошибки прав в чате <span class="tt" data-tip="Если у акка нет прав в чате — Telegram возвращает ошибку. Включено: софт пропускает и идёт дальше. Выключено: останавливается на первой такой ошибке.">?</span>
                </label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:8px;">
                    <input type="checkbox" id="inv-leave-worker" checked> Выходить из группы после инвайта (обычным аккам) <span class="tt" data-tip="После завершения задачи акки-инвайтеры покидают чат — чтобы их не было видно среди участников. Главного админа это не касается (у него отдельная настройка ниже).">?</span>
                </label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:8px;">
                    <input type="checkbox" id="inv-leave-admin"> Выходить из группы после инвайта (главному админу) <span class="tt" data-tip="Применимо только в режиме «Через админку». Обычно главный админ остаётся в чате (он же и так твой основной), но если ты хочешь чтобы и он вышел — включи.">?</span>
                </label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:8px;">
                    <input type="checkbox" id="inv-archive"> Добавлять группу в архив и отключать оповещения <span class="tt" data-tip="Применяется к каждому акку-инвайтеру: после инвайта чат уйдёт в архив и звуки в нём отключатся. Полезно если акк остаётся в чате — чтобы не получать оттуда уведомлений.">?</span>
                </label>
            </div>
        </div>

        <!-- Настройки прав -->
        <div class="card mb-3">
            <div class="card-header cursor-pointer" onclick="this.nextElementSibling.style.display = this.nextElementSibling.style.display==='none'?'':'none'">
                <i class="bi bi-shield-check"></i> Настройки прав (для инвайта через админку)
            </div>
            <div class="card-body" style="display:none;">
                <div style="background:var(--surface-info-bg);border:1px solid var(--surface-info-border);border-radius:6px;padding:10px;margin-bottom:12px;font-size:0.7rem;color:var(--text-muted);">
                    Это права, которые главный админ выдаёт инвайтящим аккам. Чтобы он мог их выдать — он должен сам ими обладать.
                </div>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-changeinfo"> Изменение профиля группы</label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-deletemsg"> Удаление сообщений</label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-banusers"> Блокировка участников</label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-managecall"> Управление видеочатами</label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-pin"> Закрепление сообщений</label>
                <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:0.78rem;margin-bottom:6px;"><input type="checkbox" id="inv-r-anon" checked> Анонимность</label>
            </div>
        </div>

        <!-- Папки -->
        <div class="card mb-3">
            <div class="card-header cursor-pointer" onclick="this.nextElementSibling.style.display = this.nextElementSibling.style.display==='none'?'':'none'">
                <i class="bi bi-folder2-open"></i> Настройки папок
            </div>
            <div class="card-body" style="display:none;">
                <label class="form-label fs-72">Папка для аккаунтов, получивших спамблок <span class="tt" data-tip="Куда переехать акку после получения вечный спам-блок (с учётом «Сколько спамблоков пропускать»). Папка создаётся автоматически если её нет. Путь относительно корня клиента, должен начинаться с «Аккаунты/».">?</span></label>
                <input type="text" class="form-control mb-2" id="inv-folder-spamblock" value="Аккаунты/После инвайта/Спамблок">
                <label class="form-label fs-72">Папка для слишком свежих аккаунтов <span class="tt" data-tip="В режиме «Через админку» Telegram не разрешает выдавать админ-права акку младше 24 часов. Такие аккаунты софт переместит сюда — пусть полежат сутки, потом попробуй снова.">?</span></label>
                <input type="text" class="form-control mb-2" id="inv-folder-fresh" value="Аккаунты/После инвайта/Слишком свежая сессия для изменения прав">
                <label class="form-label fs-72">Папка для аккаунтов, получивших лимит на поиск <span class="tt" data-tip="Telegram иногда временно запрещает аккам резолвить юзеров по @username (поиск). Если такое случилось — акк переезжает сюда, чтобы не тратить его в дальнейшем. Лимит сбрасывается через сутки-двое.">?</span></label>
                <input type="text" class="form-control mb-2" id="inv-folder-search" value="Аккаунты/После инвайта/Лимит на поиск по номерам">
            </div>
        </div>

        <details class="ad-block">
            <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
            <div class="ad-body">
                <label class="ad-check"><input type="checkbox" id="inv-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок<span class="ad-hint">Заблокированные пропустим</span></span></label>
                <label class="ad-check"><input type="checkbox" id="inv-solve-captcha"> <span>Решать капчу-боты в чатах<span class="ad-hint">Если в чате есть антиспам-бот — нажмём «я не бот»</span></span></label>
                <label class="ad-check"><input type="checkbox" id="inv-keep-online"> <span>Держать аккаунт онлайн во время работы</span></label>
                <label class="ad-check"><input type="checkbox" id="inv-view-profile"> <span>Смотреть профиль цели перед инвайтом<span class="ad-hint">Имитация — открыть профиль как живой человек</span></span></label>
                <label class="ad-check"><input type="checkbox" id="inv-view-photo"> <span>Смотреть фото профиля цели</span></label>
            </div>
        </details>

        <div class="d-flex gap-2 mb-3">
            <button class="btn btn-accent" onclick="startInvite()" id="btn-invite-start"
                    data-tip="Лимиты Telegram: 50 инвайтов/24ч — мягкий, 200/24ч — жёсткий, потом длинный FloodWait. Лимит общий на акк (на все каналы суммарно). Жалоба на 1 канал владельца снижает лимиты на ВСЕ его каналы.">
                <i class="bi bi-play-fill"></i> Старт инвайта
            </button>
            <button class="btn btn-outline" onclick="saveInviteSettings()"><i class="bi bi-save"></i> Сохранить настройки</button>
            <button class="btn btn-danger" onclick="stopInvite()" id="btn-invite-stop" style="display:none;"><i class="bi bi-stop-fill"></i> Стоп</button>
            <button class="btn btn-outline" onclick="exportInviteResults()" id="btn-invite-export" style="display:none;"><i class="bi bi-download"></i> Скачать отчёт</button>
        </div>

        <div id="invite-progress" style="display:none;">
            <div style="background:var(--surface-info-bg);border-radius:8px;padding:12px;margin-bottom:8px;">
                <div style="display:flex;justify-content:space-between;font-size:0.78rem;margin-bottom:6px;">
                    <span><b id="invite-status-label">—</b></span>
                    <span id="invite-elapsed" style="color:var(--text-muted);font-size:0.7rem;">—</span>
                </div>
                <div class="progress mb-2"><div class="progress-bar" id="invite-bar" style="width:0%;"></div></div>
                <div id="invite-counts" style="display:flex;gap:14px;flex-wrap:wrap;font-size:0.74rem;"></div>
            </div>
            <div id="invite-log" style="background:var(--bg-input);border:1px solid var(--border);border-radius:8px;padding:8px;font-family:monospace;font-size:0.72rem;max-height:240px;overflow-y:auto;line-height:1.5;"></div>
        </div>
    </div>

    <!-- ── Sub-tab: История приглашённых ── -->
    <div id="inv-tab-userdb" style="display:none;">
        <div class="card">
            <div class="card-body">
                <div class="info-box note-row">
                    Тут хранятся юзеры, кому уже отправляли инвайты — чтобы не приглашать их повторно. Каждый помечен тегом: <b>«приглашён»</b>, <b>«приватность»</b>, <b>«спам-блок»</b>. Можно импортировать готовый список из .txt и пометить вручную.
                </div>
                <div style="display:flex;gap:8px;margin-bottom:10px;flex-wrap:wrap;">
                    <input type="text" class="form-control" id="inv-userdb-search" placeholder="Поиск по @username или id" style="flex:1;min-width:160px;" oninput="loadInviteUserdb()">
                    <button class="btn btn-outline btn-sm" onclick="document.getElementById('inv-userdb-import').click()"><i class="bi bi-cloud-upload"></i> Импорт .txt</button>
                    <button class="btn btn-outline btn-sm" onclick="exportInviteUserdb()"><i class="bi bi-download"></i> Экспорт</button>
                    <button class="btn btn-danger btn-sm" onclick="clearInviteUserdb()"><i class="bi bi-trash"></i> Очистить</button>
                    <input type="file" id="inv-userdb-import" accept=".txt,.csv" style="display:none" onchange="onInviteUserdbImport(event)">
                </div>
                <div id="inv-userdb-list" style="max-height:520px;overflow-y:auto;font-family:monospace;font-size:0.78rem;background:var(--bg-input);border:1px solid var(--border);border-radius:8px;padding:8px;">Загрузка…</div>
            </div>
        </div>
    </div>

    <!-- ── Sub-tab: Отчёты ── -->
    <div id="inv-tab-reports" style="display:none;">
        <div class="card">
            <div class="card-body">
                <div id="inv-reports-list" style="font-size:0.85rem;">Запусков ещё не было — отчёты появятся после первого инвайта</div>
            </div>
        </div>
    </div>
</div>

<div class="section" id="tab-accounts">
    <!-- Баннер с реальным путём к папке Аккаунты — показывает куда класть .session/.json. -->
    <div id="accounts-path-banner" class="accounts-path-banner">
        <i class="bi bi-folder2-open"></i>
        <span>Папка аккаунтов: <code id="accounts-path-value">загрузка…</code></span>
    </div>

    <!-- Добавить аккаунт — компактная секция сверху -->
    <div class="card mb-3">
        <div class="card-header cursor-pointer" onclick="toggleAccAdd()">
            <i class="bi bi-plus-circle text-success"></i> Добавить аккаунт
            <i class="bi bi-chevron-down text-muted" style="margin-left:auto;font-size:0.7rem;transition:transform .2s;" id="acc-add-chevron"></i>
        </div>
        <div class="card-body" id="acc-add-body" style="display:none;padding:14px 20px;">
            <div class="grid-3" style="gap:20px;">
                <!-- Способ 1: По номеру -->
                <div>
                    <div style="font-size:0.7rem;color:var(--text-muted);font-weight:600;text-transform:uppercase;margin-bottom:6px;">По номеру телефона</div>
                    <div id="acc-connect-form">
                        <input type="tel" class="form-control mb-2" id="acc-phone" placeholder="+998901234567" oninput="sanitizePhoneInput(this)">
                        <button class="btn btn-accent btn-sm" onclick="sendCode()">
                            <i class="bi bi-send"></i> Отправить код
                        </button>
                        <button class="btn btn-outline btn-sm mt-2" onclick="startQrLogin()" data-tip="Войти через QR — отсканируй с мобильного TG, как qrcode.t.me">
                            <i class="bi bi-qr-code"></i> QR-логин
                        </button>
                    </div>
                    <div id="acc-code-form" style="display:none;">
                        <label class="form-label">Код из Telegram</label>
                        <input type="text" class="form-control mb-2" id="acc-code" placeholder="12345" maxlength="6">
                        <button class="btn btn-accent btn-sm" onclick="verifyCode()">
                            <i class="bi bi-check2"></i> Подтвердить
                        </button>
                    </div>
                    <div id="acc-qr-form" style="display:none;margin-top:10px;padding:10px;border:1px solid var(--border);border-radius:8px;text-align:center;">
                        <img id="acc-qr-img" src="" alt="QR" style="max-width:220px;background:#fff;padding:8px;border-radius:6px;"/>
                        <div id="acc-qr-status" style="font-size:0.75rem;color:var(--text-muted);margin-top:6px;">Открой TG на телефоне → Настройки → Устройства → «Подключить устройство» → отсканируй</div>
                        <button class="btn btn-outline btn-sm mt-2" onclick="cancelQrLogin()"><i class="bi bi-x"></i> Отмена</button>
                    </div>
                </div>
                <!-- Способ 2: Из папки -->
                <div>
                    <div style="font-size:0.7rem;color:var(--text-muted);font-weight:600;text-transform:uppercase;margin-bottom:6px;">Из папки</div>
                    <p style="font-size:0.72rem;color:var(--text-muted);margin-bottom:8px;">Закиньте <b>.session</b> + <b>.json</b> в папку и нажмите обновить</p>
                    <div class="row-gap-6" >
                        <button class="btn btn-outline btn-sm" onclick="openAccountsFolder()">
                            <i class="bi bi-folder2-open"></i> Открыть папку
                        </button>
                        <button class="btn btn-outline btn-sm" onclick="syncAndReload()">
                            <i class="bi bi-arrow-clockwise"></i> Обновить
                        </button>
                    </div>
                    <div class="text-xs text-muted mt-2">Закиньте в <code>Аккаунты/В работе/</code></div>
                    <div class="text-xs text-muted mt-2" style="border-top:1px dashed var(--border);padding-top:6px;">
                        <b style="color:var(--accent-light);">📦 Bulk-импорт:</b> бросьте сюда один <b>.zip</b> с .session+.json парами — софт распакует и импортирует всё.
                    </div>
                </div>
            </div>
            <div id="upload-progress" style="display:none;margin-top:8px;">
                <div class="progress"><div class="progress-bar" id="upload-bar" style="width:0%;"></div></div>
                <div class="text-xs text-muted mt-2" id="upload-status">Загрузка...</div>
            </div>
            <!-- «Массовое по номеру» слито в секцию «Добавить аккаунт». ID'шники bulk-login-* сохранены — JS не трогаем. -->
            <div id="bulk-login-body" style="margin-top:16px;border-top:1px solid var(--border);padding-top:14px;">
                <div style="font-size:0.7rem;color:var(--text-muted);font-weight:600;text-transform:uppercase;margin-bottom:8px;">
                    <i class="bi bi-list-ol text-success"></i> Сразу много — по списку номеров
                </div>
            <p style="font-size:0.74rem;color:var(--text-muted);margin-bottom:8px;line-height:1.5;">
                Список номеров — по одному в строке. Каждый коннект идёт <b style="color:var(--accent-light);">через прокси</b>
                (с ротационным — свой IP на каждый коннект), у каждого акка свой device-fingerprint и 2FA пишутся в .json.
                <b>Потоки</b> — сколько номеров отправляем одновременно (0 = все сразу). С прокси можно параллелить; без прокси ставь Потоки=1.
                Коды вводишь вручную в таблице по мере прихода. Незарегистрированный номер → предложит регистрацию (имя).
            </p>
            <textarea class="form-control mb-2" id="bulk-login-phones" rows="4" placeholder="+998901234567&#10;+79991234567&#10;+37368512345"></textarea>
            <div class="row-gap-6 align-center" style="margin-bottom:10px;flex-wrap:wrap;">
                <label class="form-label" style="margin:0;font-size:0.74rem;" data-tip="Сколько номеров отправляют код одновременно. 0 = без лимита (все сразу). Без прокси ставь 1.">Потоки</label>
                <input type="number" class="form-control" id="bulk-login-threads" value="3" min="0" max="50" style="width:72px;">
                <label class="form-label" style="margin:0 0 0 6px;font-size:0.74rem;" data-tip="Пауза между запусками номеров (стаггер), сек. 0 = сразу.">Задержка, сек</label>
                <input type="number" class="form-control" id="bulk-login-delay" value="5" min="0" max="120" style="width:72px;">
                <button class="btn btn-accent btn-sm" onclick="bulkLoginStart()"><i class="bi bi-play-fill"></i> Старт</button>
                <button class="btn btn-outline btn-sm" onclick="bulkLoginClear(true)" data-tip="Убрать завершённые из таблицы"><i class="bi bi-check2-all"></i> Очистить готовые</button>
                <button class="btn btn-outline btn-sm" onclick="bulkLoginClear(false)"><i class="bi bi-x-circle"></i> Очистить всё</button>
            </div>
            <div id="bulk-login-table-wrap" style="display:none;">
                <table class="table" style="font-size:0.8rem;">
                    <thead><tr><th style="width:30%;">Номер</th><th style="width:24%;">Статус</th><th>Действие</th></tr></thead>
                    <tbody id="bulk-login-tbody"></tbody>
                </table>
            </div>
            </div>
        </div>
    </div>

    <!-- Статус-фильтр (живой/мёртвый/заморожен/спам) -->
    <!-- status chips удалены: папки сверху фильтруют по локации, статус виден badge'ом в строке акка. -->
    <div id="acc-status-row" style="display:none;"></div>

    <!-- Статистика аккаунтов (динамические фильтры по папкам) -->
    <div class="acc-stats-row mb-3 flex-wrap" id="acc-stats-row"></div>

    <!-- Панель действий -->
    <div class="d-flex align-center justify-between mb-2" style="gap:8px;flex-wrap:wrap;">
        <div class="d-flex gap-2 align-center flex-wrap">
            <button class="btn btn-outline btn-sm" onclick="checkAllSpam()" id="btn-check-all-spam">
                <i class="bi bi-shield-check"></i> Проверить спам <span class="tt" data-tip="Если в таблице ничего не отмечено — проверим все аккаунты. Если есть галки — проверим только их.">?</span>
            </button>
            <!-- Настройка потоков прямо рядом, не в раскрывашке -->
            <label style="display:flex;align-items:center;gap:4px;font-size:0.72rem;color:var(--text-muted);" data-tip="Сколько акков проверять одновременно. 0 = все сразу (если у каждого свой прокси). 5 = безопасно для одного IP.">
                Потоков:
                <input type="number" id="acc-spam-threads" min="0" max="200" value="0" placeholder="0=все" style="width:60px;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:2px 6px;color:var(--text);font-size:0.72rem;" onchange="localStorage.setItem('tp_spam_threads', this.value)">
            </label>
            <!-- Быстрая проверка: 1 хендшейк без @SpamBot. -->
            <label style="display:flex;align-items:center;gap:4px;font-size:0.72rem;color:var(--text-muted);cursor:pointer;" data-tip="Быстрая проверка: только живой/мёртвый, без @SpamBot. 7 аккаунтов ≈ 5-10 секунд.">
                <input type="checkbox" id="acc-spam-fast" style="margin:0;cursor:pointer;" onchange="localStorage.setItem('tp_spam_fast', this.checked ? '1' : '0')">
                Быстро
            </label>
            <!-- Проверка без прокси — прямой коннект, но по 1 акку с паузой -->
            <label style="display:flex;align-items:center;gap:4px;font-size:0.72rem;color:#e0a83e;cursor:pointer;" data-tip="Проверять БЕЗ прокси: прямой коннект с твоего реального IP, но ПО ОДНОМУ акку с паузой (не 38 разом = меньше похоже на ферму). На свой риск — Telegram видит твой IP. Для рассылки/прогрева прокси всё равно обязательны.">
                <input type="checkbox" id="acc-spam-noproxy" style="margin:0;cursor:pointer;" onchange="localStorage.setItem('tp_spam_noproxy', this.checked ? '1' : '0')">
                Без прокси (по очереди)
            </label>
            <button class="btn btn-outline btn-sm" onclick="syncAndReload()" data-tip="Синхронизировать с папкой">
                <i class="bi bi-arrow-clockwise"></i>
            </button>
            <button class="btn btn-outline btn-sm" onclick="openAccountsFolder()" data-tip="Открыть папку аккаунтов">
                <i class="bi bi-folder2-open"></i> Папка
            </button>
            <button class="btn btn-outline btn-sm" onclick="openAccountsSourcesModal()" data-tip="Показать откуда грузятся все аккаунты + удалить лишние">
                <i class="bi bi-search"></i> Откуда?
            </button>
            <button class="btn btn-outline btn-sm" onclick="moveSelectedToFolder()" data-tip="Переместить отмеченные аккаунты в другую папку">
                <i class="bi bi-box-arrow-right"></i> Перенести
            </button>
            <button class="btn btn-outline btn-sm btn-danger-soft" id="btn-delete-selected" onclick="deleteAccountsBulk()" disabled data-tip="Выделите хотя бы один аккаунт чтобы удалить">
                <i class="bi bi-trash"></i> Удалить выделенные <span id="btn-delete-selected-count" style="margin-left:6px;font-size:0.7rem;opacity:0.7;">0</span>
            </button>
            <input type="text" class="form-control" id="acc-search" placeholder="Поиск..." style="width:180px;padding:5px 10px;font-size:0.75rem;" oninput="filterAccountsTable()">
            <select id="acc-tag-filter" class="form-control" style="width:140px;padding:5px 10px;font-size:0.75rem;" onchange="filterAccountsTable()">
                <option value="">Все теги</option>
            </select>
        </div>
        <div class="d-flex gap-2 align-center" style="margin-left:auto;">
            <span class="text-xs text-muted">Показано: <span id="acc-shown">0</span> / <span id="acc-total">0</span></span>
            <span class="text-xs text-muted" id="acc-heartbeat-summary" style="display:none;"></span>
            <select id="acc-page-size" class="form-control" onchange="accChangePageSize()" style="width:100px;padding:4px 8px;font-size:0.72rem;">
                <option value="30">30</option>
                <option value="100">100</option>
                <option value="500" selected>500</option>
                <option value="0">Все</option>
            </select>
            <div class="d-flex gap-1 align-center" id="acc-pager" style="display:none;">
                <button class="btn btn-outline btn-sm" onclick="accPrevPage()" style="padding:4px 8px;"><i class="bi bi-chevron-left"></i></button>
                <span class="text-xs text-muted" id="acc-page-info">1 / 1</span>
                <button class="btn btn-outline btn-sm" onclick="accNextPage()" style="padding:4px 8px;"><i class="bi bi-chevron-right"></i></button>
            </div>
        </div>
    </div>

    <!-- Таблица аккаунтов -->
    <style>
      /* table-layout:fixed + клиппинг ячеек: таблица всегда влезает в окно,
         заголовки и значения не налезают друг на друга, длинный текст → «…». */
      #accounts-table { table-layout:fixed; width:100%; }
      #accounts-table th, #accounts-table td {
        overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
        vertical-align:middle;
      }
      #accounts-table th { padding-left:6px; padding-right:2px; font-size:0.64rem; letter-spacing:0; }
      /* колонка # — узкий padding, чтобы трёхзначный номер (до 252) не обрезался в «2…» */
      #accounts-table th:nth-child(2), #accounts-table td:nth-child(2) { padding-left:2px; padding-right:2px; }
      /* колонка Статус (5) — бейджи, перенос вместо ellipsis (overflow:hidden наследуется),
         иначе бейдж дорисовывался «...». */
      #accounts-table td:nth-child(5) { white-space:normal; }
      #accounts-table th .sort-arrow { margin-left:1px; }
      /* Короткие колонки (#, Гео, Статус, Отлёжка, Теги) — значения и заголовки
         по центру. Телефон и Имя — слева (длинный текст), Действия — справа. */
      #accounts-table th:nth-child(2), #accounts-table td:nth-child(2),
      #accounts-table th:nth-child(4), #accounts-table td:nth-child(4),
      #accounts-table th:nth-child(5), #accounts-table td:nth-child(5),
      #accounts-table th:nth-child(6), #accounts-table td:nth-child(6),
      #accounts-table th:nth-child(8), #accounts-table td:nth-child(8) { text-align:center; }
      #accounts-table .acc-actions { display:flex; gap:2px; justify-content:center; flex-wrap:nowrap; }
      #accounts-table .acc-actions .btn, #accounts-table .acc-actions .btn-tg-open {
        padding:2px 5px; font-size:0.62rem; flex:0 0 auto;
      }
    </style>
    <div class="card">
        <div class="card-body" style="padding:0;">
            <table class="table" id="accounts-table">
                <thead>
                    <tr>
                        <th style="width:28px;"><input type="checkbox" id="acc-check-all" onchange="toggleAllAccChecks(this)" ></th>
                        <th style="width:40px;text-align:center;">#</th>
                        <th class="sortable-th" data-sort-key="phone" onclick="setAccSort('phone')" style="width:134px;">Телефон <span class="sort-arrow"></span></th>
                        <th class="sortable-th" data-sort-key="geo" onclick="setAccSort('geo')" style="width:54px;">Гео <span class="sort-arrow"></span></th>
                        <th class="sortable-th" data-sort-key="status" onclick="setAccSort('status')" style="width:124px;">Статус <span class="sort-arrow"></span></th>
                        <th class="sortable-th col-age" data-sort-key="age" onclick="setAccSort('age')" style="width:96px;">Отлежка <span class="sort-arrow"></span></th>
                        <th class="sortable-th" data-sort-key="name" onclick="setAccSort('name')" style="min-width:90px;">Имя <span class="sort-arrow"></span></th>
                        <th style="width:52px;">Теги</th>
                        <th style="text-align:center;width:158px;">Действия</th>
                    </tr>
                </thead>
                <tbody id="accounts-list">
                    <tr><td colspan="9" style="text-align:center;padding:32px;color:var(--text-muted);">
                        <i class="bi bi-inbox" style="font-size:1.5rem;display:block;margin-bottom:8px;"></i>Нет аккаунтов
                    </td></tr>
                </tbody>
            </table>
        </div>
    </div>
</div>

<!-- ═══ TAB: Прокси ═══ -->
<div class="section" id="tab-proxy">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-lock" style="color:#06b6d4;"></i> Прокси</div>
        <div class="card-body">
            <!-- Тип прокси определяется автоматически при проверке. Остаётся только порядок раздачи. -->
            <input type="hidden" id="proxy-type-default" value="auto">
            <div class="mb-3" style="max-width:280px;">
                <label class="form-label">Порядок раздачи прокси по аккаунтам</label>
                <select class="form-control" id="proxy-order">
                    <option value="random">Случайный</option>
                    <option value="sequential">По порядку</option>
                </select>
            </div>

            <!-- Список прокси -->
            <label class="form-label">Список прокси (по одному на строке)</label>
            <div style="background:var(--bg-input);border:1px solid var(--border);border-radius:8px;padding:4px;margin-bottom:8px;">
                <textarea class="form-control" id="proxy-input" rows="5" style="border:none;background:transparent;font-family:monospace;font-size:0.8rem;" onblur="autoSaveProxies()"
                    placeholder="ip:port&#10;ip:port:login:password&#10;login:password@ip:port&#10;socks5://ip:port:login:password"></textarea>
            </div>
            <div style="font-size:0.65rem;color:var(--text-muted);margin-bottom:8px;">
                Прокси сохраняются автоматически, как только уведёшь курсор из поля — кнопка «Добавить» не нужна.<br>
                Допустимые форматы записи:
                <code>ip:port</code> · <code>ip:port:логин:пароль</code> · <code>логин:пароль@ip:port</code>
            </div>
            <div class="d-flex gap-2 mb-3" style="align-items:center;flex-wrap:wrap;">
                <span class="text-sm text-muted self-center" id="proxy-count-label" style="margin-right:auto;"></span>
                <button class="btn btn-outline btn-sm" onclick="diagProxyIp()"
                        style="min-width:170px;justify-content:center;" data-tip="Сравнить твой реальный IP и IP через первый прокси из списка. Покажет — реально ли софт ходит через прокси или мимо.">
                    <i class="bi bi-search"></i> Сверить IP
                </button>
                <button class="btn btn-outline btn-sm" onclick="clearAllProxies()"
                        style="min-width:170px;justify-content:center;border-color:var(--danger);color:var(--danger);"
                        data-tip="Удалить ВСЕ прокси из списка">
                    <i class="bi bi-trash"></i> Удалить все
                </button>
                <button class="btn btn-outline btn-sm" onclick="checkAllProxies()"
                        style="min-width:170px;justify-content:center;" data-tip="Быстрая проверка: жив ли прокси по TCP/HTTP + реальная страна. НЕ ловит прокси что проходят TCP, но виснут на Telegram.">
                    <i class="bi bi-check2-all"></i> Проверить (TCP)
                </button>
                <button class="btn btn-accent btn-sm" onclick="mtprotoCheckProxies()"
                        style="min-width:200px;justify-content:center;" data-tip="Настоящая проверка: реальный коннект к Telegram через каждый прокси (MTProto). Ловит прокси что проходят TCP, но виснут на Telegram — из-за них живой акк висит на коннекте.">
                    <i class="bi bi-telegram"></i> Проверка через Telegram
                </button>
            </div>

            <div id="proxy-list"></div>
        </div>
    </div>
</div>

<!-- TAB «Шаблоны» удалён. Прогревовые шаблоны остаются как настройка во вкладке «Прогрев». -->

<!-- ═══ TAB: Парсинг юзеров ═══ -->
<div class="section" id="tab-parser">
    <!-- Аккаунт для парсинга -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-search" style="color:#f472b6;"></i> Парсинг</div>
        <div class="card-body">
            <div class="acc-selector mb-3" id="acc-selector-parser"></div>

            <!-- Режим парсинга — единый дропдаун. Каждая функция = отдельный пункт;
                 «Аудитория» разворачивает чекбоксы союза; «Досье» — accountless-режим. -->
            <label class="form-label">Режим парсинга</label>
            <select class="form-control mb-2 js-fancy-select" id="parser-mode-select" onchange="onParserModeSelect(this.value)">
                <optgroup label="Из чата">
                    <option value="audience" selected>Аудитория из чата — участники / писавшие / реакции / опросы</option>
                    <option value="links">Сборщик ссылок — t.me из сообщений и описаний</option>
                </optgroup>
                <optgroup label="Найти чаты / каналы">
                    <option value="keyword_global">Слово везде — найти чаты по слову (без акка)</option>
                    <option value="keyword">По словам — в МОИХ чатах (через акк)</option>
                    <option value="search">Глоб. поиск — найти чаты</option>
                </optgroup>
                <optgroup label="Проверка">
                    <option value="user_check">Чекер юзов — валидность + онлайн</option>
                    <option value="link_check">Чекер ссылок — валидность t.me</option>
                </optgroup>
            </select>

            <!-- Аудитория: кнопки-чекбоксы союза (видны только в режиме «Аудитория») -->
            <div class="parser-modes mb-2" id="parser-audience-combo">
                <button class="parser-mode-btn active" id="pm-members" onclick="setParserMode('members')">
                    <i class="bi bi-people"></i>
                    <span>Участники</span>
                    <small>Из списка чата</small>
                </button>
                <button class="parser-mode-btn" id="pm-writers" onclick="setParserMode('writers')">
                    <i class="bi bi-chat-text"></i>
                    <span>Писавшие</span>
                    <small>Кто писал в чат</small>
                </button>
                <button class="parser-mode-btn" id="pm-reactions" onclick="setParserMode('reactions')">
                    <i class="bi bi-heart"></i>
                    <span>Реакции</span>
                    <small>Кто реагировал на посты</small>
                </button>
                <button class="parser-mode-btn" id="pm-polls" onclick="setParserMode('polls')">
                    <i class="bi bi-bar-chart"></i>
                    <span>Опросы</span>
                    <small>Кто голосовал</small>
                </button>
            </div>

            <!-- Связка аудитории: подсказка мульти-выбора + тоггл пересечения -->
            <div id="parser-audience-hint" style="font-size:0.7rem;color:var(--text-muted);margin:-4px 0 10px;">
                <i class="bi bi-info-circle"></i> Участники / Писавшие / Реакции / Опросы можно отметить ВМЕСТЕ — соберём за один проход в одну базу (дубли убираются, видно источник).
            </div>
            <div id="parser-audience-intersect-row" style="display:none;margin-bottom:12px;">
                <label class="d-flex align-center gap-2" style="cursor:pointer;margin-bottom:0;">
                    <input type="checkbox" class="form-check-input" id="parser-audience-intersect">
                    <span style="font-size:0.82rem;">Только те, кто во ВСЕХ выбранных источниках <span style="color:var(--text-muted);">(пересечение — напр. И писал И реагировал = самые активные)</span></span>
                </label>
            </div>

            <!-- Блок ввода для «Чекер юзов» -->
            <div id="parser-user-check-row" style="display:none;" class="mb-3">
                <label class="form-label">Список юзеров (по одному на строке)</label>
                <textarea class="form-control" id="parser-user-check-list" rows="6"
                          placeholder="@username1&#10;@username2&#10;123456789&#10;https://t.me/username3"
                          style="font-family:monospace;font-size:0.78rem;"></textarea>
                <div style="font-size:0.7rem;color:var(--text-muted);margin-top:6px;">
                    Можно вставить @username, числовой ID или ссылку t.me/. Софт через выбранный акк проверит каждого: <b>валиден</b> (есть в Telegram), <b>онлайн</b> (если статус публичный), <b>last_seen</b> (recently / last_week / month / long_ago). Скрытые статусы = «приватность».
                </div>
                <div class="mt-2" style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
                    <label class="form-label m-0" style="font-size:0.78rem;">Оставить только активных
                        <span class="tt" data-tip="После проверки отсеять тех, кто давно не в сети. Требуется аккаунт — HTTP-чек без акка онлайн не видит. Бакеты грубые: Telegram сам прячет точное время для «недавно/неделя/месяц», берётся верхняя граница периода.">?</span>
                    </label>
                    <select class="form-control" id="parser-user-check-period" style="width:auto;font-size:0.78rem;">
                        <option value="all">Все (не фильтровать)</option>
                        <option value="online">Онлайн сейчас</option>
                        <option value="recently">Недавно (1–2 дня)</option>
                        <option value="week">За неделю</option>
                        <option value="month">За месяц</option>
                    </select>
                </div>
            </div>

            <!-- Чекер ссылок: список t.me-ссылок (виден только для 'link_check') -->
            <div id="parser-link-check-row" style="display:none;" class="mb-3">
                <label class="form-label">Список ссылок (по одной на строке)</label>
                <textarea class="form-control" id="parser-link-check-list" rows="6"
                          placeholder="https://t.me/channel&#10;@group_username&#10;https://t.me/+AbCdEf123456&#10;t.me/joinchat/XXXXXXXX"
                          style="font-family:monospace;font-size:0.78rem;"></textarea>
                <div style="font-size:0.7rem;color:var(--text-muted);margin-top:6px;">
                    Проверка валидности t.me-ссылок <b>без аккаунта</b> (через t.me): канал / группа / бот / юзер / <b>приватный инвайт (t.me/+…)</b> — название и число подписчиков. Подключишь акк сверху — быстрее, точнее для приватных инвайтов (MTProto, <b>без вступления</b>) и показывает <b>гео</b> у публичных гео-каналов/групп. Ссылки <code>t.me/c/…</code> — только с акком-участником. <b>До 200 ссылок за раз.</b>
                </div>
            </div>

            <!-- Блок ввода слова (виден только для режима 'keyword_global') -->
            <div id="parser-keyword-global-row" class="mb-3" style="display:none;">
                <label class="form-label">Слово или фраза</label>
                <input type="text" class="form-control" id="parser-keyword-global" placeholder="например: ДОМ или 'аренда квартир'">
                <div class="row g-2 mt-3">
                    <div class="col-md-6">
                        <label class="form-label" style="font-size:0.8rem;">Язык текста</label>
                        <select class="form-control" id="parser-kg-lang">
                            <option value="">Любой</option>
                            <option value="ru">Русский</option>
                            <option value="uk">Українська</option>
                            <option value="be">Беларуская</option>
                            <option value="kk">Қазақ</option>
                            <option value="en">English</option>
                        </select>
                        <div style="font-size:0.7rem;color:var(--text-muted);margin-top:3px;">по языку сообщений канала</div>
                    </div>
                    <div class="col-md-6">
                        <label class="form-label" style="font-size:0.8rem;">Регион канала</label>
                        <select class="form-control" id="parser-kg-region">
                            <option value="">Любой</option>
                            <option value="ru">Россия</option>
                            <option value="ua">Украина</option>
                            <option value="by">Беларусь</option>
                            <option value="kz">Казахстан</option>
                        </select>
                        <div style="font-size:0.7rem;color:var(--text-muted);margin-top:3px;">по имени канала и привязкам (Минск/Київ/Алматы)</div>
                    </div>
                </div>
                <label class="form-label mt-3" style="font-size:0.8rem;">TGStat token (необязательно, для полного охвата)</label>
                <input type="text" class="form-control" id="parser-kg-tgstat-token" placeholder="токен с api.tgstat.ru → раздел API → скопировать">
            </div>

            <!-- Блок ввода юзернейма (виден только для режима 'user_chats') -->
            <div id="parser-user-row" class="mb-3" style="display:none;">
                <label class="form-label">Юзернейм или ID</label>
                <input type="text" class="form-control" id="parser-target-user" placeholder="@username или 1234567 или https://t.me/username">
            </div>

            <!-- Выбор чатов -->
            <div id="parser-chat-row" class="mb-3">
                <!-- Кнопка «Сканировать все чаты» — только для режима «Ссылки».
                     Для «Участники»/«Писавшие» это бессмысленно: нужен конкретный чат,
                     иначе прогон по всем группам даст миллионы записей и флуд-блок за 2 минуты. -->
                <div id="parser-scan-all-wrap" style="display:none;">
                    <button class="btn btn-accent" onclick="scanAllChatsOneClick()" id="btn-scan-all-chats"
                            style="width:100%;padding:12px 16px;margin-bottom:10px;font-size:0.95rem;font-weight:600;">
                        <i class="bi bi-search" style="margin-right:6px;"></i> Сканировать все чаты
                    </button>
                    <div style="font-size:0.68rem;color:var(--text-muted);margin-bottom:10px;text-align:center;">
                        — или выберите конкретные чаты ниже —
                    </div>
                </div>
                <div class="d-flex align-center justify-between mb-2">
                    <label class="form-label m-0">Чаты для парсинга</label>
                    <div class="d-flex gap-2">
                        <button class="btn btn-outline btn-sm" onclick="toggleParserInputMode()" id="btn-parser-input-mode" style="font-size:0.7rem;padding:2px 8px;">
                            <i class="bi bi-link-45deg"></i> Ввести ссылки
                        </button>
                        <button class="btn btn-accent btn-sm" onclick="scanParserChats()" id="btn-parser-scan" style="font-size:0.7rem;padding:2px 10px;">
                            <i class="bi bi-arrow-clockwise"></i> Обновить список чатов
                        </button>
                    </div>
                </div>
                <div id="parser-all-chats-banner" style="display:none;margin-bottom:8px;padding:6px 10px;background:rgba(52,211,153,0.08);border:1px solid rgba(52,211,153,0.3);border-radius:6px;font-size:0.72rem;color:var(--success);">
                    <i class="bi bi-check-circle"></i> Парсим <b>все</b> чаты/каналы аккаунта. Выбор ниже игнорируется.
                </div>
                <!-- Режим 1: выбор из списка (мульти) -->
                <div id="parser-chat-select-mode">
                    <div class="row-flex gap-2 mb-2">
                        <i class="bi bi-search text-muted"></i>
                        <input type="search" class="form-control flex-1 fs-78" id="parser-chat-search"
                               placeholder="Поиск чата по названию..." oninput="filterParserChats()" autocomplete="off">
                    </div>
                    <select class="form-control flex-1" id="parser-chat">
                        <option value="">Загрузите чаты...</option>
                    </select>
                    <div id="parser-selected-chats" style="margin-top:8px;display:flex;flex-wrap:wrap;gap:4px;"></div>
                    <button class="btn btn-outline btn-sm" onclick="addParserChat()" style="margin-top:6px;font-size:0.7rem;padding:2px 10px;">
                        <i class="bi bi-plus"></i> Добавить чат
                    </button>
                </div>
                <!-- Режим 2: ввод ссылок (акк зайдёт и спарсит) -->
                <div id="parser-links-mode" style="display:none;">
                    <textarea class="form-control" id="parser-chat-links" rows="4" placeholder="Вставьте ссылки на чаты/каналы (по одной на строке):&#10;https://t.me/chatname&#10;https://t.me/+invitehash&#10;@username"></textarea>
                    <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">Аккаунт зайдёт в чат и выполнит парсинг. Поддерживаются: t.me ссылки, @username, инвайт-хеши</div>
                </div>
                <!-- Превью выбранного чата -->
                <div id="parser-chat-preview" class="parser-chat-preview" style="display:none;"></div>
            </div>

            <!-- Описания режимов -->
            <div id="parser-mode-desc" class="info-box" style="padding:var(--space-3) var(--space-4);"></div>

            <!-- Фильтр реакций по эмодзи — только для режима «Реакции» -->
            <div id="parser-reactions-row" class="mb-3" style="display:none;">
                <label class="form-label">Фильтр реакций <span style="color:var(--text-muted);font-weight:400;">(пусто = собирать все реакции)</span></label>
                <div id="parser-reaction-emojis" class="d-flex" style="flex-wrap:wrap;gap:6px;"></div>
            </div>

            <!-- Глубина + порог — для «Реакции» и «Опросы» -->
            <div id="parser-engagement-row" class="grid-2 mb-3" style="display:none;">
                <div>
                    <label class="form-label">Сканировать постов <span style="color:var(--text-muted);font-weight:400;">(глубина)</span></label>
                    <input type="number" class="form-control" id="parser-scan-posts" value="300" min="10" max="3000">
                </div>
                <div>
                    <label class="form-label" id="parser-min-engagement-label">Мин. реакций на посте <span style="color:var(--text-muted);font-weight:400;">(0 = все)</span></label>
                    <input type="number" class="form-control" id="parser-min-engagement" value="0" min="0">
                </div>
            </div>

            <!-- Настройки для юзеров (members/writers) -->
            <div id="parser-opts-users" class="mb-3">
                <!-- Быстрые пресеты активности -->
                <label class="form-label fs-72">Быстрый выбор активности</label>
                <div class="d-flex flex-wrap gap-1 mb-2" id="parser-activity-presets">
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('online')"><i class="bi bi-circle-fill" style="color:var(--success);font-size:0.55rem;vertical-align:middle;"></i> Онлайн</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 1)">1ч</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 3)">3ч</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 24)">24ч</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 72)">3д</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 168)">7д</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('hours', 720)">30д</button>
                    <button type="button" class="btn btn-outline btn-sm btn-preset" onclick="applyActivityPreset('all')"><i class="bi bi-list-ul"></i> Все</button>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label">Фильтр активности</label>
                        <select class="form-control" id="parser-filter">
                            <option value="all">Все с юзернеймом</option>
                            <option value="online">Только онлайн</option>
                            <option value="hours">Были за N часов</option>
                        </select>
                    </div>
                    <div>
                        <label class="form-label">Часов</label>
                        <input type="number" class="form-control" id="parser-hours" value="24" min="1" max="720">
                    </div>
                </div>
                <!-- Min. сообщений + период — ТОЛЬКО для режима «Писавшие» -->
                <div class="grid-2 mb-2" id="parser-writers-extra" style="display:none;">
                    <div>
                        <label class="form-label">Минимум сообщений от юзера</label>
                        <select class="form-control" id="parser-min-messages">
                            <option value="1">≥1 сообщ</option>
                            <option value="2">≥2 сообщ</option>
                            <option value="3">≥3 сообщ</option>
                            <option value="5">≥5 сообщ</option>
                            <option value="10">≥10 сообщ</option>
                            <option value="25">≥25 сообщ</option>
                        </select>
                    </div>
                    <div>
                        <label class="form-label">Период сканирования</label>
                        <select class="form-control" id="parser-period-preset" onchange="applyPeriodPreset(this.value)">
                            <option value="0">Вся история</option>
                            <option value="1">Последний 1 день</option>
                            <option value="3">Последние 3 дня</option>
                            <option value="7" selected>Последние 7 дней</option>
                            <option value="14">Последние 14 дней</option>
                            <option value="30">Последние 30 дней</option>
                        </select>
                    </div>
                </div>
                <div class="d-flex gap-3 flex-wrap">
                    <label class="opt-row" >
                        <input type="checkbox" id="parser-skip-admins"> Пропустить админов
                    </label>
                    <label class="opt-row" >
                        <input type="checkbox" id="parser-skip-bots" checked> Пропустить ботов <span class="tt" data-tip="ON (дефолт) — боты не попадают в результаты. OFF — боты тоже соберутся (нужно для редких сценариев когда хочешь собрать список ботов чата).">?</span>
                    </label>
                    <label class="opt-row" >
                        <input type="checkbox" id="parser-strict"> Строгая активность (без «был недавно»)
                    </label>
                </div>

                <!-- Расширенные фильтры -->
                <details class="ad-block mt-2">
                    <summary><i class="bi bi-funnel"></i> Расширенные фильтры</summary>
                    <div class="ad-body">
                        <div class="grid-2 mb-2" style="margin-top:6px;">
                            <div>
                                <label class="form-label">Что сохранять</label>
                                <select class="form-control" id="parser-save-mode">
                                    <option value="usernames">Только юзернеймы</option>
                                    <option value="usernames_ids">Юзернеймы + ID</option>
                                </select>
                                <div style="font-size:12px;color:var(--text-muted);margin-top:4px;line-height:1.4;">
                                    «+ ID» добавит в список участников без @юзера как числовой ID. Прямую рассылку по такому списку Telegram не разрешит, но ID пригодится для аналитики, выгрузки в CSV/XLSX и для последующего поиска этих юзеров в общих чатах.
                                </div>
                            </div>
                            <div>
                                <label class="form-label">Кого парсить (роли)</label>
                                <select class="form-control" id="parser-roles">
                                    <option value="users">Только обычные пользователи</option>
                                    <option value="admins">Только админы</option>
                                    <option value="all">Все</option>
                                </select>
                            </div>
                        </div>
                        <div class="grid-2 mb-2">
                            <div>
                                <label class="form-label">Доступ к ЛС</label>
                                <select class="form-control" id="parser-dm-access">
                                    <option value="all">Парсить всех</option>
                                    <option value="open">Только с открытыми ЛС</option>
                                    <option value="closed">Только с закрытыми ЛС</option>
                                </select>
                            </div>
                            <div>
                                <label class="form-label">Минимум часов с последнего онлайна</label>
                                <input type="number" class="form-control" id="parser-online-min" min="0" max="999999" value="0">
                            </div>
                        </div>
                        <div class="grid-2 mb-2">
                            <div>
                                <label class="form-label">Максимум часов с последнего онлайна</label>
                                <input type="number" class="form-control" id="parser-online-max" min="0" max="999999" value="99999">
                            </div>
                            <div></div>
                        </div>
                        <div class="d-flex gap-3 flex-wrap mt-2">
                            <label class="opt-row" >
                                <input type="checkbox" id="parser-only-avatar"> Только с аватарками
                            </label>
                            <label class="opt-row" >
                                <input type="checkbox" id="parser-only-premium"> Только с премиумом
                            </label>
                            <label class="opt-row" >
                                <input type="checkbox" id="parser-include-poll-voters"> Парсить голосовавших в опросах
                            </label>
                            <label class="opt-row" >
                                <input type="checkbox" id="parser-recent-only"> Только активные за ~6 мес <span class="tt" data-tip="Парсит через ChannelParticipantsRecent — отдаёт топ активных юзеров чата (~20-30% от всех, но они писали в чат за последние ~6 мес). Конверсия в DM выше чем по «всем». Используют Apify и коммерческие скраперы для скрытых каналов.">?</span>
                            </label>
                        </div>
                    </div>
                </details>
            </div>

            <!-- Настройки для ссылок -->
            <div id="parser-opts-links" style="display:none;" class="mb-3">
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label">Тип ссылок</label>
                        <select class="form-control" id="parser-link-type">
                            <option value="all">Все (инвайты + публичные)</option>
                            <option value="invites">Только инвайты (t.me/+...)</option>
                            <option value="public">Только публичные (t.me/channel)</option>
                        </select>
                    </div>
                    <div>
                        <label class="form-label">Период сканирования сообщений</label>
                        <select class="form-control" id="parser-links-period" onchange="applyLinksPeriodPreset(this.value)">
                            <option value="0">Вся история</option>
                            <option value="1">Последний 1 день</option>
                            <option value="3">Последние 3 дня</option>
                            <option value="7" selected>Последние 7 дней</option>
                            <option value="14">Последние 14 дней</option>
                            <option value="30">Последние 30 дней</option>
                        </select>
                    </div>
                </div>
                <label class="opt-row" >
                    <input type="checkbox" id="parser-unwrap"> Разворачивать короткие URL (bit.ly, telegra.ph)
                </label>
                <!-- Откуда брать ссылки. По умолчанию оба источника: из сообщений
                     + из описания и closed-link чатов (часто там лежит invite-ссылка). -->
                <label class="form-label mt-2">Откуда брать ссылки</label>
                <select class="form-control" id="parser-link-source">
                    <option value="both" selected>Сообщения + описания чатов</option>
                    <option value="messages">Только из сообщений (как раньше)</option>
                    <option value="meta">Только из описаний/закреплённой ссылки чата</option>
                </select>
                <div style="font-size:0.7rem;color:var(--text-muted);margin-top:4px;">
                    «Описание» — текст «About» чата + публичный @username + закреплённая invite-ссылка из настроек чата.
                </div>
            </div>

            <!-- Настройки для глобального поиска -->
            <div id="parser-opts-search" style="display:none;" class="mb-3">
                <label class="form-label">Пул запросов <span style="font-size:0.7rem;color:var(--text-muted);">(по одному на строке, макс 50)</span></label>
                <textarea class="form-control mb-2" id="parser-search-query" rows="3" placeholder="крипто&#10;заработок&#10;NFT&#10;трейдинг"></textarea>
                <div style="background:var(--bg-card-hover);border-radius:6px;padding:8px 10px;margin-bottom:10px;font-size:0.7rem;color:var(--text-muted);">
                    Каждый запрос ищется отдельно. При включённой транслитерации "крипто" автоматически ищет также "kripto". Многословные запросы разбиваются на токены.
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label">Источник</label>
                        <select class="form-control" id="parser-search-source">
                            <option value="telegram">Telegram</option>
                            <option value="tgstat">TGStat</option>
                            <option value="both">Оба</option>
                        </select>
                    </div>
                    <div>
                        <label class="form-label">TGStat Token <span style="font-size:0.65rem;color:var(--text-muted);font-weight:400;">(только если источник = TGStat)</span></label>
                        <input type="text" class="form-control" id="parser-tgstat-token" placeholder="Токен API TGStat">
                        <div style="font-size:0.66rem;color:var(--text-muted);margin-top:4px;">
                            Где взять: <a class="text-purple" href="https://api.tgstat.ru/" target="_blank" rel="noopener">api.tgstat.ru</a> → регистрация → раздел API → скопировать токен.
                        </div>
                    </div>
                </div>
                <div class="grid-2 mb-2">
                    <div>
                        <label class="form-label">Мин. участников</label>
                        <input type="number" class="form-control" id="parser-min-members" value="0" min="0" max="1000000" placeholder="0 = без фильтра">
                    </div>
                    <div>
                        <label class="form-label">Расширение запросов</label>
                        <select class="form-control" id="parser-expand">
                            <option value="full">Транслит + токены</option>
                            <option value="translit">Только транслит</option>
                            <option value="none">Без расширения</option>
                        </select>
                    </div>
                </div>
                <label class="opt-row" >
                    <input type="checkbox" id="parser-translit" checked> Транслитерация RU→LAT
                </label>
            </div>

            <!-- Настройки для поиска по словам -->
            <div id="parser-opts-keyword" style="display:none;" class="mb-3">
                <label class="form-label">Ключевые слова (по одному на строке)</label>
                <textarea class="form-control mb-2" id="parser-keywords" rows="3" placeholder="заработок&#10;крипто&#10;вакансия"></textarea>
                <div style="background:var(--bg-card-hover);border-radius:6px;padding:8px 10px;margin-bottom:10px;font-size:0.7rem;color:var(--text-muted);line-height:1.5;">
                    ⏱ Сканирование всех чатов аккаунта занимает 3-10 минут (на аккаунт с 500+ чатами — до 15 мин).
                    Не закрывайте окно. Прогресс: «Сканирую X/Y чатов» в строке статуса.
                </div>
                <div class="grid-2">
                    <div>
                        <label class="form-label">Искать в</label>
                        <select class="form-control" id="parser-kw-scope">
                            <option value="all">Все чаты</option>
                            <option value="groups">Только группы</option>
                            <option value="channels">Только каналы</option>
                        </select>
                    </div>
                    <div>
                        <label class="form-label">Собирать</label>
                        <select class="form-control" id="parser-kw-collect">
                            <option value="links">Ссылки</option>
                            <option value="usernames">Юзернеймы</option>
                            <option value="both">Всё</option>
                        </select>
                    </div>
                </div>
            </div>

            <!-- Лимит -->
            <div class="mb-3" id="parser-limit-row">
                <label class="form-label">Лимит результатов</label>
                <input type="number" class="form-control" id="parser-limit" value="5000" min="100" max="50000" style="max-width:200px;">
            </div>

            <!-- Пресеты для режима «Ссылки»: быстрый выбор готовых конфигураций -->
            <div class="mb-3" id="parser-presets" style="display:none;">
                <div style="font-size:0.72rem;color:var(--text-muted);margin-bottom:6px;">Быстрые пресеты (задают период + тип ссылок + лимит одним кликом):</div>
                <button class="btn btn-outline btn-sm btn-preset" onclick="applyParserPreset('basic')">
                    Базовый <span class="tt" data-tip="Период: последние 7 дней. Типы ссылок: все (приглашения в приватные чаты + публичные каналы). Лимит: 3000 ссылок. Короткие ссылки (bit.ly, telegra.ph) не разворачиваются — для быстрого сбора за неделю.">?</span>
                </button>
                <button class="btn btn-outline btn-sm btn-preset" onclick="applyParserPreset('full')">
                    Полный <span class="tt" data-tip="Период: вся история чата. Все типы ссылок. Лимит: 10000. Короткие ссылки разворачиваются в полные (bit.ly → реальный URL, telegra.ph → исходный). Максимальный сбор, может занять долго.">?</span>
                </button>
                <button class="btn btn-outline btn-sm btn-preset" onclick="applyParserPreset('invites')">
                    Инвайты <span class="tt" data-tip="Только приглашения в приватные чаты (вид t.me/+hash). Период: вся история. Лимит: 5000. С разворачиванием коротких ссылок. Для сбора именно приватных приглашений без публичных каналов.">?</span>
                </button>
                <div style="font-size:0.66rem;color:var(--text-muted);margin-top:4px;font-style:italic;">
                    Наведи на «?» рядом с кнопкой — расскажу что именно она делает. Любую настройку сверху можно потом поправить руками.
                </div>
            </div>

            <div class="d-flex gap-2 mb-3 flex-wrap">
                <button class="btn btn-accent btn-cta-lg" onclick="startParser()" id="btn-parser">
                    <i class="bi bi-play-fill"></i> Начать парсинг
                </button>
                <button class="btn btn-danger btn-cta-lg" onclick="stopParser()" id="btn-parser-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
            </div>

            <!-- Прогресс -->
            <div id="parser-progress" style="display:none;">
                <div class="progress mb-2"><div class="progress-bar" id="parser-bar" style="width:0%;"></div></div>
                <div class="text-sm text-muted" id="parser-status-text">Парсинг...</div>
            </div>

            <!-- Результат -->
            <div id="parser-result" style="display:none;" class="mt-3">
                <div class="info-box info-box--success" style="padding:var(--space-4) var(--space-5);">
                    <div class="d-flex align-center mb-2" style="gap:10px;flex-wrap:wrap;">
                        <span class="fw-bold" style="font-size:0.95rem;flex-shrink:0;" id="parser-count">0 юзернеймов</span>
                        <!-- Экспорт-кнопки: иконка + текст. Раньше были только
                             иконки — клиент не понимал что это, плюс тултип уходил
                             за viewport. -->
                        <div class="d-flex" style="gap:4px;flex-shrink:0;flex-wrap:wrap;">
                            <button class="btn btn-outline btn-sm" onclick="exportParser('txt')" data-tip="Список строк в .txt"><i class="bi bi-filetype-txt"></i> TXT</button>
                            <button class="btn btn-outline btn-sm" onclick="exportParser('xlsx')" data-tip="Таблица Excel .xlsx"><i class="bi bi-file-earmark-excel"></i> Excel</button>
                            <button class="btn btn-outline btn-sm" onclick="exportParser('spintax')" data-tip="Формат с альтернативами для рассылки"><i class="bi bi-braces"></i> Spintax</button>
                            <button class="btn btn-outline btn-sm" onclick="exportParserByFolders()" data-tip="Каналы / группы / инвайты в отдельные файлы" style="border-color:var(--accent);color:var(--accent);"><i class="bi bi-folder-plus"></i> По папкам</button>
                            <button class="btn btn-outline btn-sm" onclick="copyParserPreview()" data-tip="Скопировать список в буфер обмена"><i class="bi bi-clipboard"></i> Копировать</button>
                            <button class="btn btn-outline btn-sm" onclick="openExportFolder()" data-tip="Открыть папку «Экспорт» в проводнике"><i class="bi bi-folder2-open"></i> Папка</button>
                        </div>
                        <!-- Основные actions с текстом — справа -->
                        <div class="d-flex" style="gap:6px;margin-left:auto;flex-shrink:0;">
                            <button class="btn btn-pink btn-sm" onclick="useParserForDm()" style="white-space:nowrap;">
                                <i class="bi bi-person-lines-fill"></i> В ЛС
                            </button>
                            <button class="btn btn-success btn-sm" onclick="useParserForJoin()" style="white-space:nowrap;">
                                <i class="bi bi-box-arrow-in-right"></i> В подписку
                            </button>
                        </div>
                    </div>
                    <div id="parser-stats" class="text-xs text-muted mb-2"></div>
                </div>
                <!-- Chip-фильтр результатов парсинга (тип/категория). Показывается
                     только когда есть смысл фильтровать — режим user_chats или
                     смешанные юзернеймы+ID. См. _renderParserResultChips в app.js. -->
                <div id="parser-result-chips" class="multi-folder-bar" style="display:none;margin-bottom:8px;"></div>
                <textarea class="form-control" id="parser-preview" rows="8" readonly style="font-family:monospace;font-size:0.75rem;background:var(--bg-input);"></textarea>
            </div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Профили ═══ -->
<div class="section" id="tab-profiles">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-person-badge text-purple"></i> Заполнение профилей</div>
        <div class="card-body">
            <div class="info-box">
                Обновляет имя, фамилию, био и аватарку выбранного аккаунта.<br>
                <b class="text-accent" >Ко всем</b> — каждому аккаунту поставит разные данные (генерация/спинтакс).<br>
                Спинтакс: <code>{вариант1|вариант2}</code> — случайный вариант для каждого акка.
            </div>

            <div class="acc-selector mb-3" id="acc-selector-profiles"></div>

            <!-- Генерация имён -->
            <div class="d-flex gap-3 mb-3 flex-wrap align-center">
                <label class="opt-row" >
                    <input type="checkbox" id="pf-gen-name" onchange="toggleGenName()" >
                    Автогенерация имени
                </label>
                <label class="opt-row" >
                    <input type="checkbox" id="pf-gen-surname" onchange="toggleGenSurname()" >
                    Автогенерация фамилии
                </label>
                <button class="btn btn-outline btn-sm" onclick="previewGenName()" style="padding:3px 10px;font-size:0.65rem;">
                    <i class="bi bi-dice-3"></i> Превью
                </button>
                <span id="pf-gen-preview" class="text-xs text-accent ml-1"></span>
            </div>

            <div style="font-size:0.72rem;color:var(--text-muted);margin-bottom:8px;padding:6px 10px;background:rgba(106,178,242,.08);border-left:3px solid var(--accent-light);border-radius:4px;">
                <i class="bi bi-info-circle"></i> Любое поле которое тронул — отправится в TG. Пустое поле = ОЧИСТИТЬ в профиле (стереть фамилию/username/био). Не трогал поле = оставить в TG как было.
            </div>

            <div class="grid-2 mb-3">
                <div>
                    <label class="form-label">Имя</label>
                    <input type="text" class="form-control" id="pf-firstname" placeholder="Имя или {Имя1|Имя2}" oninput="this.dataset.touched='1'">
                </div>
                <div>
                    <label class="form-label">Фамилия</label>
                    <input type="text" class="form-control" id="pf-lastname" placeholder="Фамилия или {Фам1|Фам2}" oninput="this.dataset.touched='1'">
                    <label class="opt-row" style="margin-top:4px;font-size:0.7rem;color:var(--text-muted);">
                        <input type="checkbox" id="pf-clear-lastname">
                        <span data-tip="Снять старую фамилию у всех выбранных аккаунтов в TG. Полезно когда раньше ставил фамилии (или их прислал поставщик) и теперь хочешь чистое имя без хвоста.">✕ Очистить фамилию у всех</span>
                    </label>
                </div>
            </div>

            <!-- Автогенерация username -->
            <div class="d-flex gap-3 mb-2 flex-wrap align-center">
                <label class="opt-row" >
                    <input type="checkbox" id="pf-gen-username" onchange="toggleGenUsername()">
                    Автогенерация username
                </label>
                <button class="btn btn-outline btn-sm btn-preset" onclick="previewGenUsername()">
                    <i class="bi bi-dice-3"></i> Превью
                </button>
                <span id="pf-gen-username-preview" class="text-xs" style="color:var(--accent-light);margin-left:4px;"></span>
            </div>
            <label class="form-label">Username (@ в начале не нужен)</label>
            <input type="text" class="form-control" id="pf-username" placeholder="username или оставь пусто чтобы стереть" oninput="this.dataset.touched='1'">
            <label class="opt-row mb-3" style="margin-top:4px;font-size:0.7rem;color:var(--text-muted);">
                <input type="checkbox" id="pf-clear-username">
                <span data-tip="Снять @username у всех выбранных аккаунтов в TG. Раньше у юзера в TG будет «без юзернейма».">✕ Очистить username у всех</span>
            </label>

            <label class="form-label">Био (описание профиля)</label>
            <textarea class="form-control mb-2" id="pf-about" rows="2" placeholder="Описание профиля (до 70 символов, спинтакс поддерживается)" maxlength="70" oninput="this.dataset.touched='1'"></textarea>
            <label class="opt-row mb-2" style="font-size:0.7rem;color:var(--text-muted);">
                <input type="checkbox" id="pf-clear-about">
                <span data-tip="Снять био у всех выбранных аккаунтов в TG.">✕ Очистить био у всех</span>
            </label>
            <button type="button" class="btn btn-outline btn-sm mb-3" onclick="spintaxPreview('pf-about','pf-about-preview')">
                <i class="bi bi-eye"></i> Предпросмотр спинтакса
            </button>
            <div id="pf-about-preview" class="spintax-preview" style="display:none;"></div>

            <label class="form-label">Аватарка</label>
            <div class="d-flex gap-2 mb-2 flex-wrap align-center">
                <label class="btn btn-outline btn-sm" style="cursor:pointer;margin:0;display:flex;align-items:center;">
                    <i class="bi bi-image"></i> Выбрать фото
                    <input type="file" accept="image/*" style="display:none" id="pf-avatar-input" onchange="previewAvatar(this)">
                </label>
                <label class="opt-row" >
                    <input type="checkbox" id="pf-avatar-emoji" onchange="toggleEmojiAvatar()">
                    Эмодзи-аватарка
                </label>
                <span class="text-sm text-muted self-center" id="pf-avatar-name">Не выбрано</span>
            </div>
            <div id="pf-emoji-row" class="mb-2" style="display:none;font-size:0.7rem;color:var(--text-muted);">
                Кастомный эмодзи (оставь пусто для случайного): <input type="text" id="pf-avatar-emoji-char" maxlength="4" placeholder="🎭" style="width:60px;padding:3px 6px;font-size:1.1rem;text-align:center;background:var(--bg-input);border:1px solid var(--border);border-radius:6px;color:var(--text);">
                <span style="margin-left:8px;">Цвет фона: <input type="color" id="pf-avatar-emoji-bg" value="#3b82f6" style="width:32px;height:24px;vertical-align:middle;border:none;cursor:pointer;"></span>
            </div>

            <!-- Импорт фото из папки — для тех у кого есть заготовленная папка с аватарками.
                 Программа сама возьмёт случайное фото из указанной папки. При применении
                 «Ко всем аккаунтам» — каждому аккаунту разное фото (без повторов пока папка
                 не закончится). -->
            <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:0.75rem;color:var(--text-muted);margin-bottom:6px;">
                <input type="checkbox" id="pf-avatar-folder-enabled" onchange="toggleFolderAvatar()">
                Случайное фото из папки
            </label>
            <div id="pf-folder-row" class="mb-2" style="display:none;">
                <div class="d-flex gap-2 align-center">
                    <input type="text" class="form-control flex-1" id="pf-avatar-folder" placeholder="C:\Users\...\Profile pics\  (папка с jpg/png)">
                    <button class="btn btn-outline btn-sm" onclick="openAvatarFolder()" data-tip="Открыть папку в Проводнике">
                        <i class="bi bi-folder2-open"></i>
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="scanAvatarFolder()">
                        <i class="bi bi-search"></i> Проверить
                    </button>
                </div>
                <div id="pf-folder-info" style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    Укажи путь к папке с .jpg / .png файлами. Нажми «Проверить» — увидишь сколько файлов.
                </div>
            </div>
            <div id="pf-avatar-preview" style="display:none;margin-bottom:12px;">
                <img id="pf-avatar-img" style="width:64px;height:64px;border-radius:50%;object-fit:cover;border:2px solid var(--accent);">
            </div>

            <div class="d-flex gap-2">
                <button class="btn btn-accent btn-sm" onclick="applyProfile()">
                    <i class="bi bi-check2"></i> Применить к выбранному
                </button>
                <button class="btn btn-outline btn-sm" onclick="applyProfileAll()">
                    <i class="bi bi-people"></i> Ко всем аккаунтам
                </button>
            </div>
            <div id="pf-result" style="display:none;" class="mt-3 text-sm"></div>
        </div>
    </div>

    <!-- ── Массовое заполнение из папки с материалами ── -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-folder-fill text-accent"></i> Массовое заполнение из материалов</div>
        <div class="card-body">
            <div class="info-box mb-3">
                Альтернатива ручному вводу — даёшь софту папку с материалами, и каждый акк получает свой комплект из пула. Структура папки:
                <pre style="background:var(--bg-input);padding:8px 10px;margin-top:6px;border-radius:4px;font-size:0.7rem;color:var(--text-muted);line-height:1.5;">Заполнение профилей/
├── Женские/        ← опционально
│   ├── Имена.txt   (список имён, по одному на строку)
│   ├── Фамилии.txt
│   ├── Био.txt     (можно несколько строк — рандом)
│   ├── Аватарки/   (jpg/png)
│   └── Сторис/     (опционально, jpg/png/mp4)
└── Мужские/        ← аналогично</pre>
                Каждый акк получает <b>случайные</b> данные из своего пула (Ж или М). Если папка одного пола пустая — берётся из общей.
            </div>

            <div class="d-flex gap-2 mb-3 align-center flex-wrap">
                <label class="form-label" style="margin-bottom:0;">Папка с материалами:</label>
                <input type="text" class="form-control" id="bf-materials-path" style="flex:1;min-width:280px;" placeholder="C:\Users\...\Заполнение профилей">
                <button class="btn btn-outline btn-sm" onclick="bfScanMaterials()" style="font-size:0.7rem;padding:5px 12px;">
                    <i class="bi bi-search"></i> Проверить
                </button>
                <button class="btn btn-outline btn-sm" onclick="bfOpenMaterials()" style="font-size:0.7rem;padding:5px 12px;">
                    <i class="bi bi-folder2-open"></i>
                </button>
            </div>
            <div id="bf-scan-result" style="font-size:0.7rem;color:var(--text-muted);margin-bottom:12px;line-height:1.6;"></div>

            <label class="form-label">Аккаунты для заполнения</label>
            <div class="acc-selector mb-3" id="acc-selector-bulk-fill"></div>

            <details class="ad-block" open>
                <summary><i class="bi bi-list-check"></i> Что обновлять</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="bf-do-name" checked> <span>Обновлять имя/фамилию<span class="ad-hint">Берёт случайные из Имена.txt и Фамилии.txt</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="bf-do-bio" checked> <span>Обновлять био<span class="ad-hint">Случайная строка из Био.txt (макс 70 символов)</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="bf-do-avatar" checked> <span>Обновлять аватарку<span class="ad-hint">Случайное фото из папки Аватарки/</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="bf-do-stories"> <span>Загрузить сторис<span class="ad-hint">Из папки Сторис/. Будет загружено 1-3 случайных истории</span></span></label>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-gear"></i> Дополнительные опции</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="bf-avatar-once" checked> <span>Использовать аватарки по одному разу<span class="ad-hint">Использованные фото переезжают в подпапку used/ — не достанутся другому акку</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="bf-delete-old"> <span>Удалить старые аватарки перед установкой<span class="ad-hint">У акка останется только новая фотка, старые удалятся</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="bf-move-processed"> <span>Перемещать обработанные аккаунты<span class="ad-hint">После заполнения акк переедет в указанную папку — удобно отделять «готовые»</span></span></label>
                    <div style="margin-left:24px;margin-top:6px;display:flex;gap:8px;align-items:center;">
                        <label class="form-label" style="margin-bottom:0;font-size:0.7rem;">Куда перемещать:</label>
                        <input type="text" class="form-control" id="bf-target-folder" placeholder="например: Аккаунты/Готовые" style="font-size:0.72rem;flex:1;">
                    </div>
                </div>
            </details>

            <div class="d-flex gap-2 mb-2 align-center flex-wrap">
                <label class="form-label m-0" data-tip="Сколько аккаунтов обрабатывается одновременно. 1 = по очереди, 5-10 = быстрее в 5-10 раз. Каждый акк через свой прокси.">Потоки <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                <input type="number" class="form-control" id="bf-threads" value="1" min="1" max="100" style="width:70px;">
                <button class="btn btn-accent" onclick="bfStart()" id="btn-bf-start">
                    <i class="bi bi-play-fill"></i> Заполнить выбранные
                </button>
                <button class="btn btn-danger" onclick="bfStop()" id="btn-bf-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="bf-status-label" class="text-xs text-muted tag-right"></span>
            </div>
            <div id="bf-progress" style="display:none;margin-top:8px;">
                <div class="progress mb-2-x">
                    <div class="progress-bar" id="bf-progress-bar" style="width:0%;"></div>
                </div>
                <div style="font-size:0.74rem;color:var(--text-muted);" id="bf-progress-text">—</div>
            </div>
            <div id="bf-log" style="margin-top:10px;max-height:240px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;line-height:1.6;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Мониторинг чатов ═══ -->
<div class="section" id="tab-monitor">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-broadcast" style="color:#ef4444;"></i> Мониторинг чатов в реальном времени</div>
        <div class="card-body">
            <div style="background:var(--surface-danger-bg);border:1px solid var(--surface-danger-border);border-radius:8px;padding:10px 14px;margin-bottom:12px;font-size:0.72rem;color:var(--text-muted);line-height:1.6;">
                Выбранный <b>один аккаунт</b> сидит в указанных чатах и при появлении ключевого слова в сообщении шлёт уведомление в «Сохранённые» (или в указанный чат/юзера).<br>
                Аккаунт должен <b>состоять в этих чатах</b> — инвайт-ссылки программа пройдёт сама, если есть свободный лимит вступлений.<br>
                <b>Мульти-аккаунтный мониторинг не поддерживается</b> (Telegram быстро банит за несколько сессий слушающих одно и то же). Если нужно охватить больше чатов — добавь их все в список, один аккаунт потянет 500+ чатов.
            </div>

            <label class="form-label fs-72">Аккаунт для мониторинга</label>
            <div class="acc-selector mb-3" id="acc-selector-monitor"></div>

            <!-- Multi-acc мониторинг: несколько акков на одних/разных чатах -->
            <details class="mb-3" >
                <summary style="cursor:pointer;font-size:0.72rem;color:var(--accent-light);padding:6px 0;font-weight:500;">
                    <i class="bi bi-people-fill"></i> Мульти-аккаунтный мониторинг (несколько акков)
                </summary>
                <div style="padding:10px 0 0 0;">
                    <label class="form-label fs-70">Дополнительные акки (по одному номеру на строке)</label>
                    <textarea class="form-control mb-2" id="monitor-extra-phones" rows="3"
                        placeholder="79xxxxxxxxx&#10;37xxxxxxxxx&#10;Оставь пусто чтобы юзать одиночный режим"></textarea>
                    <label class="form-label fs-70">Режим распределения чатов</label>
                    <select class="form-control mb-2 fs-78" id="monitor-multi-mode">
                        <option value="redundant">Redundant — все акки во всех чатах (надёжнее, при бане одного остальные продолжат)</option>
                        <option value="split">Split — чаты делятся между акками поровну (быстрее, меньше нагрузки)</option>
                    </select>
                    <div style="font-size:0.65rem;color:var(--text-muted);line-height:1.5;">
                        Дубли не будут — общая память внутри пула отсеивает повторные алерты на одно сообщение, даже если 2 акка сидят в одном чате.
                    </div>
                </div>
            </details>

            <div style="background:var(--surface-info-bg);border:1px solid var(--border-accent);border-radius:6px;padding:8px 12px;margin-top:-8px;margin-bottom:12px;font-size:0.68rem;color:var(--text-muted);line-height:1.5;">
                <i class="bi bi-folder2-open text-accent"></i> <b>Совет:</b> закинь файлы акка <code>{phone}.session</code> и <code>{phone}.json</code> в папку <code>Аккаунты/Мониторинг/</code> — софт сам подхватит этот акк для мониторинга, даже если кэш настроек слетит после обновы.
            </div>

            <label class="form-label">Чаты для мониторинга (по одной ссылке/юзернейму на строке)</label>
            <textarea class="form-control mb-3" id="monitor-chats" rows="6"
                placeholder="@chatname&#10;https://t.me/chatname&#10;https://t.me/+invitehash"></textarea>

            <label class="form-label">Ключевые слова (через запятую или с новой строки)</label>
            <textarea class="form-control mb-3" id="monitor-keywords" rows="3"
                placeholder="ищу, ищю, выйду, куплю"></textarea>

            <label class="form-label">Стоп-слова — пропускать сообщения с ними <span style="color:var(--text-muted);font-weight:normal;font-size:0.7rem;">(через запятую или с новой строки)</span></label>
            <textarea class="form-control mb-3" id="monitor-ignore-words" rows="2"
                placeholder="реклама, casino, ставки, продаю — если в сообщении есть любое из этих слов, алерта не будет"></textarea>

            <label class="d-flex align-center gap-2 mb-3" style="cursor:pointer;font-size:0.78rem;" data-tip="Если ВКЛ — на одного user_id алерт сработает только один раз. Если ВЫКЛ — каждое новое сообщение от того же юзера в чатах мониторинга тригерит алерт заново. Хранится в data/monitor_contacted.json — список можно посмотреть/очистить ниже.">
                <input type="checkbox" class="form-check-input" id="monitor-dedupe" onchange="saveSettings()" checked>
                <span><b>Дедупликация по user_id</b> <span style="color:var(--text-muted);">— один юзер = один алерт за всё время</span></span>
            </label>

            <!-- Bot API режим (рекомендуемый способ) -->
            <div style="background:var(--surface-info-bg);border:1px solid var(--border-accent);border-radius:8px;padding:10px 14px;margin-bottom:12px;">
                <div style="font-weight:600;color:var(--accent-light);margin-bottom:6px;font-size:0.82rem;">
                    <i class="bi bi-robot"></i> Куда слать уведомления — через своего бота <span style="color:var(--success);font-size:0.7rem;font-weight:normal;">(рекомендуется)</span>
                </div>
                <div style="font-size:0.68rem;color:var(--text-muted);line-height:1.6;margin-bottom:10px;">
                    <b class="text-accent" >Общий шаг:</b> у <a class="text-accent" href="https://t.me/BotFather" target="_blank">@BotFather</a> отправь <code>/newbot</code> → получи <b>Bot Token</b>, вставь в поле слева.<br><br>
                    <b class="text-accent" >Вариант 1 — в ЛС с ботом</b> (только для тебя):<br>
                    <b>a)</b> Найди своего нового бота в Telegram со <b>личного аккаунта</b> → напиши <code>/start</code>.<br>
                    <b>b)</b> Нажми <b>«Определить Chat ID»</b> ниже — софт достанет твой id. <b>В чат добавлять не надо.</b><br>
                    <b>c)</b> Нажми <b>«Тест бота»</b> — придёт в ЛС с ботом.<br><br>
                    <b class="text-accent" >Вариант 2 — в общий чат</b> (если хочешь чтобы видела вся команда):<br>
                    <b>a)</b> Создай группу в Telegram → добавь туда бота → сделай его <b>админом</b> с правом писать (опция «Разрешить постинг»).<br>
                    <b>b)</b> В группе напиши <code>/start@имя_твоего_бота</code> (или любое сообщение).<br>
                    <b>c)</b> Нажми <b>«Определить Chat ID»</b> — софт возьмёт id группы (будет отрицательное число вида <code>-1001234567890</code>).<br>
                    <b>d)</b> Нажми <b>«Тест бота»</b> — придёт в группу.<br><br>
                    <span class="text-warning" ><i class="bi bi-info-circle"></i></span> Если нужен быстрый <b>user_id</b> — напиши <a class="text-accent" href="https://t.me/userinfobot" target="_blank">@userinfobot</a> с нужного аккаунта. Но наша кнопка «Определить» автоматически берёт и user_id (ЛС), и chat_id (группы).
                </div>
                <div class="grid-2">
                    <div>
                        <label class="form-label fs-70">Bot Token <span style="color:var(--text-muted);font-weight:normal;">(от @BotFather)</span></label>
                        <input type="password" class="form-control" id="monitor-bot-token"
                            placeholder="123456789:AA..." autocomplete="new-password">
                        <div id="monitor-bot-token-saved" style="font-size:0.62rem;color:var(--success);margin-top:2px;display:none;">✓ токен сохранён — оставь пустым чтобы не менять</div>
                    </div>
                    <div>
                        <label class="form-label fs-70">Chat ID <span style="color:var(--text-muted);font-weight:normal;">(ЛС бота с тобой)</span></label>
                        <input type="text" class="form-control" id="monitor-bot-chat-id"
                            placeholder="например 123456789">
                    </div>
                </div>
                <div style="font-size:0.65rem;color:var(--text-muted);margin-top:8px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
                    <button type="button" class="btn btn-accent btn-sm" style="padding:3px 10px;font-size:0.7rem;" onclick="detectChatId()" data-tip="Найдёт твой chat_id по /start сообщению которое ты отправил боту">
                        <i class="bi bi-magic"></i> Определить Chat ID
                    </button>
                    <button type="button" class="btn btn-outline btn-sm" style="padding:3px 10px;font-size:0.7rem;" onclick="testMonitorBot()" data-tip="Отправить тестовое сообщение — проверит что бот + chat_id правильно связаны">
                        <i class="bi bi-send-check"></i> Тест бота
                    </button>
                    <span style="flex:1;min-width:160px;text-align:right;">Уведомления придут в <b>ЛС с ботом</b> (в твой личный Telegram).</span>
                </div>
                <label class="d-flex align-center gap-2" style="cursor:pointer;margin-top:10px;background:var(--surface-success-bg);border:1px solid var(--surface-success-border);border-radius:8px;padding:8px 12px;">
                    <input type="checkbox" id="monitor-bot-reports" onchange="toggleBotReports(this.checked)" style="width:17px;height:17px;">
                    <div style="flex:1;">
                        <div style="font-weight:600;font-size:0.8rem;color:var(--text-primary);">Отчёты о работе фермы в бот</div>
                        <div style="font-size:0.68rem;color:var(--text-muted);margin-top:2px;">Кнопочный бот: старт/итог задач + live-потоки + Стоп/Пауза прямо из Telegram. Следи за фермой удалённо (нужны Bot Token + Chat ID выше).</div>
                    </div>
                </label>
            </div>

            <!-- Fallback через аккаунт-мониторщик (если бот не настроен) -->
            <details class="mb-3" id="monitor-fallback-wrap">
                <summary style="cursor:pointer;font-size:0.72rem;color:var(--text-muted);padding:6px 0;">
                    Альтернатива: слать от лица аккаунта-мониторщика (если не хочешь настраивать бота)
                </summary>
                <div style="padding:8px 0 0 0;">
                    <label class="form-label">Куда слать (fallback, если бот не задан)</label>
                    <input type="text" class="form-control" id="monitor-target" value="me"
                        placeholder="me = Сохранённые / @username / id чата / t.me/chat">
                    <div style="font-size:0.65rem;color:var(--text-muted);margin-top:4px;">
                        <code>me</code> = Сохранённые этого же аккаунта. Можно указать @username другого аккаунта или канала. <b>Используется только если Bot Token выше не задан.</b>
                    </div>
                </div>
            </details>

            <label class="form-label">Автосообщение в ЛС автору совпавшего коммента (опционально)</label>
            <textarea class="form-control mb-2" id="monitor-auto-dm" rows="3"
                placeholder="{Привет|Здравствуйте}! Видел ваш комментарий. Могу помочь — напишите что интересует."></textarea>
            <div style="background:var(--surface-info-bg);border:1px solid var(--surface-info-border);border-radius:6px;padding:8px 12px;margin-bottom:12px;font-size:0.68rem;color:var(--text-muted);line-height:1.5;">
                <b style="color:#fbbf24;"><i class="bi bi-exclamation-triangle-fill"></i> Дедупликация по user_id:</b> после первого матча юзер попадает в <b>игнор-лист</b> — его следующие сообщения (в любом чате, с любого твоего акка) <b>не будут</b> триггерить ни уведомление, ни авто-DM. Хранится в <code>data/monitor_contacted.json</code>, переживает обновления и рестарты софта.<br>
                Спинтакс <code>{привет|здравствуйте}</code> поддерживается. Задержка 3-10с перед отправкой.<br>
                <div style="display:flex;gap:6px;margin-top:6px;flex-wrap:wrap;align-items:center;">
                    <input type="text" id="monitor-ignore-input" placeholder="@username или user_id"
                        style="flex:1;min-width:180px;padding:3px 8px;font-size:0.7rem;background:var(--bg-input);border:1px solid var(--border);border-radius:4px;color:var(--text-primary);">
                    <button type="button" class="btn btn-outline btn-sm" style="padding:2px 10px;font-size:0.65rem;" onclick="addToIgnoreList()"><i class="bi bi-plus-circle"></i> В игнор</button>
                    <button type="button" class="btn btn-outline btn-sm" style="padding:2px 8px;font-size:0.65rem;" onclick="openIgnoreDb()"><i class="bi bi-database"></i> База</button>
                    <button type="button" class="btn btn-outline btn-sm" style="padding:2px 8px;font-size:0.65rem;" onclick="resetContactedList()"><i class="bi bi-trash"></i> Сбросить все</button>
                    <span class="ml-auto" id="monitor-contacted-count"></span>
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="monitor-solve-captcha"> <span>Решать капчу-боты в чатах<span class="ad-hint">Если в мониторимом чате антиспам-бот попросит подтвердить — нажмём «я не бот»</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="monitor-keep-online"> <span>Держать аккаунт онлайн во время мониторинга</span></label>
                </div>
            </details>

            <div class="d-flex gap-2 mb-3">
                <button class="btn btn-accent" onclick="startMonitor()" id="btn-monitor-start">
                    <i class="bi bi-play-fill"></i> Старт мониторинга
                </button>
                <button class="btn btn-outline" onclick="resumeMonitor()" id="btn-monitor-resume"
                        data-tip="Восстановить мониторинг из сохранённого конфига (после перезапуска софта он не возобновляется сам)">
                    <i class="bi bi-arrow-clockwise"></i> Восстановить
                </button>
                <button class="btn btn-danger" onclick="stopMonitor()" id="btn-monitor-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Стоп
                </button>
                <button class="btn btn-outline" onclick="openMonitorLog()" data-tip="Открыть CSV-лог всех попаданий по ключам">
                    <i class="bi bi-file-earmark-spreadsheet"></i> Лог матчей
                </button>
            </div>

            <div id="monitor-status" style="display:none;background:var(--surface-info-bg);border:1px solid var(--surface-info-border);border-radius:8px;padding:10px 14px;font-size:0.75rem;">
                <div class="d-flex align-center justify-between mb-1">
                    <span class="fw-bold text-accent-base"><i class="bi bi-record-circle"></i> Работает</span>
                    <span id="monitor-matched" class="text-muted">Алертов: 0</span>
                </div>
                <div id="monitor-info" class="text-muted text-xs"></div>
            </div>
        </div>
    </div>
</div>

<!-- TAB «Досье» удалён: Досье теперь режим в дропдауне Парсинга (#parser-dossier-block). -->

<!-- ═══ TAB: Автоответчик ═══ -->
<div class="section" id="tab-autoreply">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-reply" style="color:#34d399;"></i> Автоответчик на входящие ЛС</div>
        <div class="card-body">
            <div style="font-size:0.75rem;color:var(--text-muted);margin-bottom:12px;">
                Автоответ на входящие ЛС. Один ответ на юзера. Спинтакс: <code>{Привет|Здравствуйте}</code>.
            </div>

            <div class="acc-selector mb-3" id="acc-selector-autoreply"></div>

            <label class="form-label">Текст автоответа (поддерживает спинтакс)</label>
            <textarea class="form-control mb-2" id="ar-text" rows="3" placeholder="{Привет|Здравствуйте}! Спасибо за сообщение. {Напишите ваш вопрос|Чем могу помочь?}"></textarea>
            <button type="button" class="btn btn-outline btn-sm mb-3" onclick="spintaxPreview('ar-text','ar-text-preview')">
                <i class="bi bi-eye"></i> Предпросмотр спинтакса
            </button>
            <div id="ar-text-preview" class="spintax-preview" style="display:none;"></div>

            <div class="grid-3 mb-3">
                <div>
                    <label class="form-label">Мин. задержка (сек) <span class="tt" data-tip="Минимальная задержка перед ответом. Реальная задержка — случайное значение между «мин» и «макс», чтобы не отвечать мгновенно (палится как бот). 3-8с выглядит как «человек прочитал и набрал ответ».">?</span></label>
                    <input type="number" class="form-control" id="ar-delay-min" value="3" min="1" max="60">
                </div>
                <div>
                    <label class="form-label">Макс. задержка (сек) <span class="tt" data-tip="Максимальная задержка перед ответом. Бот ответил через ровно 3с на 50 сообщений подряд — заметно. Разброс «мин-макс» делает паттерн естественным.">?</span></label>
                    <input type="number" class="form-control" id="ar-delay-max" value="8" min="2" max="120">
                </div>
                <div>
                    <label class="form-label">Подхватить ответы за N ч <span class="tt" data-tip="Сколько часов назад искать пропущенные ЛС при старте автоответчика. 0 — отвечаем только на новые, на старые молчим. 24 — отыграем последние сутки. 0 безопаснее: старое сообщение + внезапный ответ выглядит подозрительно.">?</span></label>
                    <input type="number" class="form-control" id="ar-backfill-hours" value="0" min="0" max="48" step="1">
                </div>
            </div>

            <label class="form-label">Стоп-слова (через запятую, ответ не отправится если в сообщении есть)</label>
            <input type="text" class="form-control mb-3" id="ar-stop-words" placeholder="отстань, стоп, спам, не пиши">

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Поведение «как живой человек»</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="ar-simulate-typing"> <span>Имитация набора (показывать «печатает...» перед ответом)<span class="ad-hint">Перед ответом покажет «печатает…» — выглядит как живой человек</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="ar-mark-as-read"> <span>Отмечать входящее сразу прочитанным<span class="ad-hint">Без этого у юзера висит непрочитанный счётчик — выдаёт автоответ</span></span></label>
                </div>
            </details>

            <div class="d-flex gap-2 mb-3">
                <button class="btn btn-success btn-sm" onclick="startAutoReply()" id="btn-ar-start">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-danger btn-sm" onclick="stopAutoReply()" id="btn-ar-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
            </div>

            <!-- Статус -->
            <div id="ar-status"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Аналитика ═══ -->
<div class="section" id="tab-analytics">
    <div class="d-flex gap-2 mb-3 flex-wrap">
        <div class="stat-card cell-input-lg">
            <div class="stat-value fs-130" id="stat-sent">0</div>
            <div class="stat-label"><i class="bi bi-send"></i> Отправлено</div>
        </div>
        <div class="stat-card cell-input-lg">
            <div class="stat-value fs-130" id="stat-joined">0</div>
            <div class="stat-label"><i class="bi bi-box-arrow-in-right"></i> Вступлений</div>
        </div>
        <div class="stat-card cell-input-lg">
            <div class="stat-value fs-130" id="stat-blocked">0</div>
            <div class="stat-label"><i class="bi bi-shield-x"></i> Заблокировано</div>
        </div>
        <div class="stat-card cell-input-lg">
            <div class="stat-value fs-130" id="stat-errors">0</div>
            <div class="stat-label"><i class="bi bi-x-circle"></i> Ошибок</div>
        </div>
    </div>
    <div class="card">
        <div class="card-header">
            <i class="bi bi-graph-up" style="color:#14b8a6;"></i> Активность по дням
            <button class="btn btn-outline btn-sm ml-auto" onclick="exportExcel()">
                <i class="bi bi-download"></i> Excel
            </button>
        </div>
        <div class="card-body p-4">
            <canvas id="analytics-chart" height="120"></canvas>
        </div>
    </div>

    <!-- Anti-detect статистика (с момента старта программы) -->
    <div class="card mb-3" style="margin-top:12px;">
        <div class="card-header">
            <i class="bi bi-shield-check text-success"></i> Защита аккаунтов — статистика
            <span class="text-xs text-muted ml-auto">с запуска программы</span>
        </div>
        <div class="card-body">
            <div class="d-flex gap-2 flex-wrap">
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;" id="ad-stat-precheck-runs">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-shield-check"></i> Pre-check запусков</div>
                </div>
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;color:var(--warning);" id="ad-stat-precheck-blocked">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-slash-circle"></i> Найдено в спам-блоке</div>
                </div>
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;color:#a78bfa;" id="ad-stat-captcha">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-puzzle"></i> Капч решено</div>
                </div>
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;color:#5db7ff;" id="ad-stat-profiles">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-person"></i> Профилей просмотрено</div>
                </div>
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;color:#5db7ff;" id="ad-stat-photos">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-image"></i> Фото просмотрено</div>
                </div>
                <div class="stat-card cell-input">
                    <div class="stat-value" style="font-size:1.15rem;color:var(--success);" id="ad-stat-reads">0</div>
                    <div class="stat-label fs-70"><i class="bi bi-eye"></i> Сообщений прочитано</div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Прогрев ═══ -->
<div class="section" id="tab-warmup">

    <div class="card mb-3" style="border-left:4px solid var(--accent-light); background: rgba(99,102,241,0.07);">
        <div class="card-body" style="padding:12px 16px;">
            <div style="display:flex;align-items:center;gap:8px;margin-bottom:4px;">
                <i class="bi bi-magic" style="color:var(--accent-light);"></i>
                <strong>Хочешь максимум защиты от бана?</strong> Включи AI-генерацию пулов
            </div>
            <div class="text-hint" style="font-size:0.76rem;line-height:1.45;">
                Имена чатов, юзернеймы, приветствия и тексты дневников будут сгенерированы AI индивидуально для тебя. Telegram не сможет палить шаблоны — у каждого клиента TelePush свой набор. Стоит ~$0.05-0.15 одноразово, нужен ключ от любого AI-провайдера (OpenRouter / DeepSeek / OpenAI).
                <br><a class="text-accent" style="font-size:0.76rem;" href="javascript:showTab('settings');setTimeout(function(){var el=document.getElementById('settings-ai');if(el)el.style.display='block';var c=document.getElementById('chev-settings-ai');if(c)c.style.transform='rotate(180deg)';},150);">→ Открыть Настройки → AI</a>
                · <span id="warmup-ai-pool-hint" style="font-size:0.74rem;color:var(--text-muted);">проверка статуса...</span>
            </div>
        </div>
    </div>

    <!-- Аналитика + Отчёт по аккам — кнопки и карточки -->
    <div class="d-flex align-center justify-between mb-2" style="gap:8px;flex-wrap:wrap;">
        <div></div>
        <div class="d-flex" style="gap:8px;flex-wrap:wrap;">
            <button class="btn btn-outline btn-sm" onclick="loadWarmupAnalytics()">
                <i class="bi bi-graph-up-arrow"></i> Аналитика
            </button>
            <button class="btn btn-outline btn-sm" onclick="loadWarmupReport()">
                <i class="bi bi-bar-chart"></i> Отчёт по аккаунтам
            </button>
        </div>
    </div>
    <div id="warmup-analytics" style="display:none;" class="card mb-3">
        <div class="card-header"><i class="bi bi-graph-up-arrow text-accent"></i> Аналитика прогрева</div>
        <div class="card-body" id="warmup-analytics-body">
            <div class="text-muted text-sm">Загрузка...</div>
        </div>
    </div>
    <div id="warmup-report" style="display:none;" class="card mb-3">
        <div class="card-header"><i class="bi bi-bar-chart text-orange"></i> Отчёт по прогреву</div>
        <div class="card-body">
            <div id="warmup-report-summary" class="mb-2 text-sm"></div>
            <div id="warmup-report-table" style="max-height:400px;overflow:auto;font-size:0.75rem;"></div>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-fire text-orange"></i> Прогрев аккаунтов</div>
        <div class="card-body">
            <!-- Компактный info-блок вместо длинной портянки. -->
            <div class="info-box" style="font-size:0.78rem;line-height:1.55;">
                Акки переписываются между собой, подписываются на каналы и ставят реакции — как живые. Активность плавно растёт 7-21 день.
                Безопасный пресет включён по умолчанию; кому нужны тонкие настройки — раскройте «Расширенные опции» ниже.
            </div>

            <!-- Блоки «Рекомендации» и «Ожидаемый результат» удалены. -->

            <!-- «Безопасный пресет» — большая галка сверху, ставит консервативные дефолты:
                 1 поток, задержка 120-300с, classic режим, тихие часы 23-7 ВКЛ, только DM-сценарий. -->
            <label class="d-flex align-center gap-2 mb-3" style="cursor:pointer;background:var(--surface-success-bg);border:1px solid var(--surface-success-border);border-radius:8px;padding:10px 14px;">
                <input type="checkbox" id="warmup-safe-preset" checked onchange="onWarmupSafePresetChange(this.checked)" style="width:18px;height:18px;">
                <div style="flex:1;">
                    <div style="font-weight:600;font-size:0.85rem;color:var(--text-primary);">Безопасный пресет</div>
                    <div style="font-size:0.7rem;color:var(--text-muted);margin-top:2px;">1 поток, задержки 120-300с, тихие часы 23-7, только переписка между акками. Кликни чтоб поменять — все настройки разблокируются.</div>
                </div>
            </label>

            <!-- Status banner -->
            <div id="warmup-status-banner" style="display:none;" class="mb-3"></div>

            <!-- Schedule progress -->
            <div id="warmup-schedule" style="display:none;" class="mb-3">
                <div class="d-flex align-center justify-between mb-1">
                    <span id="warmup-stage-text" class="text-sm fw-600"></span>
                    <span id="warmup-day-text" class="text-xs text-muted"></span>
                </div>
                <div class="progress" style="height:8px;"><div class="progress-bar" id="warmup-progress-bar" style="width:0%;background:linear-gradient(90deg,#f97316,#ef4444);"></div></div>
                <div class="d-flex justify-between mt-1">
                    <span class="text-xs text-muted">Сообщений сегодня: <b id="warmup-msgs-today">0</b>/<span id="warmup-msgs-limit">0</span></span>
                    <span class="text-xs text-muted">Всего: <b id="warmup-msgs-total">0</b></span>
                </div>
            </div>

            <!-- Простой ряд контролов. Поля «старт с дня» и «сообщений/день» (override)
                 перенесены в «Расширенные опции» ниже — это edge-case настройки. -->
            <div class="d-flex gap-2 mb-2 flex-wrap align-center">
                <label class="form-label m-0">Длительность</label>
                <select class="form-control" id="warmup-days" style="width:auto;">
                    <option value="7">7 дней</option>
                    <option value="14">14 дней</option>
                    <option value="21" selected>21 день</option>
                    <option value="30">30 дней</option>
                </select>
                <!-- Видимое поле «С какого дня». Backend принимает start_day. -->
                <label class="form-label m-0" data-tip="С какого дня плана прогрева стартовать. Если акк уже частично прогретый — пропусти первые N дней. Дефолт 1 = с нуля.">Старт с дня <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                <input type="number" class="form-control" id="warmup-start-day" value="1" min="1" max="30" style="width:70px;">
                <label class="form-label m-0" data-tip="Сколько пар прогрева работает одновременно. 1 = строго по очереди (тихо), 5-10 = быстрее в 5-10 раз. Каждая пара через свой акк, акк не используется в двух парах одновременно.">Потоки <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                <input type="number" class="form-control" id="warmup-threads" value="1" min="1" max="100" style="width:70px;">
                <label class="form-label m-0" data-tip="Доля реакций в сценариях «hub_post» и «свой канал». 70% — чаще ставит реакции (быстрее, безопаснее, меньше написанного текста). 30% — чаще пишет текст. 0 = только тексты, 100 = только реакции.">Реакции, % <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                <input type="number" class="form-control" id="warmup-reaction-share" value="70" min="0" max="100" style="width:70px;">
                <span style="flex:1;"></span>
                <button class="btn btn-accent btn-sm" id="warmup-start-btn" onclick="startWarmup()">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-outline btn-sm" id="warmup-pause-btn" onclick="pauseWarmup()" style="display:none;">
                    <i class="bi bi-pause-fill"></i> Пауза
                </button>
                <button class="btn btn-danger btn-sm" id="warmup-stop-btn" onclick="stopWarmup()" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Стоп
                </button>
                <button class="btn btn-accent btn-sm" id="warmup-next-day-btn" onclick="warmupNextDay()" style="display:none;">
                    <i class="bi bi-sunrise"></i> Следующий день
                </button>
            </div>
            <!-- warmup-start-day стал видимым (выше). Здесь остаётся только warmup-msgs-override (темп сообщений/день). -->
            <input type="hidden" id="warmup-msgs-override" value="0">

            <!-- «Защита аккаунта» вынесена из flex-row кнопок старта (раскрытие внутри ряда ломало layout). -->
            <details class="ad-block mb-3">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="warmup-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок</span></label>
                    <!-- «Решать капчу» удалена — капча-боты логируют, потенциальный флаг. -->
                    <input type="hidden" id="warmup-solve-captcha">
                    <label class="ad-check"><input type="checkbox" id="warmup-keep-online"> <span>Держать аккаунт онлайн во время прогрева</span></label>
                    <label class="ad-check"><input type="checkbox" id="warmup-read-msgs"> <span>Читать входящие сообщения<span class="ad-hint">Имитация — открываем чат, скроллим</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="warmup-mark-read"> <span>Отмечать прочитанным</span></label>
                    <label class="ad-check"><input type="checkbox" id="warmup-view-profile"> <span>Смотреть профили партнёров по прогреву</span></label>
                    <label class="ad-check"><input type="checkbox" id="warmup-view-photo"> <span>Смотреть фото профилей</span></label>
                </div>
            </details>

            <!-- Picker: выбор подмножества акков для прогрева. Пусто = все из «Прогрев». -->
            <div class="d-flex align-center gap-2 mb-2 flex-wrap">
                <label class="form-label m-0">Кого прогревать <span class="tt" data-tip="По умолчанию прогрев работает на ВСЕХ акках из папки «Прогрев». Если выберешь подмножество — будут прогреваться только эти, остальные в папке отдыхают.">?</span></label>
                <div class="acc-selector" id="acc-selector-warmup"></div>
            </div>

            <!-- Accounts table -->
            <h6 style="color:var(--text-muted);font-size:0.8rem;margin-bottom:6px;">Аккаунты в прогреве</h6>
            <div style="max-height:250px;overflow-y:auto;margin-bottom:12px;">
                <table class="table table-sm">
                    <thead><tr>
                        <th>Телефон</th><th>Имя</th><th>Возраст</th>
                        <th>Премиум</th><th>Прокси</th><th>Папка</th><th></th>
                    </tr></thead>
                    <tbody id="warmup-accounts-table">
                        <tr><td colspan="7" style="text-align:center;color:var(--text-muted);padding:16px;">Загрузка...</td></tr>
                    </tbody>
                </table>
            </div>

            <!-- Active pairs -->
            <div id="warmup-pairs-section" style="display:none;">
                <h6 style="color:var(--text-muted);font-size:0.8rem;margin-bottom:6px;">Активные пары</h6>
                <div id="warmup-pairs-list" style="max-height:200px;overflow-y:auto;margin-bottom:12px;"></div>
            </div>

            <!-- Инлайн «Лог» убран. Прогрев пишет в единый поток логов (окно «Логи работы»). -->
            <div style="font-size:0.72rem;color:var(--text-muted);margin-top:6px;">
                <i class="bi bi-info-circle"></i> События прогрева идут в окно <b>«Логи работы»</b> — открой кнопкой внизу-слева.
            </div>
        </div>
    </div>

    <!-- «Настройки прогрева» + «Сценарии прогрева» свёрнуты в один expandable «Расширенные опции».
         По умолчанию закрыт — клиенты запускают на дефолтных безопасных настройках. -->
    <details class="card mb-3" style="border:1px solid var(--border);">
        <summary class="card-header" style="cursor:pointer;user-select:none;list-style:none;">
            <i class="bi bi-sliders text-muted"></i> Расширенные опции
            <span style="color:var(--text-muted);font-weight:400;font-size:0.7rem;margin-left:8px;">— режим, AI, шаблоны, тихие часы, сценарии</span>
        </summary>
        <div class="card-body" style="padding-top:6px;">

    <!-- Warmup Settings -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-gear text-muted"></i> Настройки прогрева</div>
        <div class="card-body" style="display:flex;flex-direction:column;gap:10px;">
            <!-- Gemini Key -->
            <div>
                <label class="form-label">Gemini API Key <span class="text-xs text-muted">(бесплатно на <a href="https://aistudio.google.com/apikey" target="_blank" style="color:var(--accent-light);text-decoration:underline;">aistudio.google.com</a>)</span></label>
                <div class="d-flex gap-2">
                    <input type="password" class="form-control flex-1" id="warmup-gemini-key" placeholder="AIza...">
                    <button class="btn btn-outline btn-sm" onclick="checkGeminiKey()" style="white-space:nowrap;">Проверить</button>
                </div>
            </div>
            <!-- Row: Режим + Генерация + Часы + Задержка (CSS Grid — всё выровнено по единой сетке) -->
            <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;align-items:start;">
                <!-- Режимы Hub-акк и Chat-flow удалены (опасные для акков). Остался только Classic (пары в ЛС). -->
                <input type="hidden" id="warmup-mode" value="classic">
                <div id="warmup-hub-wrap" style="display:none;">
                    <select id="warmup-hub-phone" style="display:none;"></select>
                </div>
                <div>
                    <label class="form-label d-flex align-center gap-1">Генерация текстов
                        <span class="tt" data-tip="Шаблоны — фиксированный набор готовых фраз (бесплатно, без AI-ключа). AI — тексты пишутся нейросетью под тему диалога (требуется настроенный ключ в Настройках → AI). Тратится $ от твоего AI-аккаунта.">
                            <svg class="icon-inline" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
                        </span>
                    </label>
                    <select class="form-control" id="warmup-gen-mode" onchange="onWarmupGenModeChange()">
                        <option value="templates" selected>Шаблоны (бесплатно, без AI)</option>
                        <option value="ai">AI / нейросеть (платный ключ)</option>
                    </select>
                </div>
                <div>
                    <label class="form-label d-flex align-center gap-1">Активные часы
                        <span class="tt" data-tip="Окно когда прогрев разрешён писать сообщения. Внутри окна паузы случайные (60–600 сек), не идёт «лента в одно время». Снаружи окна — тишина, никаких действий. Дефолт 9–22 имитирует активность живого человека.">?</span>
                    </label>
                    <div class="d-flex gap-1 align-center">
                        <input type="number" class="form-control" id="warmup-hours-start" value="9" min="0" max="23" style="width:60px;">
                        <span class="text-muted">—</span>
                        <input type="number" class="form-control" id="warmup-hours-end" value="22" min="0" max="23" style="width:60px;">
                    </div>
                </div>
                <!-- Тихие часы всегда ВКЛ 23-7 без UI (ночная активность — флаг bot-detect). -->
                <input type="hidden" id="warmup-quiet-enabled" value="on" checked>
                <input type="hidden" id="warmup-quiet-start" value="23">
                <input type="hidden" id="warmup-quiet-end" value="7">
                <div>
                    <label class="form-label d-flex align-center gap-1">Задержка между сообщениями (сек)
                        <span class="tt" data-tip="Случайная пауза между сообщениями. Минимум 60с — ниже это уже подозрительно для живого человека. Больше окно = естественнее.">?</span>
                    </label>
                    <div class="d-flex gap-1 align-center">
                        <input type="number" class="form-control w-70px" id="warmup-delay-min" value="120" min="60">
                        <span class="text-muted">—</span>
                        <input type="number" class="form-control w-70px" id="warmup-delay-max" value="300" min="120">
                    </div>
                </div>
                <!-- «Потоки» в основном ряду (warmup-threads). Дубль input type="hidden" удалён — нельзя 2 элемента с одним id. -->

            </div>

            <!-- Подсказка о режиме генерации текстов — отдельной строкой под гридом,
                 чтобы не вылазила из ячейки и не перекрывала «Задержка»/«Потоки» внизу.
                 padding+border-top отделяет визуально от грида и от чекбоксов ниже. -->
            <div id="warmup-gen-mode-hint" style="font-size:0.72rem;color:var(--text-muted);line-height:1.55;margin-top:14px;padding:10px 0 14px 0;border-top:1px solid var(--border);min-height:18px;"></div>

            <!-- Свои шаблоны: textarea per-фаза для замены встроенных фраз -->
            <details style="margin-top:6px;background:var(--bg-card-hover);border:1px solid var(--border);border-radius:6px;padding:8px 12px;">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--accent-light);font-weight:600;user-select:none;">
                    Свои шаблоны прогрева
                    <span class="tt" data-tip="Если стандартные «Привет!», «Здарова», «Ку!» примелькались — впиши свои фразы по одной на строку. Используется только в режиме «Шаблоны». Можно поддерживать варианты через {вариант1|вариант2}.">?</span>
                </summary>
                <div style="font-size:0.72rem;color:var(--text-muted);line-height:1.55;margin:8px 0 10px 0;">
                    Используются ТОЛЬКО когда выбран режим «Шаблоны». В каждое поле — по одной фразе на строку.
                    Поддерживается спинтакс <code style="background:var(--bg-card);padding:1px 4px;border-radius:3px;">{вариант1|вариант2|вариант3}</code> —
                    софт случайно выбирает один из вариантов при отправке.<br>
                    Пример: <code style="background:var(--bg-card);padding:1px 4px;border-radius:3px;">{Привет|Хай|Здарова}, {как дела|чё нового}?</code>
                    превратится в 6 разных фраз.
                </div>
                <div class="d-grid" style="grid-template-columns:1fr;gap:10px;">
                    <div>
                        <label class="form-label" style="font-size:0.74rem;">Приветствия (фаза greeting)</label>
                        <textarea id="warmup-tpl-greetings" class="form-control" rows="4" placeholder="{Привет|Хай|Здарова}!&#10;Йоу, {как сам|чё нового}?&#10;Куку, давно не общались"></textarea>
                    </div>
                    <div>
                        <label class="form-label" style="font-size:0.74rem;">Основные фразы (фаза chatting)</label>
                        <textarea id="warmup-tpl-chatting" class="form-control" rows="5" placeholder="Че там у тебя?&#10;Чем занят {сегодня|вечером}?&#10;{Видел|Смотрел} {новости|погоду}?"></textarea>
                    </div>
                    <div>
                        <label class="form-label" style="font-size:0.74rem;">Прощания (фаза goodbye)</label>
                        <textarea id="warmup-tpl-goodbye" class="form-control" rows="3" placeholder="{Пока|Бай|До связи}!&#10;{Удачи|Береги себя}"></textarea>
                    </div>
                </div>
                <div class="d-flex gap-2 align-center flex-wrap" style="margin-top:10px;">
                    <button class="btn btn-accent btn-sm" onclick="saveWarmupTemplates()">
                        <i class="bi bi-check-lg"></i> Сохранить шаблоны
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="document.getElementById('warmup-tpl-import-file').click()" data-tip="Загрузить шаблоны из .txt файла. Формат: фразы по одной на строку. Можно с тегами [greetings] / [chatting] / [goodbye] чтобы разделить — или загрузить отдельный файл для каждой фазы.">
                        <i class="bi bi-file-arrow-up"></i> Загрузить из .txt
                    </button>
                    <select id="warmup-tpl-import-target" class="form-control" style="width:auto;font-size:0.72rem;padding:4px 8px;">
                        <option value="auto">авто (по [тегам])</option>
                        <option value="greetings">→ Приветствия</option>
                        <option value="chatting">→ Основные фразы</option>
                        <option value="goodbye">→ Прощания</option>
                    </select>
                    <input type="file" id="warmup-tpl-import-file" accept=".txt" style="display:none;" onchange="importWarmupTemplatesFromFile(this)">
                    <button class="btn btn-outline btn-sm" onclick="clearWarmupTemplates()">
                        <i class="bi bi-arrow-counterclockwise"></i> Сбросить
                    </button>
                    <span id="warmup-tpl-status" style="font-size:0.7rem;color:var(--text-muted);margin-left:auto;"></span>
                </div>
            </details>

            <!-- Опции чата прогрева (показывается только для chat_flow) -->
            <div id="warmup-chat-opts-wrap" style="display:none;background:var(--bg-card-hover);border:1px solid var(--border);border-radius:6px;padding:8px 12px;margin-bottom:14px;">
                <div class="text-xs text-muted mb-1 fw-600">Опции чата прогрева</div>
                <div class="d-flex gap-4 flex-wrap fs-78">
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="warmup-id-format">
                        ID-формат (001-01) <span class="tt" data-tip="Каждое сообщение прогрева получает префикс 001-01 (номер акка — номер сообщения в диалоге). Удобно для отладки и поиска проблем в логах, но в чате выглядит ненатурально — для прода лучше отключить.">?</span>
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="warmup-duplicate-dm" checked>
                        Дубль в ЛС после reply <span class="tt" data-tip="После публичного ответа в общем чате с шансом ~40% акк отправит то же сообщение в ЛС тому же собеседнику. Имитирует реальное поведение: «дублирую, чтобы не потерялось».">?</span>
                    </label>
                </div>
            </div>

            <!-- «Работать до 23:59» и «Ручной запуск следующего дня» удалены.
                 Оставлен только авто-перенос в «В работе» после завершения. -->
            <input type="hidden" id="warmup-until-midnight">
            <input type="hidden" id="warmup-manual-next-day">
            <div class="d-flex align-center gap-4 flex-wrap" style="font-size:0.8rem;margin-top:12px;padding-top:12px;border-top:1px solid var(--border);">
                <label class="d-flex align-center gap-2 cursor-pointer" style="white-space:nowrap;">
                    <input type="checkbox" class="form-check-input" id="warmup-auto-move" checked>
                    Переместить в «В работе» после завершения
                </label>
                <div style="flex:1;"></div>
                <button class="btn btn-accent btn-sm" onclick="saveWarmupConfig()">
                    <i class="bi bi-check"></i> Сохранить
                </button>
            </div>
        </div>
    </div>

    <!-- Сценарии прогрева -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-diagram-3 text-accent"></i> Сценарии прогрева</div>
        <div class="card-body" style="display:flex;flex-direction:column;gap:14px;">
            <div class="info-box">
                Сценарии прогрева. Лимиты — на каждый аккаунт отдельно.
            </div>

            <!-- DM -->
            <div style="background:var(--bg-card-hover);border:1px solid var(--border);border-radius:8px;padding:10px 14px;">
                <label class="d-flex align-center gap-2 cursor-pointer">
                    <input type="checkbox" class="form-check-input" id="scn-dm" checked>
                    <span style="font-weight:600;font-size:0.78rem;"><i class="bi bi-chat-dots-fill" style="color:var(--text-muted);margin-right:4px;"></i>Переписка между аккаунтами</span>
                </label>
                <p style="margin-top:4px;font-size:0.66rem;color:var(--text-muted);margin-bottom:6px;line-height:1.5;">
                    Аккаунты общаются друг с другом в ЛС как друзья. Это <b>основа прогрева</b> — оставляйте включённым.
                </p>
                <div class="d-flex gap-2 align-center flex-wrap mb-2-x">
                    <label style="font-size:0.66rem;color:var(--text-muted);">Сообщений/день <b>(на акк)</b>:</label>
                    <input type="number" class="form-control" id="scn-dm-msgs-per-day" value="0" min="0" max="200" style="width:65px;font-size:0.72rem;" placeholder="auto">
                    <span class="tt" data-tip="Сколько ЛС-сообщений в день будет отправлять каждый аккаунт другим из пула. 0 = автоматический режим: 4-6 в первые дни, 12-20 к концу прогрева. Поставь число чтобы зафиксировать темп: 5 = очень безопасно, 10 = средне, 20+ = быстро. Учти: если поставить выше — растёт риск спам-блока.">
                        <svg class="icon-inline" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
                    </span>
                </div>
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.7rem;color:var(--text-secondary);">
                    <input type="checkbox" class="form-check-input" id="scn-reply" checked>
                    Отвечать контекстно на последнее входящее сообщение <span class="tt" data-tip="Акк прочитает последнее входящее от собеседника и AI напишет ответ по смыслу. Без галки — каждое сообщение это новая случайная тема, диалог выглядит как два монолога.">?</span>
                </label>
            </div>

            <!-- Channels -->
            <div style="background:var(--bg-card-hover);border:1px solid var(--border);border-radius:8px;padding:12px 14px;">
                <label class="d-flex align-center gap-2 cursor-pointer">
                    <input type="checkbox" class="form-check-input" id="scn-channels">
                    <span style="font-weight:600;font-size:0.85rem;"><i class="bi bi-megaphone" style="color:var(--accent-light);margin-right:4px;"></i>Подписка на каналы</span>
                </label>
                <p style="margin-top:6px;font-size:0.72rem;color:var(--text-muted);margin-bottom:8px;">
                    Каждый акк подписывается на каналы из списка ниже. Повышает траст — у живого юзера всегда есть подписки. Ниже укажите каналы (по одному юзернейму на строку).
                </p>
                <div class="d-flex gap-2 align-center flex-wrap">
                    <label style="font-size:0.72rem;color:var(--text-muted);">Подписок/день <b>(на акк)</b>: <span class="tt" data-tip="Сколько каналов из списка ниже каждый акк подпишет за день. 1–2 — очень щадяще. 3–5 — норма. 7+ — рискованно для свежих акков (Telegram ловит «вспышки подписок»).">?</span></label>
                    <input type="number" class="form-control" id="scn-channels-per-day" value="3" min="1" max="10" style="width:60px;font-size:0.75rem;">
                    <button class="btn btn-outline btn-sm fs-70" onclick="loadDefaultChannels()">Список по умолчанию</button>
                </div>
                <div class="mt-2" style="background:rgba(99,102,241,0.05);border:1px solid var(--border);border-radius:6px;padding:10px 12px;">
                    <div style="font-size:0.72rem;color:var(--text-muted);margin-bottom:6px;line-height:1.5;">
                        Можно подгрузить свой список каналов по ссылке (raw-файл со списком юзернеймов, по одному на строку). Подойдёт ваш gist, raw-файл из репо, pastebin. У разных клиентов будут разные пулы — это снимает риск «общий fingerprint».
                    </div>
                    <div class="d-flex gap-2 align-center flex-wrap">
                        <input type="text" class="form-control" id="warmup-github-url" placeholder="https://raw.githubusercontent.com/USER/REPO/main/channels.txt" style="flex:1;min-width:280px;font-size:0.72rem;font-family:monospace;">
                        <button class="btn btn-outline btn-sm fs-70" onclick="fetchGithubChannels()">
                            <i class="bi bi-cloud-download"></i> Подгрузить
                        </button>
                        <button class="btn btn-outline btn-sm fs-70" onclick="clearGithubPool()" data-tip="Очистить локальный кеш скачанных каналов">
                            <i class="bi bi-trash"></i>
                        </button>
                    </div>
                    <div id="warmup-github-status" style="margin-top:6px;font-size:0.66rem;color:var(--text-muted);"></div>
                </div>
                <textarea id="scn-channels-list" class="form-control mt-2" rows="4" placeholder="Список каналов (по одному на строку, без @)&#10;Пример:&#10;telegram&#10;tginfo&#10;durov" style="font-size:0.72rem;font-family:monospace;"></textarea>
            </div>

            <!-- Reactions -->
            <div style="background:var(--bg-card-hover);border:1px solid var(--border);border-radius:8px;padding:12px 14px;">
                <label class="d-flex align-center gap-2 cursor-pointer">
                    <input type="checkbox" class="form-check-input" id="scn-reactions">
                    <span style="font-weight:600;font-size:0.85rem;">👍 Реакции в каналах</span>
                </label>
                <p style="margin-top:6px;font-size:0.72rem;color:var(--text-muted);margin-bottom:8px;">
                    Ставит реакции (👍❤️🔥) на последние посты каналов, на которые подписан аккаунт. Работает только вместе со сценарием "Подписка на каналы" — без подписок реагировать не на что.
                </p>
                <div class="d-flex gap-2 align-center">
                    <label style="font-size:0.72rem;color:var(--text-muted);">Реакций/день <b>(на акк)</b>: <span class="tt" data-tip="Сколько реакций (👍❤️🔥) каждый акк поставит за день, размазав по подписанным каналам. За один заход — 1–3 реакции на разные посты.">?</span></label>
                    <input type="number" class="form-control" id="scn-reactions-per-day" value="5" min="1" max="30" style="width:60px;font-size:0.75rem;">
                </div>
            </div>

            <!-- «Свой чат и канал» + Search/Mention/Hub-chat сценарии удалены — опасны для акков.
                 Mass create_group, create_channel, invite-flood и search-join — триггеры заморозок. -->
            <input type="hidden" id="scn-own-chat">
            <input type="hidden" id="scn-diaries">
            <input type="hidden" id="scn-search">
            <input type="hidden" id="scn-mention">
            <input type="hidden" id="scn-hub">
            <input type="hidden" id="scn-hub-phone">
            <input type="hidden" id="scn-hub-channel-id">
            <input type="hidden" id="own-chat-subgroup" value="0">
            <input type="hidden" id="scn-mention-per-day" value="3">
            <textarea id="scn-search-keywords" style="display:none;"></textarea>
            <div style="display:none;"><!-- hidden block start -->
                <div style="margin-left:24px;margin-bottom:10px;font-size:0.72rem;color:var(--text-muted);">
                    Аккаунты по очереди пишут короткие бытовые сообщения («Кофе с утра», «Погулял») в общий чат и отвечают друг другу. Нажмите «Создать чат» —
                    аккаунт-создатель сделает приватную группу, скинет invite-ссылку себе в «Избранное» и остальные аккаунты сами зайдут по этой ссылке. Никто никого «не добавляет» — для Telegram это выглядит как естественное вступление по приглашению.
                    <div id="own-chat-status" class="mt-1 fs-70"></div>
                    <div style="margin-top:8px;display:flex;gap:8px;flex-wrap:wrap;align-items:center;">
                        <label style="font-size:0.7rem;color:var(--text-muted);">Размер подгруппы: <span class="tt" data-tip="0 — один общий чат на всех акках. 4–7 — разбиваем акки на несколько маленьких чатов (например 21 акк × 5 = 4 чата). Меньше пересечений участников — сложнее Telegram'у склеить акки в одну сеть.">?</span></label>
                        <input type="number" class="form-control" id="own-chat-subgroup" value="5" min="0" max="30" style="width:60px;font-size:0.7rem;">
                        <button class="btn btn-outline btn-sm btn-warmup-action" onclick="createWarmupChat()">
                            <i class="bi bi-plus-circle"></i> Создать чаты
                        </button>
                        <button class="btn btn-outline btn-sm btn-warmup-action" onclick="refreshWarmupChat()">
                            <i class="bi bi-arrow-repeat"></i> Догнать участников <span class="tt" data-tip="Подключает к существующему чату тех акков которых там нет. Каждый отстающий заходит по invite-ссылке из Избранного создателя.">?</span>
                        </button>
                    </div>
                    <div style="margin-top:6px;font-size:0.66rem;color:var(--text-muted);line-height:1.4;display:flex;align-items:flex-start;gap:6px;">
                        <i class="bi bi-lightbulb" style="color:#facc15;margin-top:2px;flex-shrink:0;"></i>
                        <span>С разбиением: 21 акк × подгруппа 5 = 4 чата по 5-6 человек. Меньше пересечений = меньше fingerprint бот-сети.</span>
                    </div>
                </div>

                <!-- Diaries toggle -->
                <label class="d-flex align-center gap-2 mb-2 cursor-pointer">
                    <input type="checkbox" class="form-check-input" id="scn-diaries">
                    <span style="font-weight:600;font-size:0.8rem;"><i class="bi bi-journals" style="color:var(--accent-light);margin-right:4px;"></i>Личные каналы-дневники</span>
                </label>
                <div style="margin-left:24px;font-size:0.72rem;color:var(--text-muted);line-height:1.55;">
                    Каждый аккаунт ведёт свой приватный канал на одну из тем (поиск работы / обучение / путешествия / спорт / фриланс). Посты идут по нарастающей story arc — день за днём.
                    Другие аккаунты находят канал по invite-ссылке которую владелец постит в общий чат прогрева, подписываются и ставят реакции. Полная имитация активности живого блогера.
                    <div class="mt-8" >
                        <span style="display:inline-block;font-size:0.68rem;color:var(--text-muted);margin-right:4px;">Темы:</span>
                        <label class="form-check-inline" style="font-size:0.7rem;margin-right:8px;"><input type="checkbox" class="diary-theme" value="work" checked> Работа</label>
                        <label class="form-check-inline" style="font-size:0.7rem;margin-right:8px;"><input type="checkbox" class="diary-theme" value="learning" checked> Учёба</label>
                        <label class="form-check-inline" style="font-size:0.7rem;margin-right:8px;"><input type="checkbox" class="diary-theme" value="travel" checked> Путешествия</label>
                        <label class="form-check-inline" style="font-size:0.7rem;margin-right:8px;"><input type="checkbox" class="diary-theme" value="sport" checked> Спорт</label>
                        <label class="form-check-inline" style="font-size:0.7rem;margin-right:8px;"><input type="checkbox" class="diary-theme" value="freelance" checked> Фриланс</label>
                    </div>
                    <div id="diaries-status" class="mt-1" style="font-size:0.7rem;margin-top:6px;"></div>
                    <div style="margin-top:8px;display:flex;gap:6px;flex-wrap:wrap;">
                        <button class="btn btn-outline btn-sm btn-warmup-action" onclick="createWarmupDiaries()">
                            <i class="bi bi-plus-circle"></i> Создать дневники для всех
                        </button>
                        <button class="btn btn-outline btn-sm btn-warmup-action" onclick="loadDiariesStatus()">
                            <i class="bi bi-arrow-clockwise"></i> Обновить
                        </button>
                        <button class="btn btn-outline btn-sm btn-warmup-action btn-danger-soft" onclick="clearDiariesRecord()">
                            <i class="bi bi-trash"></i> Сбросить
                        </button>
                    </div>
                </div>

                <!-- Search сценарий -->
                <label class="d-flex align-center gap-2 mb-2 cursor-pointer mt-3">
                    <input type="checkbox" class="form-check-input" id="scn-search">
                    <span style="font-weight:600;font-size:0.8rem;"><i class="bi bi-search" style="color:var(--accent-light);margin-right:4px;"></i>Search — поиск чатов по ключевым словам</span>
                </label>
                <div style="margin-left:24px;font-size:0.72rem;color:var(--text-muted);line-height:1.55;">
                    Акк периодически ищет чаты по словам из списка и подписывается на найденные.
                    Имитация поведения «человек ищет тематические чаты».
                    <textarea id="scn-search-keywords" class="form-control mt-2" rows="3" placeholder="новости&#10;криптовалюта&#10;маркетинг" style="font-size:0.72rem;font-family:monospace;"></textarea>
                </div>

                <!-- Mention сценарий -->
                <label class="d-flex align-center gap-2 mb-2 cursor-pointer mt-3">
                    <input type="checkbox" class="form-check-input" id="scn-mention">
                    <span style="font-weight:600;font-size:0.8rem;"><i class="bi bi-at" style="color:var(--accent-light);margin-right:4px;"></i>Mention — отвечать на @упоминания</span>
                </label>
                <div style="margin-left:24px;font-size:0.72rem;color:var(--text-muted);line-height:1.55;">
                    Если в каком-то чате прогрева акка @упомянули — он коротко ответит (шаблон или AI).
                    <div class="mt-1">Лимит ответов в день на акк:
                        <input type="number" class="form-control" id="scn-mention-per-day" value="3" min="1" max="20" style="width:60px;font-size:0.72rem;display:inline-block;margin-left:6px;">
                    </div>
                </div>

                <!-- Hub-chat (опционально) -->
                <label class="d-flex align-center gap-2 mb-2 cursor-pointer mt-3">
                    <input type="checkbox" class="form-check-input" id="scn-hub">
                    <span style="font-weight:600;font-size:0.8rem;"><i class="bi bi-megaphone" style="color:var(--accent-light);margin-right:4px;"></i>Hub-chat — один акк постит, остальные реагируют</span>
                </label>
                <div style="margin-left:24px;font-size:0.72rem;color:var(--text-muted);line-height:1.55;">
                    Один выбранный акк-«хаб» постит контент в свой канал, остальные акки подписываются и ставят реакции.
                    <div class="mt-1">Hub-телефон:
                        <input type="text" class="form-control" id="scn-hub-phone" placeholder="998901234567" style="width:160px;font-size:0.72rem;display:inline-block;margin-left:6px;">
                        канал id:
                        <input type="number" class="form-control" id="scn-hub-channel-id" placeholder="-1001234..." style="width:160px;font-size:0.72rem;display:inline-block;margin-left:6px;">
                        <button class="btn btn-outline btn-sm" onclick="createHubChannel()" style="margin-left:6px;font-size:0.7rem;" data-tip="Создаст приватный канал хабу и подпишет на него все warmup-акки">
                            <i class="bi bi-plus-circle"></i> Создать
                        </button>
                    </div>
                </div>
            </div>
            </div><!-- hidden block end -->

            <button class="btn btn-accent btn-sm" onclick="saveScenarios()" style="align-self:flex-start;">
                <i class="bi bi-check"></i> Сохранить сценарии
            </button>
        </div>
    </div>

    <!-- Blacklist -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-exclamation text-danger"></i> Чёрный список слов</div>
        <div class="card-body">
            <textarea class="form-control mb-2" id="warmup-blacklist" rows="5"
                placeholder="Одно слово на строку" style="font-size:0.75rem;"></textarea>
            <button class="btn btn-outline btn-sm" onclick="saveWarmupBlacklist()">
                <i class="bi bi-check"></i> Сохранить
            </button>
        </div>
    </div>

    </details>
    <!-- /расширенные опции -->
</div>

<!-- TAB «История запусков» удалён. -->

<!-- ═══ TAB: Переавторизация ═══ -->
<div class="section" id="tab-stories">

    <div class="card mb-3" style="border-left:4px solid var(--accent-light); background: rgba(99,102,241,0.07);">
        <div class="card-body" style="padding:12px 16px;">
            <div style="display:flex;align-items:center;gap:8px;margin-bottom:4px;">
                <i class="bi bi-camera-reels" style="color:var(--accent-light);"></i>
                <strong>Истории для прогрева</strong>
            </div>
            <div class="text-hint" style="font-size:0.78rem;line-height:1.5;">
                Аккаунты постят истории (Stories) из папки «Истории» — профиль выглядит живым, это сильный анти-бан сигнал. Видео автоматически приводится к вертикальному формату. Одно медиа уходит максимум на несколько акков (watchdog), прокси обязательна.
            </div>
        </div>
    </div>

    <!-- Аккаунты -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-people text-accent"></i> Аккаунты</div>
        <div class="card-body">
            <div class="d-flex align-center" style="gap:10px;flex-wrap:wrap;">
                <button class="btn btn-accent btn-sm" onclick="openStoriesMultiPicker()">
                    <i class="bi bi-check2-square"></i> Выбрать аккаунты
                </button>
                <span id="stories-multi-count" class="text-sm" style="color:var(--warning);">не выбрано</span>
            </div>
        </div>
    </div>

    <!-- Медиа -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-images text-accent"></i> Медиа для историй</div>
        <div class="card-body">
            <div class="d-flex align-center mb-2" style="gap:10px;flex-wrap:wrap;">
                <label class="btn btn-outline btn-sm" style="margin:0;">
                    <i class="bi bi-upload"></i> Загрузить фото/видео
                    <input type="file" accept="image/*,video/*" multiple style="display:none;"
                           onchange="uploadStoriesMedia(this)">
                </label>
                <button class="btn btn-outline btn-sm" onclick="openStoriesFolder()">
                    <i class="bi bi-folder2-open"></i> Открыть папку
                </button>
                <button class="btn btn-outline btn-sm" onclick="loadStoriesMedia()">
                    <i class="bi bi-arrow-clockwise"></i> Обновить
                </button>
                <span id="stories-media-count" class="text-sm" style="color:var(--text-muted);">медиа: —</span>
            </div>
            <div id="stories-media-list" class="text-sm" style="max-height:160px;overflow:auto;color:var(--text-muted);font-size:0.74rem;"></div>
        </div>
    </div>

    <!-- Параметры -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-sliders text-accent"></i> Параметры</div>
        <div class="card-body">
            <div class="d-flex" style="gap:16px;flex-wrap:wrap;">
                <div>
                    <label class="text-sm" style="display:block;margin-bottom:4px;color:var(--text-muted);">Кто видит</label>
                    <select id="stories-privacy" class="form-control" style="min-width:170px;">
                        <option value="everyone" selected>Все</option>
                        <option value="contacts">Контакты</option>
                        <option value="closeFriends">Близкие друзья</option>
                    </select>
                </div>
                <div>
                    <label class="text-sm" style="display:block;margin-bottom:4px;color:var(--text-muted);">Сколько висит</label>
                    <select id="stories-period" class="form-control" style="min-width:140px;">
                        <option value="21600">6 часов</option>
                        <option value="43200">12 часов</option>
                        <option value="86400" selected>24 часа</option>
                        <option value="172800">48 часов</option>
                    </select>
                </div>
            </div>
        </div>
    </div>

    <!-- Управление -->
    <div class="d-flex align-center mb-3" style="gap:10px;flex-wrap:wrap;">
        <button id="stories-start-btn" class="btn btn-accent" onclick="startStories()">
            <i class="bi bi-camera-reels"></i> Запостить истории
        </button>
        <button id="stories-stop-btn" class="btn btn-outline" onclick="stopStories()" style="display:none;">
            <i class="bi bi-stop-circle"></i> Стоп
        </button>
    </div>

    <!-- Статус -->
    <div id="stories-status" class="card" style="display:none;">
        <div class="card-header"><i class="bi bi-activity text-accent"></i> Постинг историй</div>
        <div class="card-body">
            <div id="stories-status-summary" class="mb-2 text-sm"></div>
            <div id="stories-status-list" style="max-height:320px;overflow:auto;font-size:0.75rem;"></div>
        </div>
    </div>

</div>

<div class="section" id="tab-reauth">
    <!-- Карточка 1: Переавторизация -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-arrow-repeat" style="color:#60a5fa;"></i> Переавторизация</div>
        <div class="card-body">
            <div class="info-box">
                Пересоздаёт сессии аккаунтов с новыми параметрами (устройство, версия, язык). В Telegram они появятся как новые сессии — помогает при ограничениях и подозрениях от Telegram.
            </div>

            <label class="form-label">Выбор аккаунтов</label>
            <div class="d-flex gap-2 align-center mb-2 flex-wrap">
                <button class="btn btn-outline btn-sm" onclick="openReauthAccPicker()">
                    <i class="bi bi-people"></i> Выбрать аккаунты
                </button>
                <span class="text-sm text-muted" id="reauth-selected-count">0 выбрано</span>
            </div>
            <div id="reauth-acc-list" class="d-flex flex-wrap gap-1 mb-3 fs-70"></div>

            <label class="form-label">Параметры для аккаунтов</label>
            <div class="d-flex gap-2 align-center mb-2 flex-wrap">
                <select class="form-control" id="reauth-preset" style="max-width:260px;" onchange="reauthPresetChanged()">
                    <option value="custom">Свои параметры</option>
                    <option value="mixed">Встроенные вперемешку</option>
                    <option value="web">Web</option>
                    <option value="tdesktop" selected>Telegram Desktop</option>
                    <option value="android">Android</option>
                </select>
                <!-- Кнопка-дубль «Свои параметры» убрана — дублирует опцию в дропдауне.
                     Поля редактируются через массовый импорт ниже или модалку при выборе «Свои параметры». -->
                <button class="btn btn-outline btn-sm" id="reauth-custom-btn" onclick="openReauthCustomModal()" style="display:none;">
                    <i class="bi bi-list-task"></i> Указать поля
                </button>
            </div>
            <!-- Текстовик — ПУЛ device-вариантов, софт рандомит для каждого акка.
                 Phone не нужен — акки уже выбраны в плитке выше. -->
            <details class="mb-3">
                <summary style="cursor:pointer;font-weight:600;font-size:0.82rem;color:var(--text-primary);">
                    <i class="bi bi-file-earmark-text"></i> Пул device-параметров (для разнообразия)
                </summary>
                <div style="margin-top:8px;font-size:0.78rem;color:var(--text-muted);line-height:1.5;">
                    Каждая строка — один вариант. Формат:
                    <code style="background:var(--bg-card);padding:1px 5px;border-radius:3px;">device;system;app_version</code>
                    <br>
                    Софт случайно подберёт строку из этого пула для каждого выбранного акка —
                    так все акки получат разные fingerprint'ы. Phone указывать не нужно.
                    <br>
                    Если оставить пусто — все акки идут по пресету выше.
                    <br>
                    <span style="opacity:0.7;font-size:0.7rem;">Если строка начинается с phone (10-15 цифр) — это старый mapping-формат, применяется только к указанному акку.</span>
                </div>
                <textarea id="reauth-per-acc-text" class="form-control mt-2" rows="6"
                          placeholder="HP Pavilion 15;Windows 11 x64;6.4.4 x64&#10;Dell XPS 13;Windows 10 x64;6.4.2 x64&#10;Lenovo ThinkPad T14;Windows 11 x64;6.4.3 x64&#10;ASUS ROG Strix;Windows 11 x64;6.4.4 x64"
                          style="font-family:monospace;font-size:0.72rem;"></textarea>
                <div id="reauth-per-acc-info" style="margin-top:6px;font-size:0.7rem;color:var(--text-muted);"></div>
            </details>

            <label class="form-label">Новая 2FA <span class="text-xs text-muted">(опционально)</span></label>
            <input type="text" class="form-control mb-3" id="reauth-new-2fa" placeholder="Оставьте пусто чтобы не менять">

            <details class="mb-3" open>
                <summary style="cursor:pointer;font-weight:600;font-size:0.82rem;color:var(--text-primary);">Дополнительные опции</summary>
                <div style="display:flex;flex-direction:column;gap:8px;margin-top:10px;font-size:0.8rem;">
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="reauth-close-others" checked>
                        Закрывать старые сессии
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="reauth-delete-dialog" checked>
                        Удалять диалог с Telegram после переавторизации
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="reauth-continue-limit">
                        Продолжать даже если сессия моложе 24ч (пропустить закрытие)
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="reauth-keep-original" checked>
                        Сохранить оригинал (новый файл в папке Переавторизованные/)
                    </label>
                </div>
            </details>

            <div class="d-flex gap-2 mb-2">
                <button class="btn btn-accent btn-sm" onclick="startReauth()" id="btn-reauth-start">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-danger btn-sm" onclick="stopReauth()" id="btn-reauth-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Стоп
                </button>
            </div>

            <div id="reauth-progress" style="display:none;" class="mb-2">
                <div class="d-flex align-center justify-between mb-1">
                    <span class="text-sm" id="reauth-progress-text">0/0</span>
                    <span class="text-xs text-muted" id="reauth-stats"></span>
                </div>
                <div class="progress" style="height:6px;"><div class="progress-bar" id="reauth-progress-bar" style="width:0%;background:linear-gradient(90deg,#60a5fa,#a78bfa);"></div></div>
            </div>

            <textarea id="reauth-log" readonly class="form-control" rows="8" style="font-size:0.7rem;background:var(--bg-dark);color:var(--text-primary);font-family:monospace;display:none;"></textarea>
        </div>
    </div>
</div>

<!-- ═══ TAB: Конвертер tdata → session ═══ -->
<div class="section" id="tab-conv-t2s">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-file-earmark-arrow-down text-success"></i> Конвертер tdata → session</div>
        <div class="card-body">
            <div style="background:var(--surface-success-bg);border:1px solid var(--surface-success-border);border-radius:8px;padding:10px 14px;margin-bottom:12px;font-size:0.72rem;color:var(--text-muted);line-height:1.6;">
                Положите папки tdata в указанную директорию. Каждая папка должна содержать каталог <code>D877F783D5D3EF8C</code>. Результат — .session + .json в папке "В работе".
            </div>
            <!-- Предупреждение про revoke: tdata→session по дефолту тоже копирует тот же auth_key. -->
            <div style="background:linear-gradient(135deg,#3b1c0a,#2a1410);border:1px solid #f97316;border-radius:8px;padding:10px 14px;margin-bottom:12px;font-size:0.78rem;line-height:1.5;color:#fed7aa;">
                <div style="font-weight:700;color:#fdba74;margin-bottom:4px;">
                    <i class="bi bi-exclamation-triangle-fill"></i> Не оставляй tdata открытой в Telegram Desktop пока будешь работать в TelePush
                </div>
                По умолчанию (с галкой <b>«Создать новую сессию»</b>) .session получит свой ключ — можно работать параллельно с tdata в Desktop.
                Без галки .session и tdata будут использовать <b>один</b> ключ: если запустишь .session в TelePush с другого IP пока tdata активна в Desktop — Telegram отзовёт обе.
            </div>

            <label class="form-label">Путь к папке с tdata <span class="text-xs text-muted">(если пусто — берётся <code>Аккаунты/Конвертер tdata → session/</code>)</span></label>
            <input type="text" class="form-control mb-3" id="reauth-t2s-folder" placeholder="оставьте пусто чтобы использовать папку по умолчанию">

            <div class="d-flex gap-3 flex-wrap mb-3">
                <div>
                    <label class="form-label fs-72">Количество потоков</label>
                    <input type="number" class="form-control" id="reauth-t2s-threads" value="5" min="1" max="30" style="width:80px;font-size:0.8rem;">
                </div>
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.8rem;align-self:flex-end;margin-bottom:6px;">
                    <input type="checkbox" class="form-check-input" id="reauth-t2s-keep">
                    Не убирать сконвертированные аккаунты
                </label>
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.8rem;align-self:flex-end;margin-bottom:6px;">
                    <input type="checkbox" class="form-check-input" id="reauth-t2s-new-session" checked>
                    Создать новую сессию в .session <span class="tt" data-tip="ВКЛЮЧЕНО (дефолт с 1.6.177): .session получит СВОЙ ключ через TG (auth.exportLoginToken+importLoginToken). tdata останется рабочей — можно параллельно открыть её в Telegram Desktop, нет конфликта auth_key. Минусы: в 5-10× медленнее, у акка в Active Sessions появится «лишний» Desktop. ВЫКЛЮЧИ только если хочешь чтобы .session использовала ТОТ ЖЕ ключ что в tdata — но тогда не открывай tdata в Desktop пока работаешь с .session в TelePush.">?</span>
                </label>
            </div>

            <details class="mb-3">
                <summary style="cursor:pointer;font-weight:600;font-size:0.82rem;color:var(--text-primary);">Дополнительные опции</summary>
                <div style="display:flex;flex-direction:column;gap:8px;margin-top:10px;font-size:0.8rem;">
                    <div>
                        <label class="form-label fs-72">Название файла с 2FA</label>
                        <input type="text" class="form-control" id="reauth-t2s-pwd" value="Password2FA.txt" style="font-size:0.8rem;">
                    </div>
                    <div>
                        <label class="form-label fs-72">Глубина поиска папок</label>
                        <input type="number" class="form-control" id="reauth-t2s-depth" value="4" min="1" max="10" style="font-size:0.8rem;width:80px;">
                    </div>
                </div>
            </details>

            <button class="btn btn-accent btn-sm" onclick="runTdataToSession()">
                <i class="bi bi-rocket-takeoff"></i> Запустить
            </button>
            <div id="t2s-progress" class="mt-2" style="display:none;">
                <div class="d-flex align-center justify-between mb-1">
                    <span class="text-sm" id="t2s-progress-text">0/0</span>
                    <span class="text-xs text-muted" id="t2s-stats"></span>
                </div>
                <div class="progress" style="height:6px;"><div id="t2s-progress-bar" style="width:0%;background:linear-gradient(90deg,#22c55e,#4ade80);height:100%;border-radius:3px;transition:width .3s;"></div></div>
            </div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Конвертер session → tdata ═══ -->
<div class="section" id="tab-conv-s2t">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-file-earmark-arrow-up text-warning"></i> Конвертер session → tdata</div>
        <div class="card-body">
            <div class="info-box info-box--warning">
                Выберите аккаунты и сконвертируйте их в tdata-папки для использования в Telegram Desktop. Результат — в <code>data/tdata_out/</code>.
            </div>
            <!-- Видимое предупреждение про revoke: открыть tdata в Desktop пока акк работает в TelePush
                 → обе сессии получают AuthKeyDuplicated → акк слетает. -->
            <div style="background:linear-gradient(135deg,#3b1c0a,#2a1410);border:1px solid #f97316;border-radius:8px;padding:10px 14px;margin-bottom:12px;font-size:0.78rem;line-height:1.5;color:#fed7aa;">
                <div style="font-weight:700;color:#fdba74;margin-bottom:4px;">
                    <i class="bi bi-exclamation-triangle-fill"></i> Не открывай tdata в Telegram Desktop пока этот же акк работает в TelePush
                </div>
                По умолчанию (без галки <b>«Создать новую сессию»</b>) tdata содержит <b>тот же auth_key</b> что и оригинал в TelePush.
                Если открыть tdata в Desktop с другого IP — Telegram увидит «session_stolen» и отзовёт <b>обе</b> сессии: акк слетит и здесь, и там.
                Хочешь использовать акк в Desktop параллельно — включи галку ниже («Создать новую сессию в tdata»).
                <div style="margin-top:6px;color:#fcd34d;">
                    ⚠️ <b>Даже с новой сессией</b>: открытие в Desktop = новый вход с твоего IP. Для <b>свежих</b> акков (только что зарегистрированы / меняли профиль) вход из Desktop с <b>другого IP/страны</b> = триггер антифрода Telegram → может слететь. Открывай <b>с того же прокси/IP</b>, на котором акк грелся, и не сразу после правок профиля.
                </div>
            </div>

            <div class="d-flex gap-2 align-center mb-2 flex-wrap">
                <button class="btn btn-outline btn-sm" onclick="openReauthAccPicker('s2t')">
                    <i class="bi bi-people"></i> Выбрать аккаунты
                </button>
                <span class="text-sm text-muted" id="s2t-selected-count">0 выбрано</span>
            </div>
            <div id="s2t-acc-list" class="d-flex flex-wrap gap-1 mb-3 fs-70"></div>

            <div class="d-flex gap-3 flex-wrap mb-3" style="align-items:flex-end;">
                <div>
                    <label class="form-label fs-72">Аккаунтов в одну tdata</label>
                    <input type="number" class="form-control" id="s2t-pack" value="1" min="1" max="10" style="width:80px;font-size:0.8rem;">
                </div>
                <div>
                    <label class="form-label fs-72">Количество потоков</label>
                    <input type="number" class="form-control" id="s2t-threads" value="5" min="1" max="30" style="width:80px;font-size:0.8rem;">
                </div>
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.8rem;margin-bottom:6px;">
                    <input type="checkbox" class="form-check-input" id="s2t-offline">
                    Оффлайн-конвертация
                </label>
            </div>

            <details class="mb-3">
                <summary style="cursor:pointer;font-weight:600;font-size:0.82rem;color:var(--text-primary);">Дополнительные опции</summary>
                <div style="display:flex;flex-direction:column;gap:8px;margin-top:10px;font-size:0.8rem;">
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="s2t-save-2fa" checked>
                        Сохранять 2FA в файл
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="s2t-copy-orig" checked>
                        Копировать оригинал аккаунта в папку tdata
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="s2t-new-session" checked>
                        Создать новую сессию в tdata <span class="tt" data-tip="ВКЛЮЧЕНО (дефолт с 1.6.176): tdata получает СВОЮ auth_key через auth.exportLoginToken+importLoginToken. Оригинал в TelePush можно продолжать использовать — у Telegram два разных ключа, нет конфликта при открытии tdata в Desktop. Минусы: в 5-10× медленнее, в Active Sessions у акка появится новый Desktop, чувствительно к rate-limit при массовом конверте. ВЫКЛЮЧИ только если: 1) хочешь окончательно перенести акк в Desktop (включи и галку ниже «убрать из работы»), 2) делаешь конверт для архива без открытия в Desktop.">?</span>
                    </label>
                    <label class="d-flex align-center gap-2 cursor-pointer">
                        <input type="checkbox" class="form-check-input" id="s2t-move-to-archive" checked>
                        После конверта убрать акк из работы (в папку «Конвертер session → tdata») <span class="tt" data-tip="ВКЛЮЧЕНО (дефолт). После успешного конверта .session+.json переезжают в Аккаунты/Конвертер session → tdata/. TelePush больше не задействует акк ни в одной задаче (рассылка/подписка/прогрев) — auth_key не пересечётся с твоим Desktop'ом. Хочешь вернуть в работу — перемести файлы обратно в «В работе» вручную.">?</span>
                    </label>
                </div>
            </details>

            <button class="btn btn-accent btn-sm" onclick="runSessionToTdata()">
                <i class="bi bi-rocket-takeoff"></i> Запустить
            </button>
            <div id="s2t-progress" class="mt-2" style="display:none;">
                <div class="d-flex align-center justify-between mb-1">
                    <span class="text-sm" id="s2t-progress-text">0/0</span>
                    <span class="text-xs text-muted" id="s2t-stats"></span>
                </div>
                <div class="progress" style="height:6px;"><div id="s2t-progress-bar" style="width:0%;background:linear-gradient(90deg,#f59e0b,#fbbf24);height:100%;border-radius:3px;transition:width .3s;"></div></div>
            </div>
        </div>
    </div>
</div>

<!-- Модалка: Свои параметры -->
<div id="reauth-custom-modal" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.7);z-index:500;align-items:center;justify-content:center;">
    <div style="background:var(--bg-card-hover);border:1px solid var(--border);border-radius:14px;padding:22px;max-width:440px;width:90%;max-height:85vh;overflow-y:auto;">
        <h3 style="color:#fff;font-size:1.1rem;margin-bottom:14px;">Свои параметры</h3>
        <div style="display:flex;flex-direction:column;gap:10px;font-size:0.8rem;">
            <div><label class="form-label">API ID</label><input type="number" class="form-control" id="cp-api-id"></div>
            <div><label class="form-label">API Hash</label><input type="text" class="form-control" id="cp-api-hash"></div>
            <div><label class="form-label">Device Model</label><input type="text" class="form-control" id="cp-device" placeholder="PC 64bit"></div>
            <div><label class="form-label">System Version</label><input type="text" class="form-control" id="cp-sysver" placeholder="Windows 10"></div>
            <div><label class="form-label">App Version</label><input type="text" class="form-control" id="cp-appver" placeholder="6.2.2 x64"></div>
            <div class="d-flex gap-2">
                <div class="flex-1" ><label class="form-label">Lang Code</label><input type="text" class="form-control" id="cp-lang" value="en"></div>
                <div class="flex-1" ><label class="form-label">System Lang</label><input type="text" class="form-control" id="cp-syslang" value="en-US"></div>
            </div>
        </div>
        <div class="d-flex gap-2 mt-3">
            <button class="btn btn-accent btn-sm" onclick="saveReauthCustomPreset()">Сохранить</button>
            <button class="btn btn-outline btn-sm" onclick="document.getElementById('reauth-custom-modal').style.display='none';">Отмена</button>
        </div>
    </div>
</div>

<!-- ═══ TAB: Настройки ═══ -->
<div class="section" id="tab-settings">
    <!-- Поиск по настройкам. Sticky убран (перекрывал контент) — скроллится вместе с табом. -->
    <div class="card mb-3">
        <div class="card-body" style="padding:10px;">
            <div style="position:relative;">
                <i class="bi bi-search" style="position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--text-muted);font-size:0.85rem;"></i>
                <input type="text" id="settings-search" class="form-control" placeholder="Поиск по настройкам (прокси, прогрев, AI, лицензия...)" style="padding-left:34px;" oninput="filterSettings(this.value)">
                <span id="settings-search-clear" onclick="document.getElementById('settings-search').value='';filterSettings('');" style="display:none;position:absolute;right:10px;top:50%;transform:translateY(-50%);color:var(--text-muted);cursor:pointer;font-size:0.9rem;"><i class="bi bi-x-circle"></i></span>
            </div>
            <div id="settings-search-empty" style="display:none;margin-top:8px;font-size:0.78rem;color:var(--text-muted);text-align:center;">Ничего не найдено</div>
        </div>
    </div>

    <!-- Звуковые уведомления (opt-in) -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-volume-up-fill" style="color:#fbbf24;"></i> Звуковые уведомления</div>
        <div class="card-body">
            <div class="info-box note-row" style="margin-bottom:10px;">
                Короткий beep на важные события. По умолчанию выключены. Можно отойти от компа и слышать когда что-то случилось.
            </div>
            <label class="ad-check" style="display:block;margin-bottom:6px;"><input type="checkbox" id="sound-freeze" onchange="tpSetSound('freeze', this.checked)"> <span>Заморозка аккаунта<span class="ad-hint">Глухой низкий beep при появлении нового frozen-акка</span></span></label>
            <label class="ad-check" style="display:block;margin-bottom:6px;"><input type="checkbox" id="sound-done" onchange="tpSetSound('done', this.checked)"> <span>Завершение задачи (рассылка/прогрев/инвайт)<span class="ad-hint">Два восходящих тона когда задача закончилась</span></span></label>
            <label class="ad-check" style="display:block;margin-bottom:10px;"><input type="checkbox" id="sound-error" onchange="tpSetSound('error', this.checked)"> <span>Критическая ошибка<span class="ad-hint">Сигнал-падение когда показывается error-тост</span></span></label>
            <div style="display:flex;gap:12px;align-items:center;margin-top:8px;">
                <label class="form-label" style="margin:0;">Громкость:</label>
                <input type="range" id="sound-volume" min="0" max="100" value="50" style="width:160px;" oninput="tpSetSoundVolume(this.value/100);document.getElementById('sound-volume-val').textContent=this.value+'%'">
                <span id="sound-volume-val" style="font-size:0.75rem;color:var(--text-muted);">50%</span>
                <button class="btn btn-outline btn-sm" onclick="tpTestSound('done')" style="margin-left:auto;"><i class="bi bi-play-fill"></i> Проверить</button>
            </div>
            <script>
                // Восстанавливаем чекбоксы из localStorage при загрузке настроек
                (function() {
                    var bindRestore = function() {
                        ['freeze','done','error'].forEach(function(k) {
                            var cb = document.getElementById('sound-' + k);
                            if (cb) cb.checked = (localStorage.getItem('tp_sound_' + k) === '1');
                        });
                        var vol = parseFloat(localStorage.getItem('tp_sound_volume') || '0.5');
                        var v = document.getElementById('sound-volume');
                        var vv = document.getElementById('sound-volume-val');
                        if (v) v.value = Math.round(vol * 100);
                        if (vv) vv.textContent = Math.round(vol * 100) + '%';
                    };
                    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bindRestore);
                    else bindRestore();
                })();
            </script>
        </div>
    </div>

    <!-- Информация о путях софта -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-folder2-open text-info"></i> Где софт хранит данные</div>
        <div class="card-body">
            <div class="info-box note-row" style="margin-bottom:10px;">
                TelePush держит файлы вне папки с exe — чтобы автообновление не сносило сессии и настройки. Если нужно стереть всё дочиста — кнопка ниже.
            </div>
            <div id="paths-info-rows" style="font-size:0.78rem;color:var(--text-muted);">Загрузка…</div>
            <div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;">
                <button class="btn btn-outline btn-sm" onclick="openPathFolder('accounts')"><i class="bi bi-folder2-open"></i> Аккаунты</button>
                <button class="btn btn-outline btn-sm" onclick="openPathFolder('data')"><i class="bi bi-database"></i> data</button>
                <button class="btn btn-outline btn-sm" onclick="openPathFolder('backup')"><i class="bi bi-shield"></i> ~/.telepush</button>
                <button class="btn btn-danger btn-sm" onclick="factoryReset()" style="margin-left:auto;">
                    <i class="bi bi-trash"></i> Стереть всё (полный сброс)
                </button>
            </div>
        </div>
    </div>

    <!-- AI помощник — выбор провайдера + ключ -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-stars" style="color:#a855f7;"></i> AI помощник (чат в углу экрана)</div>
        <div class="card-body">
            <div class="info-box note-row" style="margin-bottom:10px;">
                Выбери AI-провайдера и вставь свой ключ. Помощник будет знать твои аккаунты и активные задачи, советовать настройки, объяснять FloodWait. Запросы идут напрямую от твоего ПК к AI-провайдеру, через наш сервер не проходят.
            </div>
            <div class="row-flex gap-3" style="flex-wrap:wrap;">
                <div style="flex:1;min-width:200px;">
                    <label class="form-label">Провайдер</label>
                    <select id="tphelper-ai-provider" class="form-control" onchange="onTphelperAiProviderChange()">
                        <option value="deepseek">DeepSeek (дёшево)</option>
                        <option value="openai">OpenAI (GPT)</option>
                        <option value="anthropic">Anthropic Claude</option>
                        <option value="gemini">Google Gemini (есть бесплатный лимит)</option>
                    </select>
                </div>
                <div style="flex:2;min-width:240px;">
                    <label class="form-label">API ключ</label>
                    <input type="password" id="tphelper-ai-key" class="form-control" placeholder="sk-... / AIza... / sk-ant-...">
                </div>
                <div style="flex:1;min-width:200px;">
                    <label class="form-label">Модель <span style="font-size:0.7rem;color:var(--text-muted);">(опц.)</span></label>
                    <input type="text" id="tphelper-ai-model" class="form-control" placeholder="по умолчанию">
                </div>
            </div>
            <div style="margin-top:8px;font-size:0.72rem;color:var(--text-muted);" id="tphelper-ai-key-hint"></div>
            <div style="margin-top:10px;display:flex;gap:8px;align-items:center;">
                <button class="btn btn-accent btn-sm" onclick="saveTphelperAiSettings()"><i class="bi bi-check"></i> Сохранить</button>
                <button class="btn btn-outline btn-sm" onclick="testTphelperAiSettings()"><i class="bi bi-play"></i> Проверить</button>
                <span id="tphelper-ai-key-status" style="font-size:0.75rem;color:var(--text-muted);"></span>
            </div>
        </div>
    </div>

    <!-- Глобальная защита аккаунтов -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-check text-success"></i> Глобальная защита аккаунтов</div>
        <div class="card-body">
            <div class="info-box note-row">
                Эти настройки действуют во всех модулях по умолчанию. В каждом модуле можно переопределить отдельно (раскрывашка «Защита аккаунта»).
            </div>
            <label class="ad-check"><input type="checkbox" id="global-pre-spam-check" onchange="saveGlobalAdSettings()"> <span>Перед стартом любой задачи проверять аккаунты на спам-блок<span class="ad-hint">Один проход через @SpamBot — заблокированные пропустятся, чисто-живые пойдут в работу</span></span></label>
        </div>
    </div>

    <!-- «Расписание работы» удалено. Задачи стартуют по запуску, без часовых ограничений. -->

    <!-- TG-бот уведомления -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-telegram" style="color:#5db7ff;"></i> Уведомления через Telegram-бот</div>
        <div class="card-body">
            <div class="info-box note-row">
                Создай бота через @BotFather, получи токен. Затем напиши боту /start и укажи свой chat_id (узнать через @userinfobot).
                Софт будет слать тебе алерты в Telegram — даже если программа не открыта.
            </div>
            <div class="grid-2 mb-2">
                <div>
                    <label class="form-label">Bot Token</label>
                    <input type="text" class="form-control" id="tg-bot-token" placeholder="123456:AAH...xyz">
                </div>
                <div>
                    <label class="form-label">Твой Chat ID</label>
                    <input type="text" class="form-control" id="tg-bot-chat-id" placeholder="123456789">
                </div>
            </div>
            <label class="ad-check"><input type="checkbox" id="tg-notify-spamblock"> <span>Уведомлять когда аккаунт ушёл в спам-блок</span></label>
            <label class="ad-check"><input type="checkbox" id="tg-notify-task-done"> <span>Уведомлять когда задача завершена</span></label>
            <label class="ad-check"><input type="checkbox" id="tg-notify-error"> <span>Уведомлять при критических ошибках</span></label>
            <div class="d-flex gap-2 mt-2 mt-8">
                <button class="btn btn-accent btn-sm" onclick="saveTgBot()"><i class="bi bi-save"></i> Сохранить</button>
                <button class="btn btn-outline btn-sm" onclick="testTgBot()"><i class="bi bi-send"></i> Тест-сообщение</button>
                <span id="tg-bot-status" class="text-xs text-muted" style="margin-left:auto;align-self:center;"></span>
            </div>
        </div>
    </div>

    <!-- Внешний вид: переключатель тем -->
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-palette" style="color:#5db7ff;"></i> Внешний вид</div>
        <div class="card-body">
            <div class="info-box" style="margin-bottom:12px;font-size:0.72rem;">
                Тема меняется мгновенно, без перезапуска. Выбор сохраняется между запусками.
            </div>
            <div class="theme-picker" id="theme-picker">
                <button type="button" class="theme-card" data-theme="calm" onclick="selectTheme('calm')">
                    <div class="theme-card__preview theme-preview-calm">
                        <span class="tp-line tp-line-bg"></span>
                        <span class="tp-line tp-line-card"></span>
                        <span class="tp-line tp-line-card2"></span>
                        <span class="tp-line tp-line-accent"></span>
                    </div>
                    <div class="theme-card__name">Спокойная</div>
                    <div class="theme-card__desc">Тёмно-синяя, текущая</div>
                </button>
                <button type="button" class="theme-card" data-theme="amoled" onclick="selectTheme('amoled')">
                    <div class="theme-card__preview theme-preview-amoled">
                        <span class="tp-line tp-line-bg"></span>
                        <span class="tp-line tp-line-card"></span>
                        <span class="tp-line tp-line-card2"></span>
                        <span class="tp-line tp-line-accent"></span>
                    </div>
                    <div class="theme-card__name">AMOLED</div>
                    <div class="theme-card__desc">Чёрный для OLED</div>
                </button>
                <button type="button" class="theme-card" data-theme="light" onclick="selectTheme('light')">
                    <div class="theme-card__preview theme-preview-light">
                        <span class="tp-line tp-line-bg"></span>
                        <span class="tp-line tp-line-card"></span>
                        <span class="tp-line tp-line-card2"></span>
                        <span class="tp-line tp-line-accent"></span>
                    </div>
                    <div class="theme-card__name">Светлая</div>
                    <div class="theme-card__desc">Белая, для дневного</div>
                </button>
            </div>
        </div>
    </div>

    <!-- AI / нейродиалоги -->
    <div class="card mb-3">
        <div class="card-header cursor-pointer" onclick="toggleSettingsSection('settings-ai')">
            <i class="bi bi-cpu text-purple"></i> <b>AI / нейродиалоги</b>
            <span id="ai-status-badge" class="badge-soft badge-soft--muted" style="margin-left:8px;font-size:0.62rem;">не настроено</span>
            <i class="bi bi-chevron-down text-muted" style="margin-left:auto;font-size:0.7rem;" id="chev-settings-ai"></i>
        </div>
        <div class="card-body" id="settings-ai" style="display:none;">

            <div class="info-box info-box--accent" style="margin-bottom:12px;font-size:0.7rem;line-height:1.55;">
                <b>Зачем:</b> с AI прогрев и комменты звучат как живые люди — не повторяющиеся шаблоны, а контекстные ответы по теме.<br>
                <b>Кто платит:</b> ты сам, своему провайдеру AI (OpenAI / OpenRouter / DeepSeek и т.п.). TelePush только выступает клиентом твоего ключа — мы не видим запросов.<br>
                <b>Стоимость:</b> зависит от модели. DeepSeek через OpenRouter ~$0.0002 за диалог (5 диалогов на акк × 30 акков × 30 дней ≈ <b>$0.9 за весь месяц прогрева</b>). GPT-4o-mini ~$0.001 за диалог (~$5/мес).
            </div>

            <div class="grid-2 mb-2">
                <div>
                    <label class="form-label">Провайдер</label>
                    <select class="form-control" id="ai-provider" onchange="onAiProviderChange()"></select>
                </div>
                <div>
                    <label class="form-label">Модель</label>
                    <select class="form-control" id="ai-model"></select>
                </div>
            </div>

            <div class="mb-2" id="ai-url-row" style="display:none;">
                <label class="form-label">URL endpoint</label>
                <input type="text" class="form-control" id="ai-url" placeholder="https://api.example.com/v1">
            </div>

            <div class="mb-2">
                <label class="form-label">API ключ <span id="ai-has-key-badge" style="display:none;font-size:0.65rem;color:var(--success);margin-left:6px;">✓ сохранён</span></label>
                <div class="d-flex gap-2 align-center">
                    <input type="password" class="form-control" id="ai-key" placeholder="sk-... (вставь сюда)" style="font-family:monospace;font-size:0.75rem;flex:1;">
                    <button class="btn btn-outline btn-sm" onclick="aiTest()" id="btn-ai-test"><i class="bi bi-lightning-charge"></i> Тест</button>
                </div>
                <div id="ai-test-result" style="margin-top:6px;font-size:0.7rem;"></div>
                <div id="ai-signup-hint" style="margin-top:6px;font-size:0.68rem;color:var(--text-muted);line-height:1.5;"></div>
            </div>

            <div class="grid-2 mb-2">
                <div>
                    <label class="form-label">Дневной бюджет, $ <span class="tt" data-tip="Максимум потратишь в день. Когда лимит достигнут — AI отключается до следующего дня (fallback на шаблоны). 0 = без лимита (опасно если введёшь дорогой ключ).">
                        <svg class="icon-inline" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
                    </span></label>
                    <input type="number" class="form-control" id="ai-budget-usd" value="5" min="0" max="1000" step="0.5" style="width:120px;">
                </div>
                <div>
                    <label class="form-label">Запросов в день <span class="tt" data-tip="Максимум HTTP-запросов к AI в сутки. 0 = без лимита.">
                        <svg class="icon-inline" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
                    </span></label>
                    <input type="number" class="form-control" id="ai-budget-req" value="0" min="0" step="100" placeholder="без лимита" style="width:140px;">
                </div>
            </div>

            <details class="mt-8" open>
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--accent-light);padding:6px 0;font-weight:600;">
                    <i class="bi bi-chat-quote"></i> Промпты для AI — пиши свой текст здесь (свернуть/раскрыть)
                </summary>
                <div style="padding:8px 0 0;">
                    <div style="font-size:0.7rem;color:var(--text-muted);margin-bottom:8px;line-height:1.5;">
                        Это поля для своих AI-промтов. Работают ТОЛЬКО когда выше включена галка «Включить AI» и указан AI-ключ. В промпте можно использовать <code>{persona}</code> и <code>{topic}</code> — подставляются автоматически. Если поле пустое — берётся стандартный промпт.
                    </div>
                    <label class="form-label">Темы для нейродиалогов <span style="color:var(--text-muted);font-weight:normal;font-size:0.65rem;">(каждая с новой строки — софт случайно выбирает на пару)</span></label>
                    <textarea class="form-control mb-2 fs-72" id="ai-dialog-topics" rows="4" placeholder="работа&#10;выходные&#10;фильмы&#10;еда&#10;спорт"></textarea>

                    <label class="form-label">Свой системный промпт для диалогов <span style="color:var(--text-muted);font-weight:normal;font-size:0.65rem;">(если пусто — стандартный)</span></label>
                    <textarea class="form-control mb-2" id="ai-custom-dialog-prompt" rows="5" placeholder="Используется {persona} и {topic} — подставляются автоматически." style="font-size:0.72rem;font-family:monospace;"></textarea>

                    <label class="form-label">Свой системный промпт для комментов</label>
                    <textarea class="form-control mb-2" id="ai-custom-comment-prompt" rows="5" placeholder="Используется {persona} и {cta_block}. Если пусто — стандартный." style="font-size:0.72rem;font-family:monospace;"></textarea>

                    <label class="form-label">CTA для нейрокомментов <span style="color:var(--text-muted);font-weight:normal;font-size:0.65rem;">(куда вести, если комментарий органично подходит)</span></label>
                    <input type="text" class="form-control mb-2" id="ai-comment-cta" placeholder="Например: 'упоминай канал @mychannel' или пусто — без рекламы">
                </div>
            </details>

            <div class="d-flex gap-2 align-center mt-2 flex-wrap">
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.78rem;">
                    <input type="checkbox" class="form-check-input" id="ai-enabled">
                    <b>Включить AI</b> (без галки — софт работает только на шаблонах)
                </label>
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.72rem;color:var(--text-muted);" data-tip="При ошибке провайдера (5xx/таймаут) попробовать запрос ещё раз через 2 сек. По умолчанию OFF — на ошибке софт сразу падает на шаблоны.">
                    <input type="checkbox" class="form-check-input" id="ai-retry-on-error">
                    Повторить запрос при ошибке провайдера
                </label>
                <button class="btn btn-accent btn-sm ml-auto" onclick="aiSave()">
                    <i class="bi bi-check-lg"></i> Сохранить
                </button>
            </div>

            <div id="ai-spent-info" style="margin-top:10px;font-size:0.68rem;color:var(--text-muted);"></div>
            <div id="ai-quota-warning" style="display:none;margin-top:8px;padding:10px 12px;border-radius:6px;background:rgba(239,68,68,0.1);border-left:3px solid #ef4444;font-size:0.72rem;line-height:1.5;">
                <b style="color:#ef4444;">⚠ Бюджет AI на сегодня исчерпан</b><br>
                Прогрев сейчас работает на встроенных шаблонах (без AI). Если хочешь продолжить с AI — пополни баланс провайдера или увеличь дневной лимит выше.<br>
                Нужна помощь — опишите вопрос в разделе «Поддержка» (меню слева), ответим в тикете.
            </div>

            <!-- AI-пулы для прогрева -->
            <div class="mt-3" style="border-top:1px solid var(--border);padding-top:14px;">
                <div style="font-weight:600;font-size:0.82rem;margin-bottom:4px;">
                    <i class="bi bi-database-fill-add" style="color:var(--accent-light);"></i> AI-пулы для прогрева
                </div>
                <p style="font-size:0.7rem;color:var(--text-muted);line-height:1.55;margin-bottom:10px;">
                    Одной кнопкой сгенерируй уникальные имена чатов, юзернеймы, приветствия и тексты дневников — индивидуально для твоей инсталляции TelePush. Это снимает риск массового бана: Telegram не сможет «забанить пул» потому что у каждого клиента он свой.
                    <br><b>Стоимость:</b> ~$0.05-0.15 за полный пересчёт (одноразово). Промпты встроены в софт — настраивать ничего не нужно.
                </p>
                <div id="ai-pool-status" style="font-size:0.7rem;color:var(--text-muted);margin-bottom:8px;">Пулы не сгенерированы — используются встроенные шаблоны.</div>
                <div id="ai-pool-progress" style="display:none;margin-bottom:8px;">
                    <div class="progress mb-1" style="height:8px;"><div class="progress-bar" id="ai-pool-progress-bar" style="width:0%;background:var(--accent);"></div></div>
                    <div style="font-size:0.68rem;color:var(--text-muted);" id="ai-pool-progress-text">—</div>
                </div>
                <div class="d-flex gap-2 align-center flex-wrap">
                    <button class="btn btn-accent btn-sm" onclick="aiRegeneratePools()" id="btn-ai-regen">
                        <i class="bi bi-magic"></i> Сгенерировать AI-пулы
                    </button>
                    <button class="btn btn-outline btn-sm" onclick="aiClearPool()" id="btn-ai-clear">
                        <i class="bi bi-trash"></i> Сбросить пулы
                    </button>
                </div>
            </div>
        </div>
    </div>

    <!-- Подключение аккаунтов -->
    <div class="card mb-3">
        <div class="card-header cursor-pointer" onclick="toggleSettingsSection('settings-connection')">
            <i class="bi bi-plug" style="color:#06b6d4;"></i> <b>Подключение аккаунтов</b>
            <i class="bi bi-chevron-down text-muted" style="margin-left:auto;font-size:0.7rem;transition:transform .2s;" id="chev-settings-connection"></i>
        </div>
        <div class="card-body" id="settings-connection" style="display:none;">
            <div class="grid-2 mb-3" style="max-width:500px;">
                <div>
                    <label class="form-label">Таймаут подключения к прокси (сек)</label>
                    <div class="d-flex align-center gap-2">
                        <input type="number" class="form-control w-100px" id="s-proxy-timeout" value="15" min="5" max="120">
                        <span class="text-sm text-muted">сек</span>
                    </div>
                </div>
                <div>
                    <label class="form-label">Кол-во попыток подключения к прокси</label>
                    <input type="number" class="form-control w-100px" id="s-connect-retries" value="3" min="1" max="10">
                    <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                        Сколько раз попробовать достучаться до прокси перед тем как пометить акк «не смог подключиться». 3 = стандарт. Больше — терпеливее на флапающих прокси. Меньше — быстрее проскочит мёртвые.
                    </div>
                </div>
            </div>
            <div>
                <label class="form-label">Пауза между подключениями акков (сек)</label>
                <input type="number" class="form-control w-100px" id="s-connect-delay" value="3" min="0" max="60">
                <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    Когда нажимаешь «Старт» в Multi-DM/рассылке/подписке — акки коннектятся не одновременно, а по одному с этой паузой. Защита от ревоука: 4+ одновременных коннекта с одного IP Telegram видит как бот-ферму и отзывает сессии. 5 сек — стандарт TDesktop (юзер открывает акки вручную с таким интервалом). 0 = все сразу (риск).
                </div>
            </div>
            <div class="mt-3">
                <label class="form-label">Пауза между ПЕРВЫМ коннектом свежих акков (сек)</label>
                <input type="number" class="form-control w-100px" id="s-first-connect-gap" value="0" min="0" max="60">
                <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    Срабатывает только для акков которые ПЕРВЫЙ раз коннектятся в TelePush (свежие). Действует per-proxy: разные прокси работают параллельно, серилизация — только внутри одного IP. Если все 100 свежих акков идут через ОДИН прокси, рекомендуется поставить 5-10 секунд (TG может посчитать одновременный массовый коннект бот-фермой). Если прокси разные — можно оставить 0. 0 = выключено (по умолчанию).
                </div>
            </div>
            <div class="mt-3">
                <label class="form-label">Пауза между коннектами через ОДИН прокси (сек)</label>
                <input type="number" class="form-control w-100px" id="s-proxy-connect-gap" value="1.5" min="0" max="30" step="0.5">
                <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    Минимальный интервал между подключениями аккаунтов через ОДИН и тот же прокси-порт — для ВСЕХ акков (не только свежих) и во всех режимах (подписка/рассылка/прогрев/мониторинг). Защита от блокировки ПРОВАЙДЕРОМ прокси: residential-прокси (proxyma и т.п.) лимитируют частоту коннектов на порт — если много акков делят один порт, без паузы порт «захлёбывается» и все ловят таймаут «прокси не отвечает». Разные прокси работают параллельно (пауза только внутри одного порта). 1.5 — мягкий дефолт; если все акки на ОДНОМ прокси — поставь 2-3. 0 = выключено.
                </div>
            </div>
            <div class="mt-3" style="border-top:1px solid var(--border);padding-top:10px;">
                <label class="d-flex align-center gap-2" style="cursor:pointer;margin-bottom:0;">
                    <input type="checkbox" class="form-check-input" id="s-require-proxy-high-risk" onchange="saveRequireProxyHighRisk()" checked>
                    <span class="form-label" style="margin:0;">Требовать прокси для прогрева / рассылки / ЛС / чекера</span>
                </label>
                <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    Высокорисковые модули без живого прокси коннектятся с твоим real-IP — Telegram это видит и банит акк. По умолчанию ВКЛ (безопасно): если прокси сдох, акк не стартует и просит заменить прокси, вместо тихого real-IP-коннекта. Выключай только если осознанно работаешь без прокси (риск бана на тебе). Парсер / мониторинг / TG-веб — низкорисковые, у них своя логика.
                </div>
            </div>
            <div class="mt-3" style="border-top:1px solid var(--border);padding-top:10px;">
                <label class="form-label">Прогрев свежезарегистрированных акков (мин)</label>
                <input type="number" class="form-control w-100px" id="s-warmup-duration-min" value="0" min="0" max="60">
                <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">
                    После добавления акка по SMS / 2FA через нашу форму — софт держит акк online указанное время. Это снижает риск что Telegram примет свежезарегистрированный акк за бота. По умолчанию <b>0 (выключено)</b> — клиент сам решает когда начать работу с акком. Если ставишь > 0 — будет только passive online + GetMe, без агрессивных RPC которые сами могут спровоцировать revoke. Готовые tdata-акки (.session+.json drop) не прогреваются — они уже прогреты в TDesktop.
                </div>
            </div>
            <div class="mt-3" style="border-top:1px solid var(--border);padding-top:10px;">
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.78rem;" data-tip="Если ВКЛ — при большом FloodWait у акка софт сам поставит ему другой живой прокси из пула. По умолчанию OFF — софт ничего не трогает, акк просто помечается disabled.">
                    <input type="checkbox" class="form-check-input" id="s-auto-rotate-proxy">
                    <span><b>Авто-ротация прокси</b> при FloodWait / отозванной сессии <span style="color:var(--text-muted);">(opt-in)</span></span>
                </label>
            </div>
            <div class="mt-3" style="border-top:1px solid var(--border);padding-top:10px;">
                <label class="d-flex align-center gap-2" style="cursor:pointer;font-size:0.78rem;" data-tip="Если ВКЛ — софт НЕ даст 3+ разным аккам отправить ОДИН И ТОТ ЖЕ текст за 24ч в прогреве/рассылке (Telegram видит такой паттерн как бот-сеть → заморозки). По умолчанию OFF — твой выбор, что и сколько слать.">
                    <input type="checkbox" class="form-check-input" id="s-warmup-watchdog">
                    <span><b>Защита от паттерна одинаковых текстов</b> в прогреве/рассылке <span style="color:var(--text-muted);">(opt-in)</span></span>
                </label>
                <div class="d-flex align-center gap-2 mt-2" style="font-size:0.76rem;color:var(--text-muted);padding-left:26px;">
                    <span>Порог: блокировать если</span>
                    <input type="number" class="form-control" id="s-warmup-watchdog-threshold" min="2" max="50" placeholder="3" style="width:60px;padding:2px 6px;font-size:0.76rem;">
                    <span>+ акков слали один текст за 24ч</span>
                </div>
            </div>
        </div>
    </div>

    <!-- Разное -->
    <div class="card mb-3">
        <div class="card-header cursor-pointer" onclick="toggleSettingsSection('settings-misc')">
            <i class="bi bi-gear text-muted"></i> <b>Разное</b>
            <i class="bi bi-chevron-down text-muted" style="margin-left:auto;font-size:0.7rem;transition:transform .2s;" id="chev-settings-misc"></i>
        </div>
        <div class="card-body" id="settings-misc" style="display:none;">
            <div class="mb-3">
                <button class="btn btn-outline btn-sm" onclick="packLogs()">
                    <i class="bi bi-file-zip"></i> Упаковать логи <span class="tt" data-tip="Собирает все логи приложения (data/logs/) в один зашифрованный .tplog архив. Отправь его в поддержку — мы сможем диагностировать проблемы у тебя.">?</span>
                </button>
            </div>

            <!-- Расширенный режим присылания логов в саппорт. Дефолт ВКЛ. -->
            <div class="mb-3" id="debug-to-server-box" style="border:1px solid var(--border);border-radius:8px;padding:10px 14px;background:rgba(0,0,0,0.18);">
                <label class="ad-check">
                    <input type="checkbox" id="s-debug-to-server" onchange="toggleDebugToServer(this)">
                    <span>Присылать расширенные логи в саппорт
                    <span class="ad-hint">ВКЛЮЧЕНО по умолчанию. DEBUG-логи кода уходят на сервер где саппорт смотрит раз в пару дней — ищет ошибки/лаги/неоптимизации и фиксит. На сервере логи старше 2 дней автоматически удаляются. Номера телефонов и юзернеймы маскируются перед отправкой (3 первых + 3 последних символа). Тексты сообщений в логи не попадают. Сними галку если не хочешь присылать — будут уходить только реальные ошибки (WARNING/ERROR).</span></span>
                </label>
                <div id="debug-to-server-status" style="font-size:0.68rem;color:var(--text-muted);margin-top:6px;">проверяю статус…</div>
            </div>

            <div class="mb-3">
                <label class="ad-check"><input type="checkbox" id="s-auto-update-install" onchange="saveAutoUpdateInstall()"> <span>Устанавливать обновления автоматически при запуске<span class="ad-hint">Если включено — при старте софта новая версия скачается и накатится сама (без баннера «Обновить»). Без галочки — баннер появляется и ты сам решаешь когда обновиться.</span></span></label>
            </div>

            <div class="mb-3">
                <label class="ad-check"><input type="checkbox" id="s-update-sound" checked onchange="saveUpdateSound(this)"> <span>Звуковой сигнал когда приходит обновление<span class="ad-hint">Когда появляется новая версия — софт один раз проиграет короткий «динь-дон». Сними галку если не нужно. При включении проиграется сразу — услышишь как звучит.</span></span></label>
            </div>

            <div class="mb-3">
                <label class="form-label">Пауза между задачами на одном аккаунте (мин) <span class="tt" data-tip="После завершения задачи аккаунт ждёт это время перед следующей задачей. Раньше было жёстко 30 минут. 0 = без паузы. Основная защита аккаунта — FloodWait и паузы между сообщениями, это лишь лёгкий спейсинг между задачами.">?</span></label>
                <input type="number" class="form-control w-100px" id="s-account-cooldown" value="5" min="0" max="120" onchange="saveAccountCooldown()">
            </div>

            <div class="mb-3">
                <label class="ad-check"><input type="checkbox" id="s-bg-scanner" onchange="saveBgScanner(this)"> <span>Помогать улучшать поиск по чатам (фоновый сбор)<span class="ad-hint">По умолчанию ВЫКЛ. Если включить — аккаунты в фоне иногда собирают список участников открытых чатов (улучшает общий поиск по чатам). Тратит немного запросов аккаунтов = лёгкая фоновая активность на акках. На работу задач не влияет.</span></span></label>
            </div>


            <div class="grid-2 mb-3" style="max-width:500px;">
                <div>
                    <label class="form-label">Параметры генерации JSON</label>
                    <select class="form-control" id="s-json-device" onchange="onDeviceChange()">
                        <option value="desktop_2040">Desktop (пара 2040)</option>
                        <option value="android">Android</option>
                        <option value="ios">iOS</option>
                    </select>
                </div>
                <div>
                    <label class="form-label">Автоудаление мёртвых акков</label>
                    <select class="form-control" id="s-auto-clean-dead">
                        <option value="off">Выключено</option>
                        <option value="move">Переместить в папку</option>
                        <option value="delete">Удалить</option>
                    </select>
                </div>
            </div>
            <div class="grid-2 mb-3" style="max-width:500px;">
                <div>
                    <label class="form-label">Авто-снятие спам-блока</label>
                    <select class="form-control" id="s-spam-auto-recheck">
                        <option value="spambot">Перепроверять через @SpamBot</option>
                        <option value="flag">Снимать по таймеру</option>
                        <option value="off">Не снимать автоматически</option>
                    </select>
                    <div style="font-size:0.68rem;color:var(--text-muted);margin-top:4px;">Когда срок временного блока истёк: «через @SpamBot» подключает акк и возвращает в работу только если бот подтвердил «свободен»; «по таймеру» снимает сразу.</div>
                </div>
            </div>
            <div class="grid-2 mb-3" style="max-width:500px;">
                <div>
                    <label class="form-label">API ID</label>
                    <input type="number" class="form-control" id="s-api-id" value="2040" min="1" style="max-width:200px;">
                </div>
                <div>
                    <label class="form-label">API Hash</label>
                    <input type="text" class="form-control" id="s-api-hash" value="b18441a1ff607e10a989891a5462e627" style="max-width:320px;">
                </div>
            </div>
        </div>
    </div>

    <div class="d-flex gap-2 flex-wrap">
        <button class="btn btn-accent" onclick="saveSettings()"><i class="bi bi-check2"></i> Сохранить настройки</button>
        <button class="btn btn-outline btn-sm" onclick="openSettingsFolder()" data-tip="Открыть папку с файлом настроек в Проводнике — можно скопировать себе бэкап">
            <i class="bi bi-folder2-open"></i> Открыть папку
        </button>
        <button class="btn btn-outline btn-sm" onclick="showSettingsDebug()" data-tip="Показать путь к файлу настроек и что в нём реально записано">
            <i class="bi bi-info-circle"></i> Диагностика
        </button>
        <button class="btn btn-outline btn-sm" onclick="restoreSettingsFromBackup()" data-tip="Восстановить настройки из резервной копии (если основной файл был сброшен)">
            <i class="bi bi-arrow-counterclockwise"></i> Восстановить из бэкапа
        </button>
        <button class="btn btn-outline btn-sm" onclick="showHistoryStats()" data-tip="История операций (что софт помнит про отправки/подписки/парсинг) — посмотреть статистику и при желании сбросить">
            <i class="bi bi-clock-history"></i> История операций
        </button>
    </div>

    <!-- «Расширенные: Webhook» удалён. -->

    <!-- Глобальные чёрные списки -->
    <div class="card mb-3 mt-3">
        <div class="card-header"><i class="bi bi-shield-x text-danger"></i> Глобальные чёрные списки <span class="text-xs text-muted ml-2">— применяются ко ВСЕМ модулям</span></div>
        <div class="card-body">
            <div class="grid-2" style="gap:14px;">
                <div>
                    <label class="form-label">Чёрный список юзеров <span class="text-xs text-muted">(для DM и инвайтера)</span></label>
                    <textarea class="form-control" id="bl-users" rows="5" placeholder="@username&#10;123456789&#10;@another" style="font-size:0.72rem;font-family:monospace;"></textarea>
                    <div class="text-xs text-muted mt-1">Один юзер на строку: @username или id. Эти юзеры будут пропущены в DM и при инвайте.</div>
                </div>
                <div>
                    <label class="form-label">Чёрный список чатов <span class="text-xs text-muted">(для рассылки, парсера, мониторинга)</span></label>
                    <textarea class="form-control" id="bl-chats" rows="5" placeholder="@chatname&#10;https://t.me/somechat&#10;-1001234567890" style="font-size:0.72rem;font-family:monospace;"></textarea>
                    <div class="text-xs text-muted mt-1">Один чат на строку: @username, t.me/X или id. Эти чаты пропустятся в spam/parser/monitor.</div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Инструкция ═══ -->
<div class="section" id="tab-guide">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-book text-warning"></i> Быстрый старт</div>
        <div class="card-body" style="font-size:0.82rem;color:var(--text-secondary);line-height:1.6;">
            <ol style="margin:0 0 0 18px;padding:0;">
                <li><b>Закрой Telegram Desktop и другой софт с этими акками</b>, потом добавь .session+.json пары во вкладке «Аккаунты». Если акк параллельно открыт где-то ещё, Telegram дропнет обе сессии моментально.</li>
                <li>Привяжи прокси в «Прокси» (без них акк рискует словить бан)</li>
                <li>Проверь здоровье акка кнопкой <i class="bi bi-heart-pulse"></i> в строке. Если trust score &lt;45 — прогрей перед массовыми задачами</li>
                <li>Выбери модуль — настрой текст/чаты/тайминги — «Запустить»</li>
            </ol>
            <p style="margin-top:8px;color:var(--text-muted);font-size:0.74rem;">1 акк = 1 задача. Несколько аккаунтов работают параллельно. Бейдж «Глух» рядом со статусом = акку лучше дать отдохнуть.</p>
            <div class="info-box" style="margin-top:10px;color:#f59e0b;background:rgba(245,158,11,.08);border-color:rgba(245,158,11,.3);">
                <i class="bi bi-exclamation-triangle" style="margin-right:6px;"></i>
                <b>Если акк показывает «Мёртвый» сразу после загрузки</b> — это значит сессия уже использовалась где-то ещё в момент загрузки (TDesktop / телефон / бот / другой клиент). Telegram revoke сделал автоматически. Купленный акк → проси у продавца новую сессию. Свой акк → переавторизуй по номеру+коду.
            </div>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-chat-dots text-accent"></i> Рассылка по чатам</div>
        <div class="card-body text-hint">
            Шлёт текст/фото в группы и каналы где акк состоит. Спинтакс <code>{привет|здравствуй}</code>, фото, фильтр по словам, задержки в Настройках.
            <b>Персонализация</b> — токены <code>%name%</code> / <code>%username%</code> / <code>%group%</code> подставляют имя получателя/чата в текст.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-envelope text-success"></i> Личные сообщения (DM)</div>
        <div class="card-body text-hint">
            Рассылка по списку @username (.txt или вручную). Спинтакс, фото, фильтр стоп-слов, персонализация <code>%name%</code>.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-link-45deg text-info"></i> Подписка на чаты</div>
        <div class="card-body text-hint">
            Массовый join по ссылкам (t.me/..., +invite). Дубликаты режутся, паузы рандомные. Папки «После инвайта» / «Спамблок» — авто-разнос по результату.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-people text-warning"></i> Мульти-аккаунт</div>
        <div class="card-body text-hint">
            Запуск задачи на нескольких акках одновременно. В попапе можно выбрать всех / по папке / точечно. Занятые акки заблокированы.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-search text-accent-base"></i> Парсинг — 7 режимов</div>
        <div class="card-body text-hint">
            Откройте «Парсинг», выберите один из режимов:
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li><b>Участники</b> — все юзеры в указанном чате/канале (если есть доступ через ваши акки).</li>
                <li><b>Писавшие</b> — только те кто реально писал, фильтр по дате последнего поста.</li>
                <li><b>Ссылки</b> — все t.me/... ссылки из сообщений канала.</li>
                <li><b>По словам</b> — найти юзеров писавших указанные слова в конкретных чатах.</li>
                <li><b>Поиск</b> — глобальный поиск чатов/каналов по словам (Telegram + опционально TGStat).</li>
                <li><b>Чаты юзера</b> — где состоит указанный @username. Поиск автоматический + через ваши акки (общие чаты).</li>
                <li><b>Слово везде</b> — найти каналы/чаты где встречается слово/фраза. <b>Без аккаунтов, мгновенно</b> — ответ из нашей серверной базы (+ опц. TGStat-токен для шире охвата). Фильтры — язык текста и регион канала. Прокси и подключённые акки не нужны.</li>
            </ul>
            <p style="margin:8px 0 0 0;font-size:0.74rem;color:var(--text-muted);">
                Экспорт результата — кнопка над таблицей (XLSX или .txt).
                Режимы «Чаты юзера» и «Слово везде» работают даже без подключённых акков — наша серверная БД даёт ответы сама.
            </p>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-fire text-orange"></i> Прогрев аккаунтов</div>
        <div class="card-body text-hint">
            Авто-переписка между парами аккаунтов. По умолчанию <b>шаблоны</b> (бесплатно). Если включить <b>AI</b> — диалоги генерит нейросеть (нужен ключ в Настройках). От 2 акков, расписание по дням.
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li><b>Свои шаблоны</b> — раскрывашка «Свои шаблоны прогрева» внизу настроек. Три поля: приветствия / основные / прощания. Можно загрузить из .txt</li>
                <li><b>Подмножество акков</b> — селектор «Кого прогревать»: один / выбрать / все. Выбор запоминается</li>
                <li><b>Сторож</b> — если 3+ акка отправили одну фразу за 24ч, следующему отправка блокируется (защита от паттерн-детекта)</li>
                <li><b>Auto-username</b> — программа сама ставит юзернейм акку если его нет, с retry через час при FloodWait</li>
            </ul>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-person-vcard text-accent"></i> Заполнение профиля</div>
        <div class="card-body text-hint">
            Массовая установка имени, фамилии, аватарки, био. Спинтакс + опциональная AI-генерация.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-reply text-success"></i> Автоответчик</div>
        <div class="card-body text-hint">
            Авто-ответ на входящие в личке. Текст и задержка настраиваются. Работает пока акк подключён.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-broadcast" style="color:#f472b6;"></i> Мониторинг чатов</div>
        <div class="card-body text-hint">
            Лови сообщения по ключевым словам в чатах где сидит акк → уведомление летит в «Сохранённые» или указанный @username.
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li>Чаты по 1 на строку, ключи через запятую</li>
                <li>Матчи копятся в CSV (кнопка «Лог матчей»)</li>
                <li>После перезапуска софта жми <b>«Восстановить»</b> — мониторинг поднимется с прежними настройками</li>
            </ul>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-chat-quote text-purple"></i> Нейрокомменты</div>
        <div class="card-body text-hint">
            Аккаунты пишут осмысленные комменты под свежими постами в указанных каналах. Текст генерит AI по теме поста.
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li>У канала должны быть включены комменты (есть discussion-группа)</li>
                <li>Аккаунты должны быть подписаны на канал</li>
                <li>Лимиты: N комментов на пост, пауза 2-15 мин, кап на акк/час и /день</li>
                <li>Опциональный CTA-блок — AI вставит ссылку только если коммент органичен</li>
            </ul>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-person-walking text-purple"></i> Имитация активности</div>
        <div class="card-body text-hint">
            Держит аккаунты «живыми»: онлайн-присутствие + просмотр историй других юзеров. Снижает риск что Telegram пометит акк как брошенный/бот. Запускается на выбранные акки, работает фоном.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-graph-up-arrow text-success"></i> Накрутка</div>
        <div class="card-body text-hint">
            Массовые действия вашими аккаунтами по ссылке: подписки на канал, реакции на пост, голоса в опросе, нажатия inline-кнопок, <code>/start</code> ботам, просмотры поста. Параллельно, с паузами между действиями.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-cpu text-purple"></i> AI помощник</div>
        <div class="card-body text-hint">
            Кнопка <b>AI</b> сверху панели. Помощник знает состояние ваших акков (FloodWait, заморозки, прокси) и UI всех модулей TelePush. Спросите коротко и по делу — отвечает 2-3 предложениями с указанием куда нажать.
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li><b>Примеры вопросов:</b> «акк в FloodWait, что делать?», «как добавить прокси?», «как найти чаты где состоит юзер?», «акки часто мрут — почему?»</li>
                <li><b>Знает:</b> все модули софта, частые ошибки Telegram (PEER_FLOOD, FROZEN, AUTH_KEY_DUPLICATED), безопасные тайминги рассылки.</li>
                <li><b>Ключ:</b> подключите в <a class="text-accent" href="javascript:showTab('settings')">Настройках → AI</a>. Провайдеры — DeepSeek (дёшево, ~$0.14/M токенов), OpenAI, Anthropic, Gemini (есть free tier).</li>
                <li><b>Также используется</b> в «Прогреве» (AI-режим), «Нейрокомментах», «Разморозке» через SpamBot.</li>
                <li>Не отправляет ваши акки/сессии в модель — только агрегаты (сколько живых, какие в FloodWait).</li>
            </ul>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-lock text-info"></i> Прокси</div>
        <div class="card-body text-hint">
            Загрузи список (socks5/http) и привяжи к аккаунтам. Один прокси на 1-3 акка — норма. Чекер проверит живость.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-people-fill text-accent-base"></i> Аккаунты — массовые операции</div>
        <div class="card-body text-hint">
            Выдели чекбоксами несколько акков → можно <b>удалить пачкой</b>, <b>проверить на спамблок</b>, переместить в папку. Папки «Мониторинг» / «Прогрев» / «После инвайта» — для разделения роли акков.
            <ul style="margin:6px 0 0 18px;font-size:0.78rem;">
                <li><b>Чипы статусов</b> сверху таблицы — за клик фильтр «Живой / Заморозка / Спам». Мёртвые не показываются (только в папке «Мёртвые» на диске)</li>
                <li><b><i class="bi bi-heart-pulse"></i> Диагностика акка</b> — кнопка в строке. Открывает modal с trust score 0-100 + плюсы/минусы (возраст, юзернейм, аватарка, контакты, диалоги)</li>
                <li><b>Бейдж «Глух»</b> — если у акка score &lt;45 или Telegram не резолвит публичные через него. Снимается через 24ч или после успеха</li>
            </ul>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-check text-info"></i> Чекер аккаунтов</div>
        <div class="card-body text-hint">
            Проверяет состояние акков: <b>спам-блок</b> (через @SpamBot) и <b>заморозку</b> (через служебный запрос Telegram, который @SpamBot не видит). Замороженные → папка «Заморозка», спам-блок → «В спам». Запуск по выбранным аккам или всем сразу.
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-arrow-repeat text-info"></i> Переавторизация</div>
        <div class="card-body text-hint">
            Если акк слетел (сессия отозвана) — войди заново по номеру+коду прямо в софте, без TDesktop. Работает из любой папки, при успехе снимает метку «Мёртвый».
        </div>
    </div>

    <div class="card">
        <div class="card-header"><i class="bi bi-shield-check text-success"></i> Безопасность</div>
        <div class="card-body text-hint">
            <ul style="margin:0 0 0 18px;font-size:0.78rem;">
                <li>Прокси обязательны — без них акк быстро уйдёт в бан</li>
                <li>Задержки 10-20 сек минимум — меньше = спамблок</li>
                <li>Новые акки прогреть 3-5 дней перед рассылкой</li>
                <li>Следи за статусами в «Аккаунты» — мёртвые/замороженные авто-метятся</li>
            </ul>
        </div>
    </div>
</div>

<!-- ═══ TAB: Профиль ═══ -->
<div class="section" id="tab-profile">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-person-badge text-accent"></i> Профиль лицензии</div>
        <div class="card-body" id="profile-data" style="font-size:0.85rem;">
            <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px 24px;">
                <div>
                    <span class="section-label" >Лицензия</span>
                    <div id="prf-key" style="font-family:'JetBrains Mono',monospace;font-weight:600;color:var(--text-primary);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >Срок действия</span>
                    <div id="prf-expires" style="font-weight:600;color:var(--success);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >Версия</span>
                    <div id="prf-version" style="font-weight:600;color:var(--accent-light);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >Тариф</span>
                    <div id="prf-key-type" style="font-weight:600;color:var(--success);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >HWID</span>
                    <div id="prf-hwid" style="font-family:'JetBrains Mono',monospace;font-size:0.75rem;color:var(--text-muted);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >Компьютер</span>
                    <div id="prf-pc" style="color:var(--text-primary);margin-top:2px;">---</div>
                </div>
                <div>
                    <span class="section-label" >Аккаунты</span>
                    <div id="prf-accs" style="color:var(--text-primary);margin-top:2px;">---</div>
                </div>
            </div>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-grid-3x3-gap text-accent"></i> Доступные модули</div>
        <div class="card-body">
            <div id="prf-modules" style="display:flex;flex-wrap:wrap;gap:6px;"></div>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-arrow-repeat text-warning"></i> Сброс привязки</div>
        <div class="card-body">
            <p style="font-size:0.82rem;color:var(--text-muted);margin-bottom:12px;">Сменили компьютер? Сбросьте привязку HWID и войдите заново на новом ПК.</p>
            <button class="btn btn-outline btn-sm" onclick="resetHwid()" id="btn-reset-hwid">
                <i class="bi bi-pc-display"></i> Сбросить привязку
            </button>
            <div id="reset-result" style="margin-top:8px;font-size:0.82rem;display:none;"></div>
        </div>
    </div>

    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-globe2 text-accent-base"></i> Профиль на сайте</div>
        <div class="card-body">
            <p style="font-size:0.82rem;color:var(--text-muted);margin-bottom:12px;">Версия, скачивание, сброс привязки, поддержка.</p>
            <a id="prf-site-link" href="#" target="_blank" class="btn btn-accent btn-sm" style="text-decoration:none;">
                <i class="bi bi-box-arrow-up-right"></i> Открыть профиль
            </a>
        </div>
    </div>

    <div class="card">
        <div class="card-header"><i class="bi bi-door-open text-danger"></i> Выход</div>
        <div class="card-body">
            <a href="/logout" class="btn btn-outline btn-sm" style="color:var(--danger);border-color:var(--danger);">
                <i class="bi bi-box-arrow-left"></i> Выйти из аккаунта
            </a>
        </div>
    </div>
</div>

<!-- ═══ TAB: Имитация активности ═══ -->
<div class="section" id="tab-imitation">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-person-walking text-purple"></i> Имитация активности</div>
        <div class="card-body">
            <div class="info-box" style="margin-bottom:12px;font-size:0.74rem;">
                Аккаунты в фоне делают «человеческие» действия БЕЗ реальных задач рассылки —
                читают сообщения в случайных диалогах, открывают профили, скроллят. Telegram-алгоритмы видят
                естественный паттерн → меньше шанс ловли спам-фильтра у свежих/прогретых акков.
                <br><br>
                <b>Когда полезно:</b> молодые акки между основными задачами, акки-мониторщики,
                «отлёжка» акков после спам-блока.
                <br><br>
                <b>⚠️ Совет от сообщества:</b> на просмотрах историй / постов без реакций Telegram быстро шлёт FloodWait. Чтобы избежать — раз в 4-5 действий имитация должна ставить лайк/реакцию (либо открыть профиль). На свежих акках (&lt;2 мес) масс-просмотры почти не работают — Telegram бьёт банами независимо от настроек.
            </div>

            <label class="form-label">Аккаунты</label>
            <div class="acc-selector mb-3" id="acc-selector-imitation"></div>

            <div class="grid-3 mb-3">
                <div>
                    <label class="form-label">Интервал — мин (мин)</label>
                    <input type="number" class="form-control" id="imit-interval-min" value="15" min="5" max="180">
                </div>
                <div>
                    <label class="form-label">Интервал — макс (мин)</label>
                    <input type="number" class="form-control" id="imit-interval-max" value="45" min="10" max="360">
                </div>
                <div>
                    <label class="form-label">Действий за раунд</label>
                    <input type="number" class="form-control" id="imit-actions-per-round" value="3" min="1" max="10">
                </div>
            </div>

            <details class="ad-block" open>
                <summary><i class="bi bi-list-check"></i> Что делает аккаунт</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="imit-do-read" checked> <span>Читать непрочитанные сообщения<span class="ad-hint">Открыть случайный диалог где есть unread → отметить прочитанным</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="imit-do-view-profile" checked> <span>Открывать профили из контактов<span class="ad-hint">Открывать профиль случайного пользователя из диалогов</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="imit-do-view-photo"> <span>Смотреть аватарки<span class="ad-hint">Реже — раз в 5-10 диалогов</span></span></label>
                </div>
            </details>

            <div class="d-flex gap-2 mb-2">
                <button class="btn btn-accent btn-sm" onclick="startImitation()" id="btn-imit-start">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-danger btn-sm" onclick="stopImitation()" id="btn-imit-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="imit-status-label" class="text-xs text-muted tag-right"></span>
            </div>

            <div id="imit-counters" style="margin-top:12px;display:none;font-size:0.78rem;color:var(--text-muted-strong);"></div>
            <div id="imit-log" style="margin-top:8px;max-height:300px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Чекер аккаунтов ═══ -->
<div class="section" id="tab-checker">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-shield-check text-accent"></i> Чекер аккаунтов</div>
        <div class="card-body">
            <div class="info-box" style="margin-bottom:14px;">
                Проверяет аккаунты через @SpamBot и определяет статус: <b>живой</b> / временный спамблок / вечный спамблок / заморожен.
                Опционально — авто-подача заявок на снятие спамблока, авто-снятие заморозки через DeepSeek-AI, сортировка по папкам.
            </div>

            <label class="form-label">Аккаунты для проверки</label>
            <div class="acc-selector mb-3" id="acc-selector-checker"></div>

            <label class="form-label">Ключ от RuCaptcha <span style="color:var(--text-muted);font-weight:400;">(опционально, для прохождения капчи если @SpamBot её попросит)</span></label>
            <input type="text" class="form-control mb-3" id="ck-rucaptcha" placeholder="Получить ключ: rucaptcha.com">

            <details class="ad-block" open>
                <summary><i class="bi bi-shield-exclamation"></i> Опции для спамблока</summary>
                <div class="ad-body">
                    <button class="btn btn-outline btn-sm mb-2" onclick="ckOpenSpamTexts()" style="font-size:0.7rem;padding:4px 12px;">
                        <i class="bi bi-list-ul"></i> Тексты для снятия спамблока
                    </button>
                    <label class="ad-check"><input type="checkbox" id="ck-check-spam" checked> <span>Проверять аккаунты на спамблок<span class="ad-hint">Если выкл — пропускает шаг проверки, сразу подаёт заявку (если включено)</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="ck-submit-spam-appeal"> <span>Подавать заявку на снятие спамблока<span class="ad-hint">При временном спамблоке отправляет случайный текст из списка в @SpamBot</span></span></label>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-snow"></i> Опции для заморозки</summary>
                <div class="ad-body">
                    <label class="form-label" style="margin-top:6px;">Промт для снятия заморозки <small class="text-muted" >(контекст для DeepSeek)</small></label>
                    <textarea class="form-control mb-2" id="ck-freeze-prompt" rows="2" placeholder="Например: Я обычный пользователь, использую аккаунт для общения с друзьями." style="font-size:0.74rem;"></textarea>
                    <label class="ad-check"><input type="checkbox" id="ck-submit-freeze-appeal"> <span>Подавать заявку на снятие заморозки<span class="ad-hint">При заморозке ведёт диалог с @SpamBot через DeepSeek</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="ck-use-hacked" checked> <span>Использовать причину "Аккаунт был взломан"</span></label>
                    <label class="ad-check"><input type="checkbox" id="ck-use-mistake" checked> <span>Использовать причину "Это ошибка"</span></label>
                    <label class="form-label mt-8">Ключ от DeepSeek <small class="text-muted" >(нужен для снятия заморозки — генерит «человеческие» ответы)</small></label>
                    <input type="text" class="form-control" id="ck-deepseek" placeholder="Получить ключ: platform.deepseek.com">
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-gear"></i> Дополнительные опции</summary>
                <div class="ad-body">
                    <label class="form-label" style="margin-top:6px;">Параллельных потоков
                        <span class="ad-hint">Сколько акков проверять одновременно. <b>0 или пусто = все сразу</b> (рекомендуется если у каждого акка свой прокси). Если 30 акков сидят на одном IP — поставь 5-10, иначе Telegram может пометить burst.</span>
                    </label>
                    <input type="number" class="form-control mb-3" id="ck-max-parallel" min="0" max="200" value="0" placeholder="0 = все сразу" style="max-width:160px;">
                    <label class="ad-check"><input type="checkbox" id="ck-sort-folders" checked> <span>Сортировать аккаунты по папкам<span class="ad-hint">После проверки аккаунты раскладываются по статусу: Живые / Спамблок / Замороженные</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="ck-rename-files"> <span>Обновлять название файлов<span class="ad-hint">Если в имени session/json указан неверный номер — файлы переименуются</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="ck-delete-dialog"> <span>Удалять диалог со спамботом<span class="ad-hint">После проверки удаляет переписку с @SpamBot</span></span></label>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-folder"></i> Настройки папок</summary>
                <div class="ad-body" style="padding:8px 14px 12px;">
                    <label class="form-label" style="margin-top:4px;">Куда перемещать живые аккаунты</label>
                    <input type="text" class="form-control mb-2" id="ck-folder-alive" value="Аккаунты/Живые" placeholder="Аккаунты/Живые">
                    <label class="form-label">Куда перемещать с временным спамблоком</label>
                    <input type="text" class="form-control mb-2" id="ck-folder-temp" value="Аккаунты/Спамблок/Временный" placeholder="Аккаунты/Спамблок/Временный">
                    <label class="form-label">Куда перемещать с вечным спамблоком</label>
                    <input type="text" class="form-control mb-2" id="ck-folder-eternal" value="Аккаунты/Спамблок/Вечный" placeholder="Аккаунты/Спамблок/Вечный">
                    <label class="form-label">Куда перемещать замороженные</label>
                    <input type="text" class="form-control" id="ck-folder-frozen" value="Аккаунты/Замороженные" placeholder="Аккаунты/Замороженные">
                </div>
            </details>

            <div class="d-flex gap-2 mt-3 mb-2">
                <button class="btn btn-accent" onclick="startChecker()" id="btn-ck-start">
                    <i class="bi bi-play-fill"></i> Запустить проверку
                </button>
                <button class="btn btn-outline btn-sm self-center" onclick="saveCheckerConfig()">
                    <i class="bi bi-save"></i> Сохранить настройки
                </button>
                <button class="btn btn-danger" onclick="stopChecker()" id="btn-ck-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="ck-status-label" class="text-xs text-muted tag-right"></span>
            </div>

            <div id="ck-progress" style="display:none;margin-top:8px;">
                <div class="progress mb-2-x">
                    <div class="progress-bar" id="ck-progress-bar" style="width:0%;"></div>
                </div>
                <div style="font-size:0.74rem;color:var(--text-muted);" id="ck-progress-text">—</div>
                <div id="ck-counters" style="margin-top:6px;font-size:0.72rem;display:flex;gap:14px;flex-wrap:wrap;"></div>
            </div>
            <div id="ck-log" style="margin-top:10px;max-height:240px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;line-height:1.6;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Очистка ТГ ═══ -->
<div class="section" id="tab-cleanup">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-eraser text-accent"></i> Очистка ТГ</div>
        <div class="card-body">
            <div class="info-box" style="margin-bottom:14px;">
                Покидает каналы/группы/боты + убирает диалоги из списка. Личные переписки только скрывает у себя (история у собеседника остаётся).
                Закреплённые диалоги, <b>Telegram</b>, <b>Replies</b>, <b>Saved Messages</b> — никогда не трогаем. Между удалениями пауза 0.7с,
                FloodWait обрабатывается автоматически.
            </div>

            <label class="form-label">Аккаунты</label>
            <div class="acc-selector mb-3" id="acc-selector-cleanup"></div>

            <div class="grid-2" style="gap:14px;margin-bottom:14px;">
                <div>
                    <label class="form-label">Что чистить</label>
                    <label class="ad-check"><input type="checkbox" id="cln-t-channels"> <span>Каналы (broadcast)</span></label>
                    <label class="ad-check"><input type="checkbox" id="cln-t-groups"> <span>Группы (megagroup + chat)</span></label>
                    <label class="ad-check"><input type="checkbox" id="cln-t-bots"> <span>Боты</span></label>
                    <label class="ad-check"><input type="checkbox" id="cln-t-pm"> <span>Личные диалоги</span></label>
                </div>
                <div>
                    <label class="form-label">Действие</label>
                    <label class="ad-check"><input type="radio" name="cln-action" value="delete" checked> <span>Покинуть + убрать из списка <span class="ad-hint">(рекомендуется)</span></span></label>
                    <label class="ad-check"><input type="radio" name="cln-action" value="leave_only"> <span>Только выйти, оставить в списке</span></label>
                    <label class="ad-check"><input type="radio" name="cln-action" value="hide_only"> <span>Только убрать из списка</span></label>
                </div>
            </div>

            <details class="ad-block">
                <summary><i class="bi bi-funnel"></i> Дополнительные фильтры</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="cln-only-no-write"> <span>Только где нельзя писать <span class="ad-hint">broadcast без админа / группы где запрещено писать</span></span></label>
                    <div class="grid-2" style="gap:14px;margin-top:8px;">
                        <div>
                            <label class="form-label fs-72">Только без активности больше N дней <span class="ad-hint">(0 = без фильтра)</span></label>
                            <input type="number" class="form-control" id="cln-inactive-days" min="0" max="3650" value="0">
                        </div>
                        <div>
                            <label class="form-label fs-72">Ключевые слова в названии <span class="ad-hint">(по строке/запятой; пусто = не использовать)</span></label>
                            <textarea class="form-control" id="cln-keywords" rows="2" placeholder="спам&#10;казино&#10;crypto"></textarea>
                        </div>
                    </div>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-shield-lock"></i> Whitelist (не трогать)</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="cln-skip-no-username" checked> <span>Не трогать личные диалоги без @username <span class="ad-hint">защита от случайного сноса VIP-контактов</span></span></label>
                    <label class="form-label fs-72" style="margin-top:8px;">@юзернеймы которые НЕ трогать (по строке)</label>
                    <textarea class="form-control" id="cln-whitelist" rows="3" placeholder="@telegram&#10;@friend1&#10;@my_main_chat"></textarea>
                </div>
            </details>

            <div class="d-flex gap-2 align-center" style="margin-top:16px;flex-wrap:wrap;">
                <label class="form-label m-0" data-tip="Сколько акков чистится одновременно. 1 = по очереди, 5-10 = быстрее.">Потоки <span class="text-muted" style="font-size:0.7rem;">?</span></label>
                <input type="number" class="form-control" id="cln-threads" value="1" min="1" max="100" style="width:70px;">
                <button class="btn btn-outline btn-sm" onclick="cleanupPreview()">
                    <i class="bi bi-eye"></i> Сухой прогон (показать что удалится)
                </button>
                <button class="btn btn-accent btn-sm" onclick="cleanupStart()">
                    <i class="bi bi-trash3"></i> Запустить очистку
                </button>
                <button class="btn btn-danger btn-sm" onclick="cleanupStop()" id="btn-cleanup-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Стоп
                </button>
                <span style="flex:1;"></span>
                <button class="btn btn-outline btn-sm" onclick="cleanupLeaveAll()">
                    <i class="bi bi-box-arrow-right"></i> Покинуть всё кроме whitelist <span class="tt tt-left" data-tip="Аккаунт выйдет из всех каналов и групп. Whitelist выше не трогается. Личные диалоги и боты остаются. Полезно перед перепродажей акка или сменой ниши.">?</span>
                </button>
            </div>

            <div id="cleanup-progress" style="display:none;margin-top:14px;">
                <div style="display:flex;justify-content:space-between;font-size:0.72rem;margin-bottom:4px;">
                    <span id="cleanup-current-step" style="color:var(--text-muted);">—</span>
                    <span><b id="cleanup-processed">0</b> удалено</span>
                </div>
                <div style="display:flex;gap:8px;flex-wrap:wrap;font-size:0.7rem;color:var(--text-muted);margin-bottom:8px;">
                    <span>Каналы: <b id="cleanup-ch">0</b></span>
                    <span>Группы: <b id="cleanup-gr">0</b></span>
                    <span>Боты: <b id="cleanup-bt">0</b></span>
                    <span>Личка: <b id="cleanup-pm">0</b></span>
                    <span>WL: <b id="cleanup-wl">0</b></span>
                    <span style="color:var(--danger);">Ошибок: <b id="cleanup-err">0</b></span>
                </div>
                <div id="cleanup-log" style="max-height:240px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;line-height:1.6;"></div>
            </div>

            <div id="cleanup-dryrun-result" style="display:none;margin-top:14px;">
                <div style="font-size:0.78rem;margin-bottom:6px;">Сухой прогон — будет удалено <b id="cleanup-dryrun-count">0</b> диалогов:</div>
                <div id="cleanup-dryrun-list" style="max-height:340px;overflow:auto;font-size:0.7rem;background:var(--bg-input);padding:8px;border-radius:6px;"></div>
            </div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Накрутка ═══ -->
<div class="section" id="tab-boost">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-graph-up-arrow text-accent"></i> Накрутка</div>
        <div class="card-body">
            <div class="info-box" style="margin-bottom:14px;">
                Массовое действие пачкой аккаунтов на одну цель. Подписчики, реакции, голосования, нажатия кнопок, запуск ботов, просмотры.
                <br><b>Защита:</b> Telegram отслеживает массовые действия за короткое время. Рекомендуем не более <b>30-50 аккаунтов в час</b> на одну цель — иначе цель может попасть под анти-накрутку. Жёстких лимитов на нашей стороне нет.
            </div>

            <!-- Тип накрутки -->
            <label class="form-label">Тип накрутки</label>
            <select class="form-control mb-3" id="boost-type" onchange="onBoostTypeChange()">
                <option value="subscribers">Подписчики в канал/чат</option>
                <option value="reactions">Реакции на пост</option>
                <option value="polls">Голос в опросе</option>
                <option value="buttons">Нажатие кнопок</option>
                <option value="bots">Запуск ботов</option>
                <option value="views">Просмотры на пост</option>
            </select>

            <!-- Цель -->
            <label class="form-label" id="boost-target-label">Ссылка на канал / @username</label>
            <input type="text" class="form-control mb-3" id="boost-target" placeholder="@channel или t.me/+invite">

            <!-- Тип-специфичные поля -->
            <div id="boost-field-emojis" style="display:none;">
                <label class="form-label">Эможди реакций (через пробел; повторите чтобы выбирались чаще)</label>
                <input type="text" class="form-control mb-3" id="boost-emojis" value="👍 ❤ 🔥" placeholder="👍 ❤ 🔥">
            </div>
            <div id="boost-field-poll" style="display:none;">
                <label class="form-label">Номер варианта (0 = первый, пусто = случайный)</label>
                <input type="number" class="form-control mb-3" id="boost-poll-option" placeholder="случайный" min="0" max="9">
            </div>
            <div id="boost-field-button" style="display:none;">
                <label class="form-label">Кнопка (текст или индекс 0/1/2...)</label>
                <input type="text" class="form-control mb-3" id="boost-button" placeholder="Принять или 0">
            </div>

            <!-- Общие настройки -->
            <div class="grid-3 mb-3">
                <div>
                    <label class="form-label">Сколько аккаунтов</label>
                    <input type="number" class="form-control" id="boost-count" value="50" min="1" max="9999">
                </div>
                <div>
                    <label class="form-label">Задержка (сек)</label>
                    <input type="text" class="form-control" id="boost-delay" value="5-15" placeholder="5-15">
                </div>
                <div>
                    <label class="form-label">Потоков (параллельно)</label>
                    <input type="number" class="form-control" id="boost-threads" value="1" min="1" max="20">
                </div>
            </div>

            <details class="ad-block mb-3">
                <summary><i class="bi bi-gear"></i> Дополнительные опции</summary>
                <div class="ad-body">
                    <label class="form-label">Папка аккаунтов (пусто = все живые)</label>
                    <input type="text" class="form-control mb-2" id="boost-folder" placeholder="например: Аккаунты/Готовые">
                    <label class="ad-check"><input type="checkbox" id="boost-allow-restart"> <span>Разрешить перезапуск ботов<span class="ad-hint">Если у акка уже есть диалог с ботом — запустить /start повторно</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="boost-allow-revote"> <span>Разрешить переголосование в опросах<span class="ad-hint">Если акк уже голосовал — изменить голос</span></span></label>
                </div>
            </details>

            <div class="d-flex gap-2 mb-3">
                <button class="btn btn-accent" onclick="startBoost()" id="btn-boost-start">
                    <i class="bi bi-play-fill"></i> Запустить накрутку
                </button>
                <button class="btn btn-danger" onclick="stopBoost()" id="btn-boost-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="boost-status-label" class="text-xs text-muted tag-right"></span>
            </div>

            <!-- Прогресс -->
            <div id="boost-progress" style="display:none;margin-top:8px;">
                <div class="progress mb-2-x">
                    <div class="progress-bar" id="boost-progress-bar" style="width:0%;"></div>
                </div>
                <div style="font-size:0.74rem;color:var(--text-muted);" id="boost-progress-text">—</div>
            </div>
            <div id="boost-log" style="margin-top:10px;max-height:240px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;line-height:1.6;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Нейрокомменты (beta) ═══ -->
<div class="section" id="tab-neuro-comments">
    <div class="card mb-3">
        <div class="card-header">
            <i class="bi bi-chat-quote text-purple"></i>
            Нейрокомменты — комментарии под постами в каналах
        </div>
        <div class="card-body">
            <div class="info-box info-box--accent" style="margin-bottom:12px;font-size:0.7rem;line-height:1.55;">
                Аккаунты автоматически пишут осмысленные комменты под свежими постами в указанных каналах. Текст генерится AI по теме поста (нужен настроенный <a class="text-accent" href="javascript:showTab('settings')">AI ключ в Настройках</a>).
                <br><b>Защита:</b> один пост — макс N комментов от наших акков, рандомные паузы 2-15 мин между ними, лимит на акк/час и /день.
                <br><b>Условия:</b> у канала должны быть включены комментарии (есть discussion-группа). Аккаунты должны быть подписаны на канал (можно через инвайтер или модуль Подписка).
            </div>

            <label class="form-label">Каналы для комментирования (по одному на строку, @username или t.me/...)</label>
            <textarea class="form-control mb-3" id="nc-channels" rows="5" placeholder="@channel1&#10;@channel2&#10;t.me/channel3" style="font-size:0.78rem;font-family:monospace;"></textarea>

            <label class="form-label">Аккаунты-комментаторы</label>
            <div class="acc-selector mb-3" id="acc-selector-neuro-comments"></div>

            <details class="mb-3">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--text-muted);padding:6px 0;">
                    <i class="bi bi-sliders"></i> Тайминги и лимиты
                </summary>
                <div class="grid-2 mt-8">
                    <div>
                        <label class="form-label">Раз в сколько минут проверять каналы <span class="tt" data-tip="Как часто софт заходит в указанные каналы и смотрит новые посты. 5 = каждые 5 минут. Чаще = быстрее реагирует на свежие посты, но больше API-запросов и риск поймать FloodWait.">?</span></label>
                        <input type="number" class="form-control w-100px" id="nc-poll-interval" value="5" min="1" max="60">
                    </div>
                    <div>
                        <label class="form-label">Свежесть постов (мин) <span class="tt" data-tip="Посты старше этого возраста не комментируются — даже если их нашли при первом сканировании. 60 = только посты не старше часа. Комментарии под старыми постами выглядят неестественно.">?</span></label>
                        <input type="number" class="form-control w-100px" id="nc-recency" value="60" min="5" max="1440">
                        <div style="font-size:0.65rem;color:var(--text-muted);margin-top:2px;">Не комментировать посты старше</div>
                    </div>
                    <div>
                        <label class="form-label">Пауза между комментами (мин-макс) <span class="tt" data-tip="Пауза между двумя комментариями с одного акка (в минутах). Софт ждёт случайное число между «мин» и «макс». 2-15 = от 2 до 15 минут разброс — естественно для живого человека.">?</span></label>
                        <div class="row-gap-6" >
                            <input type="number" class="form-control w-70px" id="nc-delay-min" value="2" min="1" max="60">
                            <input type="number" class="form-control w-70px" id="nc-delay-max" value="15" min="2" max="120">
                        </div>
                    </div>
                    <div>
                        <label class="form-label">Макс комментов под одним постом <span class="tt" data-tip="Сколько разных аккаунтов оставят коммент под одним и тем же постом. 1 = на каждый пост — один коммент с одного акка. Больше 2-3 выглядит как накрутка.">?</span></label>
                        <input type="number" class="form-control w-100px" id="nc-per-post" value="1" min="1" max="5">
                    </div>
                    <div>
                        <label class="form-label">Лимит на акк / час <span class="tt" data-tip="Сколько комментариев максимум один акк может оставить за последний час. Скользящее окно: софт считает за каждые 60 минут отдельно. 5 — безопасно для живых акков.">?</span></label>
                        <input type="number" class="form-control w-100px" id="nc-per-hour" value="5" min="1" max="60">
                    </div>
                    <div>
                        <label class="form-label">Лимит на акк / день <span class="tt" data-tip="Дневной лимит комментариев с одного акка. 30 = акк перестанет комментировать после 30 за последние 24 часа. Сильная защита от спам-блока.">?</span></label>
                        <input type="number" class="form-control w-100px" id="nc-per-day" value="30" min="1" max="500">
                    </div>
                </div>
            </details>

            <details class="mb-3">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--text-muted);padding:6px 0;">
                    <i class="bi bi-megaphone"></i> CTA / реклама в комментах (опционально)
                </summary>
                <div class="mt-8" >
                    <label class="form-label">CTA-блок для AI</label>
                    <input type="text" class="form-control" id="nc-cta" placeholder="Например: 'если коммент органичен — упомяни канал @mychannel'">
                    <div style="font-size:0.65rem;color:var(--text-muted);margin-top:4px;line-height:1.5;">
                        Этот текст AI получит как доп-инструкцию. Если комментарий сильно по теме — AI вставит CTA органично, иначе проигнорирует. Без CTA — комменты чисто прогрев-стиль.
                    </div>
                </div>
            </details>

            <details class="mb-3">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--text-muted);padding:6px 0;">
                    <i class="bi bi-code"></i> Свой системный промпт (продвинутое)
                </summary>
                <div class="mt-8" >
                    <textarea class="form-control" id="nc-custom-prompt" rows="6" placeholder="Если пусто — используется стандартный промпт для русскоязычных комментов. Доступные плейсхолдеры: {persona}, {cta_block}." style="font-size:0.72rem;font-family:monospace;"></textarea>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Защита аккаунта</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="nc-pre-spam-check"> <span>Перед стартом проверить аккаунты на спам-блок</span></label>
                    <label class="ad-check"><input type="checkbox" id="nc-solve-captcha"> <span>Решать капчу-боты в discussion-чатах</span></label>
                    <label class="ad-check"><input type="checkbox" id="nc-keep-online"> <span>Держать аккаунт онлайн во время работы</span></label>
                    <label class="ad-check"><input type="checkbox" id="nc-read-msgs"> <span>Читать пост перед комментированием<span class="ad-hint">Имитация — открыть пост, прокрутить</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="nc-mark-read"> <span>Отмечать сообщения прочитанными</span></label>
                    <label class="ad-check"><input type="checkbox" id="nc-view-profile"> <span>Смотреть профиль автора поста</span></label>
                </div>
            </details>

            <div class="d-flex gap-2 align-center">
                <button class="btn btn-accent btn-sm" onclick="ncStart()" id="btn-nc-start">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-outline btn-sm" onclick="ncStop()" id="btn-nc-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="nc-status-label" class="text-xs text-muted" style="margin-left:8px;"></span>
            </div>

            <div id="nc-counters" style="margin-top:12px;display:none;font-size:0.75rem;line-height:1.7;color:var(--text-muted);"></div>
            <div id="nc-log" style="margin-top:8px;max-height:300px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Нейро-чаттер ═══ -->
<div class="section" id="tab-chatter">
    <div class="card mb-3">
        <div class="card-header">
            <i class="bi bi-chat-dots text-accent"></i>
            Нейро-чаттер — диалоги с аудиторией через AI
        </div>
        <div class="card-body">
            <div class="info-box info-box--accent" style="margin-bottom:12px;font-size:0.7rem;line-height:1.55;">
                Аккаунт ведёт живую переписку в ЛС: <b>проактив</b> — сам пишет первым по списку целей; <b>реактив</b> — отвечает на сообщения. Текст генерит AI (нужен настроенный <a class="text-accent" href="javascript:showTab('settings')">AI-ключ в Настройках</a>), с памятью диалога и имитацией человека (печатает, паузы, цитаты).
                <br><b>Только свои диалоги:</b> акк отвечает <u>только</u> тем, кому написал сам (или с кем уже есть переписка). Холодные входящие от чужих игнорируются — защита от ловушек, админов и спамеров.
                <br><b>Защита:</b> дневные/часовые лимиты на акк, PeerFlood → акк на 6ч в покой, без ссылок в сообщениях, только живые/прогретые акки.
            </div>

            <label class="form-label">Аккаунты-чаттеры (живые/прогретые)</label>
            <div class="acc-selector mb-3" id="acc-selector-chatter"></div>

            <label class="form-label">Цели для проактива (@username по одному на строку — из парсера/списка). Пусто = только реактив по уже существующим своим диалогам.</label>
            <textarea class="form-control mb-3" id="chatter-targets" rows="5" placeholder="@user1&#10;@user2&#10;@user3" style="font-size:0.78rem;font-family:monospace;"></textarea>

            <label class="form-label">Темы диалога (по одной на строку — AI выбирает случайную). Пусто = свободная беседа.</label>
            <textarea class="form-control mb-3" id="chatter-topics" rows="3" placeholder="работа&#10;выходные&#10;хобби" style="font-size:0.78rem;"></textarea>

            <details class="mb-3">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--text-muted);padding:6px 0;">
                    <i class="bi bi-sliders"></i> Тайминги и лимиты
                </summary>
                <div class="grid-2 mt-8">
                    <div>
                        <label class="form-label">Новых диалогов на акк / день <span class="tt" data-tip="Сколько НОВЫХ целей акк напишет первым за сутки (проактив). 8 — безопасно для прогретых. Холодные первые сообщения — самый рискованный момент, не задирай.">?</span></label>
                        <input type="number" class="form-control w-100px" id="chatter-seed-day" value="8" min="0" max="100">
                    </div>
                    <div>
                        <label class="form-label">Пауза между посевами (мин-макс, мин) <span class="tt" data-tip="Сколько ждать между отправкой первых сообщений новым целям с одного акка. 20-90 минут — естественный темп, не похожий на рассылку.">?</span></label>
                        <div class="row-gap-6">
                            <input type="number" class="form-control w-70px" id="chatter-seed-min" value="20" min="1" max="600">
                            <input type="number" class="form-control w-70px" id="chatter-seed-max" value="90" min="2" max="1440">
                        </div>
                    </div>
                    <div>
                        <label class="form-label">Ответов на акк / день <span class="tt" data-tip="Дневной лимит ответов с одного акка (реактив). 30 — безопасно. Защита от спам-блока при активной переписке.">?</span></label>
                        <input type="number" class="form-control w-100px" id="chatter-reply-day" value="30" min="1" max="500">
                    </div>
                    <div>
                        <label class="form-label">Ответов на акк / час <span class="tt" data-tip="Скользящий часовой лимит ответов с одного акка. 6 в час — живой человек не строчит без остановки.">?</span></label>
                        <input type="number" class="form-control w-100px" id="chatter-reply-hour" value="6" min="1" max="100">
                    </div>
                    <div>
                        <label class="form-label">Сообщений в один диалог / день <span class="tt" data-tip="Чтобы не задавить одного собеседника — максимум столько НАШИХ сообщений ему за сутки. 4 — нормальный темп переписки.">?</span></label>
                        <input type="number" class="form-control w-100px" id="chatter-dialog-day" value="4" min="1" max="50">
                    </div>
                </div>
            </details>

            <details class="mb-3">
                <summary style="cursor:pointer;font-size:0.78rem;color:var(--text-muted);padding:6px 0;">
                    <i class="bi bi-person-badge"></i> Персона и стиль (опционально)
                </summary>
                <div class="mt-8">
                    <label class="form-label">Персона (пусто = разная по акку автоматически)</label>
                    <input type="text" class="form-control mb-2" id="chatter-persona" placeholder="Например: парень 27, любит спорт и игры, разговорный стиль">
                    <label class="form-label">Свой системный промпт (продвинутое)</label>
                    <textarea class="form-control" id="chatter-prompt" rows="5" placeholder="Если пусто — стандартный промпт живого собеседника из СНГ. Плейсхолдеры: {persona}, {topic}." style="font-size:0.72rem;font-family:monospace;"></textarea>
                </div>
            </details>

            <details class="ad-block">
                <summary><i class="bi bi-shield-check"></i> Поведение и имитация</summary>
                <div class="ad-body">
                    <label class="ad-check"><input type="checkbox" id="chatter-typing" checked> <span>Показывать «печатает…» перед ответом<span class="ad-hint">+ задержка под длину текста</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="chatter-quote" checked> <span>Иногда отвечать цитатой (reply)</span></label>
                    <label class="ad-check"><input type="checkbox" id="chatter-nolinks" checked> <span>Никогда не отправлять ссылки<span class="ad-hint">Анти-спам-блок</span></span></label>
                    <label class="ad-check"><input type="checkbox" id="chatter-seed-enabled" checked> <span>Проактив (писать первым по целям)<span class="ad-hint">Выкл = только отвечать в своих диалогах</span></span></label>
                </div>
            </details>

            <div class="d-flex gap-2 align-center" style="margin-top:8px;">
                <button class="btn btn-accent btn-sm" onclick="startChatter()" id="btn-chatter-start">
                    <i class="bi bi-play-fill"></i> Запустить
                </button>
                <button class="btn btn-outline btn-sm" onclick="stopChatter()" id="btn-chatter-stop" style="display:none;">
                    <i class="bi bi-stop-fill"></i> Остановить
                </button>
                <span id="chatter-status-label" class="text-xs text-muted" style="margin-left:8px;"></span>
            </div>

            <div id="chatter-counters" style="margin-top:12px;display:none;font-size:0.75rem;line-height:1.7;color:var(--text-muted);"></div>
            <div id="chatter-log" style="margin-top:8px;max-height:300px;overflow:auto;font-size:0.7rem;font-family:monospace;background:var(--bg-input);padding:8px;border-radius:6px;display:none;"></div>
        </div>
    </div>
</div>

<!-- ═══ TAB: Поддержка ═══ -->
<div class="section" id="tab-support">
    <div class="card mb-3">
        <div class="card-header"><i class="bi bi-life-preserver text-accent"></i> Сообщить об ошибке или предложить улучшение</div>
        <div class="card-body">
            <div style="background:var(--surface-info-bg, #14223a);border:1px solid var(--surface-info-border, #1e3a5f);border-radius:8px;padding:12px;margin-bottom:16px;font-size:0.8rem;color:var(--accent-light);">
                <i class="bi bi-info-circle" style="margin-right:4px;"></i>
                Нашли баг или есть идея как сделать лучше — напишите здесь. Логи и версия прикрепятся автоматически.
                Для бага укажите модуль и что именно не так; для предложения — просто опишите идею.
            </div>

            <label class="form-label">Тип обращения</label>
            <select class="form-control mb-2" id="ticket-type" style="font-size:0.85rem;">
                <option value="bug">Баг / ошибка</option>
                <option value="idea">Предложение / идея</option>
                <option value="question">Вопрос</option>
            </select>

            <label class="form-label">Модуль</label>
            <select class="form-control mb-2" id="ticket-module" style="font-size:0.85rem;">
                <option value="">Выберите модуль</option>
                <option value="spam">Рассылка по чатам</option>
                <option value="dm">Личные сообщения (DM)</option>
                <option value="join">Подписка на чаты</option>
                <option value="multi">Мульти-аккаунт</option>
                <option value="parser">Парсинг юзеров</option>
                <option value="warmup">Прогрев аккаунтов</option>
                <option value="profiles">Заполнение профиля</option>
                <option value="autoreply">Автоответчик</option>
                <option value="inviter">Инвайтер</option>
                <option value="monitoring">Мониторинг чатов</option>
                <option value="analytics">Аналитика</option>
                <option value="cleanup">Очистка ТГ</option>
                <option value="boost">Накрутка</option>
                <option value="neurocomments">Нейрокомменты</option>
                <option value="activity">Имитация активности</option>
                <option value="accounts">Аккаунты</option>
                <option value="telegram">Telegram-просмотр</option>
                <option value="proxy">Прокси</option>
                <option value="settings">Настройки</option>
                <option value="update">Обновление</option>
                <option value="login">Авторизация/Лицензия</option>
                <option value="other">Другое</option>
            </select>

            <label class="form-label">Тема</label>
            <input type="text" class="form-control mb-2" id="ticket-subject" placeholder="Кратко: что не работает">

            <label class="form-label">Описание <span style="color:var(--text-muted);font-weight:normal;">— для бага необязательно, главное скриншот</span></label>
            <textarea class="form-control mb-2" id="ticket-body" rows="2" placeholder="Если на скрине не всё видно — пара слов (необязательно)"></textarea>

            <label class="form-label" style="font-weight:600;">Скриншот <span style="color:var(--danger);">(обязателен для бага — по нему и разбираем)</span></label>
            <div class="mb-3" >
                <label style="display:flex;align-items:center;gap:8px;padding:12px;border:2px dashed #252540;border-radius:10px;cursor:pointer;transition:border-color 0.2s;" onmouseover="this.style.borderColor='var(--accent)'" onmouseout="this.style.borderColor='#252540'">
                    <i class="bi bi-image" style="font-size:1.2rem;color:var(--accent-light);"></i>
                    <span style="font-size:0.82rem;color:var(--text-muted);">Нажмите чтобы прикрепить скриншот (PNG/JPG; для бага обязателен)</span>
                    <input type="file" id="ticket-screenshot" accept="image/*" style="display:none;" onchange="previewTicketImg(this)">
                </label>
                <div id="ticket-img-preview" style="display:none;margin-top:8px;position:relative;">
                    <img id="ticket-img-thumb" style="max-width:200px;max-height:150px;border-radius:8px;border:1px solid #252540;">
                    <button onclick="clearTicketImg()" data-tip="Удалить скриншот" style="position:absolute;top:-6px;right:-6px;background:var(--danger);border:none;border-radius:50%;width:20px;height:20px;color:#fff;font-size:0.7rem;cursor:pointer;display:flex;align-items:center;justify-content:center;"><i class="bi bi-x"></i></button>
                </div>
            </div>

            <div class="d-flex gap-2 flex-wrap">
                <button class="btn btn-accent btn-sm" onclick="sendTicket()" id="btn-send-ticket">
                    <i class="bi bi-send"></i> Отправить
                </button>
                <button class="btn btn-outline btn-sm" onclick="copyDiagInfo(this)" data-tip="Скопировать в буфер обмена техническую информацию для поддержки">
                    <i class="bi bi-clipboard-data"></i> Скопировать диагностику
                </button>
                <span class="text-xs text-muted self-center">Логи и версия прикрепляются автоматически</span>
            </div>
            <div id="ticket-result" style="display:none;margin-top:10px;font-size:0.82rem;"></div>
        </div>
    </div>
</div>

{% endblock %}

{% block extra_js %}
<script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
<script>
// ── Range sliders live update ──
document.querySelectorAll('.range-slider').forEach(function(s) {
    var valEl = document.getElementById('v-' + s.id.replace('s-', ''));
    if (valEl) {
        s.addEventListener('input', function() { valEl.textContent = s.value; });
    }
});

// ── Drop zone click (если есть) ──
(function(){
    var dz = document.getElementById('session-drop');
    var si = document.getElementById('session-input');
    if (dz && si) dz.addEventListener('click', function() { si.click(); });
})();

// ── Join links counter ──
(function(){
    var ta = document.getElementById('join-links');
    if (!ta) return;
    function updateCount() {
        var lines = ta.value.split('\n').filter(function(l) { return l.trim(); });
        var el = document.getElementById('join-count');
        var btn = document.getElementById('btn-join');
        if (el) el.textContent = lines.length;
        if (btn) btn.disabled = lines.length === 0;
    }
    ta.addEventListener('input', updateCount);
    ta.addEventListener('paste', function() { setTimeout(updateCount, 10); });
    ta.addEventListener('change', updateCount);
    ta.addEventListener('keyup', updateCount);
    updateCount();
})();

// ── Parser chat change ──
document.getElementById('parser-chat').addEventListener('change', function() {
    updateChatPreview();
});

// ── Init ──
refreshStatus();
</script>
{% endblock %}
