feat: offline in-browser "Ask MSOS" assistant (no API, zero cost)

A privacy-friendly help widget that answers visitor questions from the
site's own content and links to the full page — runs 100% in the browser,
no API, no server, no per-token cost.

- tools/build_search_index.py: parses every EN/MK/SI page into ~720
  heading-level chunks per language -> assistant/index-<lang>.json
  (lazy-loaded only when the chat is opened; gzips to ~80 KB).
- assistant.js: dependency-free BM25 search + multilingual stopword
  filtering + a curated short-answer layer for common questions, plus an
  accessible chat widget (role=dialog, keyboard, aria). CSP-safe (self only).
- assistant.css: scoped .msa-* styles in the site's teal palette;
  responsive (full-screen panel on mobile).
- Injected on 208 pages (blog WIP excluded; picks it up when that lands).

Verified in a headless browser across EN/MK/SI: curated answers, search
fallback with correct ranking (rare terms win), correct deep links,
Cyrillic + Slovene diacritics, and zero console errors. Curated MK/SI
answers are machine-drafted — proofread before launch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
popovskik 2026-08-04 01:29:22 +02:00
parent cca6fd18aa
commit f7f297bd65
214 changed files with 876 additions and 0 deletions

View File

@ -70,5 +70,7 @@
</p> </p>
</div> </div>
</main> </main>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

94
assistant.css Normal file
View File

@ -0,0 +1,94 @@
/* ==========================================================================
MSOS Assistant widget styles. All selectors are .msa-* scoped so they can't
collide with the site. Colours echo the site's teal accent.
========================================================================== */
.msa-root {
--msa-accent: #12707e;
--msa-accent-dark: #0d5560;
--msa-bg: #ffffff;
--msa-bot: #f1f5f6;
--msa-user: #12707e;
--msa-text: #16232a;
position: fixed;
right: 20px; bottom: 20px;
z-index: 9999;
font-family: inherit;
}
/* launcher */
.msa-launch {
display: inline-flex; align-items: center; gap: 8px;
background: var(--msa-accent); color: #fff;
border: 0; border-radius: 999px;
padding: 12px 18px; font-size: 15px; font-weight: 600;
cursor: pointer; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
transition: transform .15s ease, background .15s ease;
}
.msa-launch:hover { background: var(--msa-accent-dark); transform: translateY(-1px); }
.msa-launch i { font-size: 17px; }
.msa-open .msa-launch { display: none; }
/* panel */
.msa-panel {
position: absolute; right: 0; bottom: 0;
width: min(380px, calc(100vw - 32px));
height: min(560px, calc(100vh - 40px));
display: none; flex-direction: column;
background: var(--msa-bg); border-radius: 16px;
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28);
overflow: hidden;
}
.msa-open .msa-panel { display: flex; }
.msa-head {
display: flex; align-items: center; justify-content: space-between;
background: var(--msa-accent); color: #fff;
padding: 14px 16px; font-weight: 700; font-size: 16px;
}
.msa-x { background: none; border: 0; color: #fff; font-size: 26px; line-height: 1; cursor: pointer; padding: 0 4px; }
.msa-x:hover { opacity: .8; }
.msa-log {
flex: 1; overflow-y: auto; padding: 14px;
display: flex; flex-direction: column; gap: 10px;
background: #fafbfb;
}
.msa-msg { display: flex; }
.msa-bot { justify-content: flex-start; }
.msa-user { justify-content: flex-end; }
.msa-bubble {
max-width: 85%; padding: 10px 13px; border-radius: 14px;
font-size: 14.5px; line-height: 1.5; color: var(--msa-text);
background: var(--msa-bot); border-bottom-left-radius: 4px;
word-wrap: break-word;
}
.msa-user .msa-bubble {
background: var(--msa-user); color: #fff; border-radius: 14px; border-bottom-right-radius: 4px;
}
.msa-also { color: #5a6b72; font-size: 13px; }
.msa-link {
display: inline-block; margin-top: 6px;
color: var(--msa-accent); font-weight: 600; text-decoration: none;
}
.msa-link:hover { text-decoration: underline; }
.msa-form { display: flex; gap: 8px; padding: 10px; border-top: 1px solid #eceff0; background: #fff; }
.msa-input {
flex: 1; border: 1px solid #d6dcde; border-radius: 10px;
padding: 10px 12px; font-size: 14.5px; font-family: inherit; color: var(--msa-text);
}
.msa-input:focus { outline: 2px solid var(--msa-accent); outline-offset: -1px; border-color: var(--msa-accent); }
.msa-send {
background: var(--msa-accent); color: #fff; border: 0; border-radius: 10px;
width: 44px; cursor: pointer; font-size: 16px;
}
.msa-send:hover { background: var(--msa-accent-dark); }
.msa-foot { margin: 0; padding: 8px 12px; font-size: 11.5px; color: #8a979d; background: #fff; text-align: center; }
@media (max-width: 480px) {
.msa-root { right: 12px; bottom: 12px; }
.msa-panel { width: calc(100vw - 24px); height: calc(100vh - 24px); }
}
@media (prefers-reduced-motion: reduce) {
.msa-launch { transition: none; }
}

284
assistant.js Normal file
View File

@ -0,0 +1,284 @@
/* ==========================================================================
MSOS Assistant offline "find my answer" helper.
100% in-browser: no API, no server, no cost. Lazy-loads a small per-language
index and answers with a short snippet + a link to the full page.
Dependency-free so it stays CSP-safe (script-src 'self').
========================================================================== */
(function () {
"use strict";
var LANG = (document.documentElement.lang || "en").toLowerCase();
if (LANG === "sl") LANG = "si"; // site uses lang="sl", files use "si"
if (["en", "mk", "si"].indexOf(LANG) < 0) LANG = "en";
/* ---- localized UI strings ---- */
var UI = {
en: { title: "Ask MSOS", open: "Ask MSOS", placeholder: "Ask a question…",
send: "Send", close: "Close",
greeting: "Hi! 👋 Ask me anything about studying in Slovenia or MSOS and I'll point you to the right page.",
found: "Here's what I found:", more: "Read more",
none: "I couldn't find a clear answer. Try the Student Welcome Guide, or email info@msosorg.com.",
guideUrl: "/en/student-welcome-guide/", disclaimer: "Answers come straight from this website." },
mk: { title: "Прашај MSOS", open: "Прашај MSOS", placeholder: "Постави прашање…",
send: "Испрати", close: "Затвори",
greeting: "Здраво! 👋 Прашај ме било што за студирање во Словенија или за MSOS и ќе те упатам до вистинската страница.",
found: "Еве што најдов:", more: "Прочитај повеќе",
none: "Не најдов јасен одговор. Пробај го Водичот за студенти или пиши на info@msosorg.com.",
guideUrl: "/mk/student-welcome-guide/", disclaimer: "Одговорите доаѓаат директно од оваа страница." },
si: { title: "Vprašaj MSOS", open: "Vprašaj MSOS", placeholder: "Zastavi vprašanje…",
send: "Pošlji", close: "Zapri",
greeting: "Živjo! 👋 Vprašaj me karkoli o študiju v Sloveniji ali o MSOS in usmeril te bom na pravo stran.",
found: "Tole sem našel:", more: "Preberi več",
none: "Nisem našel jasnega odgovora. Poglej Vodnik za študente ali piši na info@msosorg.com.",
guideUrl: "/si/student-welcome-guide/", disclaimer: "Odgovori prihajajo neposredno s te spletne strani." }
}[LANG];
/* ---- curated short answers for common questions (checked before search).
EN is complete; MK/SI seed a few machine-drafted, PROOFREAD before launch.
Add more freely: {k:[keywords], a:"short answer", u:"/lang/page/"} ---- */
var INTENTS = {
en: [
{ k: ["residence", "permit", "temporary", "stay"], u: "/en/student-welcome-guide/student-residence-permit/",
a: "You apply for a temporary residence permit for study (usually before or right after arrival). It takes several documents and steps and is valid ~1 year, then renewed." },
{ k: ["visa"], u: "/en/student-welcome-guide/student-residence-permit/",
a: "Non-EU students generally need a residence permit for study rather than a short visa. See the residence-permit guide for the documents and steps." },
{ k: ["cost", "living", "expenses", "budget", "money", "rent"], u: "/en/get-to-know-slovenia/",
a: "Monthly living costs depend on your city and housing. The guide breaks down rent, food, transport and student discounts." },
{ k: ["accommodation", "housing", "dorm", "apartment", "room", "student home"], u: "/en/student-welcome-guide/student-accommodation/",
a: "You can look at student dorms and private rentals. The accommodation guide explains how and where to search." },
{ k: ["english", "slovene", "slovenian", "language"], u: "/en/student-welcome-guide/",
a: "Some programmes are in English; many are in Slovene. Learning basic Slovene helps a lot with daily life and admin." },
{ k: ["work", "job", "part-time", "student work"], u: "/en/student-welcome-guide/",
a: "Students can work part-time through student work ('študentsko delo'). The guide covers how it works alongside studies." },
{ k: ["boni", "benefits", "discount", "meal", "subsidised"], u: "/en/student-welcome-guide/",
a: "Students get subsidised meals ('boni') and many discounts. See the guide for how to register and use them." },
{ k: ["tuition", "fees", "scholarship", "funding", "ad futura"], u: "/en/student-welcome-guide/application-deadlines/",
a: "Tuition varies by programme and status; scholarships like Ad Futura exist. Check deadlines and funding in the guide." },
{ k: ["bank", "account", "iban"], u: "/en/blog/how-to-open-slovenian-bank-account/",
a: "Opening a Slovenian bank account is straightforward with your documents. The blog post walks through it step by step." },
{ k: ["enrol", "enrolment", "evš", "evs", "apply", "application", "admission"], u: "/en/student-welcome-guide/evs-application-guide/",
a: "You apply through the eVŠ portal. The eVŠ guide shows exactly how to submit your application." },
{ k: ["arrival", "checklist", "first", "when i arrive", "moving"], u: "/en/student-welcome-guide/arrival-checklist/",
a: "There's a first-weeks arrival checklist (registration, permit, bank, health, etc.) to keep you on track." },
{ k: ["member", "join", "membership", "become"], u: "/en/become-a-member/",
a: "You can join in a couple of minutes — students and supporters both welcome. Use the Become a member form." },
{ k: ["support", "donate", "donation", "sponsor", "help"], u: "/en/support/",
a: "You can support MSOS by bank transfer, sponsorship or partnership. See the Support page for details." },
{ k: ["contact", "email", "reach", "get in touch"], u: "/en/legal/",
a: "You can reach MSOS at info@msosorg.com. Official details are on the Official information page." }
],
mk: [
{ k: ["дозвол", "престој", "виза"], u: "/mk/student-welcome-guide/student-residence-permit/",
a: "Аплицираш за дозвола за привремен престој за студирање. Потребни се неколку документи и чекори; важи околу 1 година." },
{ k: ["член", "зачлен", "приклуч"], u: "/mk/become-a-member/",
a: "Можеш да се зачлениш за неколку минути — добредојдени се и студенти и поддржувачи." },
{ k: ["поддрш", "донац", "донир"], u: "/mk/support/",
a: "Можеш да го поддржиш MSOS преку банкарски трансфер, спонзорство или партнерство. Види ја страницата Поддршка." },
{ k: ["сместув", "стан", "дом"], u: "/mk/student-welcome-guide/student-accommodation/",
a: "Можеш да бараш студентски домови или приватно сместување. Водичот објаснува како и каде." },
{ k: ["контакт", "е-пошта", "мејл"], u: "/mk/legal/",
a: "Контактирај го MSOS на info@msosorg.com. Официјалните податоци се на страницата Официјални информации." }
],
si: [
{ k: ["dovoljenje", "prebivanje", "vizum", "bivanje"], u: "/si/student-welcome-guide/student-residence-permit/",
a: "Zaprosiš za dovoljenje za začasno prebivanje zaradi študija. Potrebnih je nekaj dokumentov in korakov; velja približno 1 leto." },
{ k: ["član", "včlan", "pridruž"], u: "/si/become-a-member/",
a: "Včlaniš se lahko v nekaj minutah — dobrodošli so študenti in podporniki." },
{ k: ["podpri", "donacij", "donir"], u: "/si/support/",
a: "MSOS lahko podpreš z bančnim nakazilom, sponzorstvom ali partnerstvom. Glej stran Podpri." },
{ k: ["nastanit", "stanovanje", "dom", "soba"], u: "/si/student-welcome-guide/student-accommodation/",
a: "Iščeš lahko študentske domove ali zasebne najeme. Vodnik pojasni, kako in kje." },
{ k: ["kontakt", "e-pošta", "mail"], u: "/si/legal/",
a: "MSOS dosežeš na info@msosorg.com. Uradni podatki so na strani Uradni podatki." }
]
}[LANG] || [];
/* ---- text normalization: lowercase + fold Latin diacritics (čc),
keep Cyrillic. Tokenize on non-letter/digit (Unicode-aware). ---- */
function norm(s) {
s = (s || "").toLowerCase();
try { s = s.normalize("NFD").replace(/[̀-ͯ]/g, ""); } catch (e) {}
return s;
}
function tokens(s) {
var out = [], m = norm(s).match(/[\p{L}\p{N}]+/gu);
if (m) for (var i = 0; i < m.length; i++) if (m[i].length > 1) out.push(m[i]);
return out;
}
// Question/filler words in EN + MK + SI; removed from queries so the
// meaningful terms (e.g. "ohrid", "permit") drive the ranking.
var STOP = (function () {
var w = ("the a an of to in on for and or is are be was were do does did how what " +
"when where why who which can could would should will my your our we they it this " +
"that these those with at as by from about into over out up down me you i us them " +
"have has had need want please get got give tell show find help hi hello hey thanks " +
"kako kaj kje kdaj zakaj kdo kateri ali je so bo bi na za in ali da li mi me ti to ta " +
"te tega se z s v iz pri od do imam imate zelim moram lahko prosim zivjo pozdravljeni " +
"kako sto dali koi koga kade zosto koj koja e se na vo za i ili so da li mi me ti nie " +
"toa ova imam sakam treba moze prosim zdravo ").split(/\s+/);
var o = {}; for (var i = 0; i < w.length; i++) if (w[i]) o[w[i]] = 1; return o;
})();
/* ---- tiny BM25 search over the lazily-loaded index ---- */
var INDEX = null, DF = null, AVGLEN = 0, ready = false, loading = false;
function loadIndex() {
if (ready || loading) return Promise.resolve();
loading = true;
return fetch("/assistant/index-" + LANG + ".json")
.then(function (r) { return r.json(); })
.then(function (data) {
INDEX = data; DF = {}; var total = 0;
for (var i = 0; i < INDEX.length; i++) {
var c = INDEX[i];
c._t = tokens(c.x + " " + c.h + " " + c.t);
c._len = c._t.length; total += c._len;
var seen = {};
for (var j = 0; j < c._t.length; j++) {
var w = c._t[j];
if (!seen[w]) { seen[w] = 1; DF[w] = (DF[w] || 0) + 1; }
}
}
AVGLEN = total / Math.max(INDEX.length, 1);
ready = true; loading = false;
})
.catch(function () { loading = false; });
}
function search(query, k) {
if (!ready) return [];
var q0 = tokens(query); if (!q0.length) return [];
var N = INDEX.length, k1 = 1.5, b = 0.75, scored = [];
// Drop stopwords + very common terms so rare, meaningful words win.
var q = q0.filter(function (t) { return !STOP[t] && (!DF[t] || DF[t] / N <= 0.4); });
if (!q.length) q = q0.filter(function (t) { return !STOP[t]; });
if (!q.length) q = q0;
for (var i = 0; i < N; i++) {
var c = INDEX[i], score = 0, tf = {};
for (var j = 0; j < c._t.length; j++) tf[c._t[j]] = (tf[c._t[j]] || 0) + 1;
for (var t = 0; t < q.length; t++) {
var term = q[t], f = tf[term]; if (!f) continue;
var idf = Math.log(1 + (N - DF[term] + 0.5) / (DF[term] + 0.5));
score += idf * (f * (k1 + 1)) / (f + k1 * (1 - b + b * c._len / AVGLEN));
}
// boost when the query hits the heading/title
var hn = norm(c.h + " " + c.t);
for (var h = 0; h < q.length; h++) if (hn.indexOf(q[h]) >= 0) score += 0.6;
if (score > 0) scored.push([score, c]);
}
scored.sort(function (a, b) { return b[0] - a[0]; });
return scored.slice(0, k || 3).map(function (s) { return s[1]; });
}
function matchIntent(query) {
var q = norm(query), best = null, bestHits = 0;
for (var i = 0; i < INTENTS.length; i++) {
var hits = 0;
for (var j = 0; j < INTENTS[i].k.length; j++)
if (q.indexOf(norm(INTENTS[i].k[j])) >= 0) hits++;
if (hits > bestHits) { bestHits = hits; best = INTENTS[i]; }
}
return bestHits > 0 ? best : null;
}
/* ---- snippet: ~180 chars of a chunk, trimmed to a sentence ---- */
function snippet(c) {
var x = c.x;
var lead = c.h && x.indexOf(c.h) === 0 ? x.slice(c.h.length).replace(/^[.\s]+/, "") : x;
if (lead.length > 200) lead = lead.slice(0, 200).replace(/\s+\S*$/, "") + "…";
return lead;
}
/* ========================= UI ========================= */
var esc = function (s) { return String(s == null ? "" : s)
.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
.replace(/"/g, "&quot;").replace(/'/g, "&#39;"); };
var root, panel, log, input, launch, opened = false;
function bubble(text, who, extraHTML) {
var b = document.createElement("div");
b.className = "msa-msg msa-" + who;
b.innerHTML = '<div class="msa-bubble">' + text + (extraHTML || "") + "</div>";
log.appendChild(b);
log.scrollTop = log.scrollHeight;
return b;
}
function answer(query) {
bubble(esc(query), "user");
var typing = bubble("…", "bot");
Promise.resolve(ready ? null : loadIndex()).then(function () {
typing.remove();
var intent = matchIntent(query);
var hits = search(query, 3);
if (intent) {
var extra = '<a class="msa-link" href="' + esc(intent.u) + '">' + esc(UI.more) + ' →</a>';
bubble(esc(intent.a), "bot", extra);
// offer one more related page from search if different
var extraHit = hits.filter(function (c) { return c.u !== intent.u; })[0];
if (extraHit) bubble('<span class="msa-also">' + esc(UI.found) + '</span> ' +
esc(extraHit.h) + ' <a class="msa-link" href="' + esc(extraHit.u) + '">' + esc(UI.more) + ' →</a>', "bot");
return;
}
if (hits.length) {
bubble('<span class="msa-also">' + esc(UI.found) + '</span>', "bot");
hits.forEach(function (c) {
bubble('<strong>' + esc(c.h) + '</strong><br>' + esc(snippet(c)) +
'<br><a class="msa-link" href="' + esc(c.u) + '">' + esc(UI.more) + ' →</a>', "bot");
});
} else {
bubble(esc(UI.none) + ' <a class="msa-link" href="' + esc(UI.guideUrl) + '">' + esc(UI.more) + ' →</a>', "bot");
}
});
}
function open() {
opened = true; root.classList.add("msa-open");
panel.setAttribute("aria-hidden", "false");
launch.setAttribute("aria-expanded", "true");
loadIndex();
if (!log.childNodes.length) bubble(esc(UI.greeting), "bot");
setTimeout(function () { input.focus(); }, 50);
}
function close() {
opened = false; root.classList.remove("msa-open");
panel.setAttribute("aria-hidden", "true");
launch.setAttribute("aria-expanded", "false");
launch.focus();
}
function submit() {
var q = input.value.trim(); if (!q) return;
input.value = ""; answer(q);
}
function build() {
root = document.createElement("div");
root.className = "msa-root"; root.setAttribute("data-msa", "1");
root.innerHTML =
'<button class="msa-launch" aria-expanded="false" aria-controls="msa-panel" aria-label="' + esc(UI.open) + '">' +
'<i class="fas fa-comment-dots" aria-hidden="true"></i><span>' + esc(UI.open) + '</span></button>' +
'<section class="msa-panel" id="msa-panel" role="dialog" aria-label="' + esc(UI.title) + '" aria-hidden="true">' +
'<header class="msa-head"><span>' + esc(UI.title) + '</span>' +
'<button class="msa-x" aria-label="' + esc(UI.close) + '">&times;</button></header>' +
'<div class="msa-log" role="log" aria-live="polite"></div>' +
'<form class="msa-form"><input class="msa-input" type="text" autocomplete="off" ' +
'placeholder="' + esc(UI.placeholder) + '" aria-label="' + esc(UI.placeholder) + '">' +
'<button class="msa-send" type="submit" aria-label="' + esc(UI.send) + '"><i class="fas fa-paper-plane" aria-hidden="true"></i></button>' +
'</form>' +
'<p class="msa-foot">' + esc(UI.disclaimer) + '</p>' +
'</section>';
document.body.appendChild(root);
panel = root.querySelector(".msa-panel");
log = root.querySelector(".msa-log");
input = root.querySelector(".msa-input");
launch = root.querySelector(".msa-launch");
launch.addEventListener("click", function () { opened ? close() : open(); });
root.querySelector(".msa-x").addEventListener("click", close);
root.querySelector(".msa-form").addEventListener("submit", function (e) { e.preventDefault(); submit(); });
document.addEventListener("keydown", function (e) { if (e.key === "Escape" && opened) close(); });
}
if (document.readyState !== "loading") build();
else document.addEventListener("DOMContentLoaded", build);
})();

1
assistant/index-en.json Normal file

File diff suppressed because one or more lines are too long

1
assistant/index-mk.json Normal file

File diff suppressed because one or more lines are too long

1
assistant/index-si.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -422,5 +422,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -607,5 +607,7 @@
<script src="../../main.js"></script> <script src="../../main.js"></script>
<script src="../../member-form.js"></script> <script src="../../member-form.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -314,5 +314,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -529,5 +529,7 @@
</footer> </footer>
<!-- END_FOOTER --> <!-- END_FOOTER -->
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -382,5 +382,7 @@
</footer> </footer>
<!-- END_FOOTER --> <!-- END_FOOTER -->
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -391,5 +391,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -397,5 +397,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -364,5 +364,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -397,5 +397,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -389,5 +389,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -379,5 +379,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -376,5 +376,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -381,5 +381,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -364,5 +364,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -377,5 +377,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -371,5 +371,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -398,5 +398,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -383,5 +383,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -354,5 +354,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -530,5 +530,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../main.js"></script> <script src="../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -289,5 +289,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -406,5 +406,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -469,5 +469,7 @@
<script src="../../main.js"></script> <script src="../../main.js"></script>
<script src="../../news-filter.js"></script> <script src="../../news-filter.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -295,5 +295,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -357,5 +357,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -378,5 +378,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -320,5 +320,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -331,5 +331,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -425,5 +425,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -412,5 +412,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -436,5 +436,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -439,5 +439,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -398,5 +398,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -360,5 +360,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -346,5 +346,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -358,5 +358,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -355,5 +355,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -356,5 +356,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -353,5 +353,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -371,5 +371,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -383,5 +383,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -374,5 +374,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -399,5 +399,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -348,5 +348,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -366,5 +366,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -409,5 +409,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -513,5 +513,7 @@
<script src="../../main.js"></script> <script src="../../main.js"></script>
<script src="../../student-guide.js"></script> <script src="../../student-guide.js"></script>
<script src="../../guide-feedback.js"></script> <script src="../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -360,5 +360,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -432,5 +432,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -261,5 +261,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../my-route.js"></script> <script src="../../../my-route.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -387,5 +387,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -404,5 +404,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -349,5 +349,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -358,5 +358,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -398,5 +398,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -398,5 +398,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -368,5 +368,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -356,5 +356,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -393,5 +393,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -410,5 +410,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -377,5 +377,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -351,5 +351,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -383,5 +383,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -353,5 +353,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -380,5 +380,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -347,5 +347,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -418,5 +418,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<script src="../../../guide-feedback.js"></script> <script src="../../../guide-feedback.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -423,5 +423,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -503,5 +503,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -422,5 +422,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -607,5 +607,7 @@
<script src="../../main.js"></script> <script src="../../main.js"></script>
<script src="../../member-form.js"></script> <script src="../../member-form.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -314,5 +314,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -529,5 +529,7 @@
</footer> </footer>
<!-- END_FOOTER --> <!-- END_FOOTER -->
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -382,5 +382,7 @@
</footer> </footer>
<!-- END_FOOTER --> <!-- END_FOOTER -->
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -391,5 +391,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -397,5 +397,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -364,5 +364,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -397,5 +397,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -389,5 +389,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -379,5 +379,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -376,5 +376,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -381,5 +381,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -364,5 +364,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -377,5 +377,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -367,5 +367,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -398,5 +398,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -383,5 +383,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -354,5 +354,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -533,5 +533,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../main.js"></script> <script src="../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -289,5 +289,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -406,5 +406,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -469,5 +469,7 @@
<script src="../../main.js"></script> <script src="../../main.js"></script>
<script src="../../news-filter.js"></script> <script src="../../news-filter.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -295,5 +295,7 @@
<script src="../../../main.js"></script> <script src="../../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

View File

@ -357,5 +357,7 @@
<!-- END_FOOTER --> <!-- END_FOOTER -->
<script src="../../main.js"></script> <script src="../../main.js"></script>
<link rel="stylesheet" href="/assistant.css">
<script src="/assistant.js" defer></script>
</body> </body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More