From 4a5e1f889cdb52805c30c0018ba3d85b276d6ff7 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 1 Dec 2020 21:11:00 +0100 Subject: [PATCH 01/10] Update issue templates to use the new labels Signed-off-by: David Mehren (cherry picked from commit eb727810b5a7f08dd9e5d9cf7a90d8c17600e19f) --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/enhancement_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/ISSUE_TEMPLATE/question---other.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8de6e3bed..1736721bb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve HedgeDoc. title: '' -labels: 'bug' +labels: 'type: bug' assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.md b/.github/ISSUE_TEMPLATE/enhancement_request.md index 3d7af9274..dee13b03c 100644 --- a/.github/ISSUE_TEMPLATE/enhancement_request.md +++ b/.github/ISSUE_TEMPLATE/enhancement_request.md @@ -2,7 +2,7 @@ name: Enhancement request about: Suggest an enhancement of an existing feature. title: '' -labels: 'enhancement' +labels: 'type: enhancement' assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 98ef5148f..8a861a4a8 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest a new feature for this project, which isn't existing yet. title: '' -labels: 'feature request' +labels: 'type: feature' assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/question---other.md b/.github/ISSUE_TEMPLATE/question---other.md index 757ba1824..36fd33363 100644 --- a/.github/ISSUE_TEMPLATE/question---other.md +++ b/.github/ISSUE_TEMPLATE/question---other.md @@ -2,7 +2,7 @@ name: Question / Other about: Questions about the project, features, or organziational issues title: '' -labels: question +labels: 'type: question' assignees: '' --- From 28f3580e9e13acc7de60ad6e5763d547e3028be0 Mon Sep 17 00:00:00 2001 From: Philip Molares Date: Sat, 21 Nov 2020 16:48:18 +0100 Subject: [PATCH 02/10] Link to the contribution documentation explicitly Co-authored-by: David Mehren Signed-off-by: Philip Molares (cherry picked from commit c7def38ba4fb4b5bcbee5a75f3f38d9f0f6e6a02) Signed-off-by: David Mehren --- .github/pull_request_template.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index fbc61e54b..bc03d58c8 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,12 +6,13 @@ This PR fixes/adds/improves/... ### Steps - + -- [ ] added implementation -- [ ] added / updated tests -- [ ] added / updated documentation -- [ ] extended changelog +- [ ] Added implementation +- [ ] Added / updated tests +- [ ] Added / updated documentation +- [ ] I read the [contribution documentation](https://github.com/hedgedoc/hedgedoc/blob/develop/CONTRIBUTING.md) and + signed-off my commits to accept the DCO. ### Related Issue(s) From 0ffe7d155c4f9cd53d40c3b3921a728f27784b2a Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 5 Jan 2021 20:24:49 +0100 Subject: [PATCH 03/10] Delete translation files We only translate the frontend, so these are not needed anymore in the backend. Signed-off-by: David Mehren --- locales/ar.json | 122 --------------------------------------------- locales/ca.json | 122 --------------------------------------------- locales/cs.json | 121 -------------------------------------------- locales/da.json | 104 -------------------------------------- locales/de.json | 122 --------------------------------------------- locales/el.json | 104 -------------------------------------- locales/en.json | 122 --------------------------------------------- locales/eo.json | 104 -------------------------------------- locales/es.json | 122 --------------------------------------------- locales/fr.json | 122 --------------------------------------------- locales/hi.json | 104 -------------------------------------- locales/hr.json | 104 -------------------------------------- locales/id.json | 122 --------------------------------------------- locales/it.json | 122 --------------------------------------------- locales/ja.json | 122 --------------------------------------------- locales/ko.json | 117 ------------------------------------------- locales/nl.json | 122 --------------------------------------------- locales/pl.json | 122 --------------------------------------------- locales/pt.json | 122 --------------------------------------------- locales/ru.json | 122 --------------------------------------------- locales/sk.json | 122 --------------------------------------------- locales/sr.json | 121 -------------------------------------------- locales/sv.json | 122 --------------------------------------------- locales/tr.json | 104 -------------------------------------- locales/uk.json | 104 -------------------------------------- locales/vi.json | 121 -------------------------------------------- locales/zh-CN.json | 122 --------------------------------------------- locales/zh-TW.json | 122 --------------------------------------------- 28 files changed, 3282 deletions(-) delete mode 100644 locales/ar.json delete mode 100644 locales/ca.json delete mode 100644 locales/cs.json delete mode 100644 locales/da.json delete mode 100644 locales/de.json delete mode 100644 locales/el.json delete mode 100644 locales/en.json delete mode 100644 locales/eo.json delete mode 100644 locales/es.json delete mode 100644 locales/fr.json delete mode 100644 locales/hi.json delete mode 100644 locales/hr.json delete mode 100644 locales/id.json delete mode 100644 locales/it.json delete mode 100644 locales/ja.json delete mode 100644 locales/ko.json delete mode 100644 locales/nl.json delete mode 100644 locales/pl.json delete mode 100644 locales/pt.json delete mode 100644 locales/ru.json delete mode 100644 locales/sk.json delete mode 100644 locales/sr.json delete mode 100644 locales/sv.json delete mode 100644 locales/tr.json delete mode 100644 locales/uk.json delete mode 100644 locales/vi.json delete mode 100644 locales/zh-CN.json delete mode 100644 locales/zh-TW.json diff --git a/locales/ar.json b/locales/ar.json deleted file mode 100644 index 88186f2d3..000000000 --- a/locales/ar.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "ملاحظات ماركداون تعاونية", - "Realtime collaborative markdown notes on all platforms.": "Collaborate on markdown notes on all platforms in realtime.", - "Best way to write and share your knowledge in markdown.": "The best platform to write and share markdown.", - "Intro": "مُقدِّمة", - "History": "التاريخ", - "New guest note": "ملاحظة ضيف جديد", - "Collaborate with URL": "Real time collaboration", - "Support charts and MathJax": "دعم المنحنيات البيانية و MathJax", - "Support slide mode": "دعم الشرائح التقديمية", - "Sign In": "لِج", - "Below is the history from browser": "Below is history from this browser", - "Welcome!": "أهلا بك!", - "New note": "ملاحظة جديدة", - "or": "أو", - "Sign Out": "خروج", - "Explore all features": "استكشف جميع الميزات", - "Select tags...": "اختر كلمات مفتاحية...", - "Search keyword...": "البحث عن كلمة مفتاحية...", - "Sort by title": "الترتيب حسب العنوان", - "Title": "العنوان", - "Sort by time": "فرز حسب الوقت", - "Time": "الزمن", - "Export history": "تصدير التاريخ", - "Import history": "استيراد التاريخ", - "Clear history": "مسح التاريخ", - "Refresh history": "حدث التاريخ", - "No history": "No history", - "Import from browser": "استيراد من المتصفح", - "Releases": "إصدارات", - "Are you sure?": "هل أنت واثق؟", - "Do you really want to delete this note?": "هل تريد حقًا حذف هذه الملاحظة؟", - "All users will lose their connection.": "سيفقد جميع المستخدمين اتصالهم.", - "Cancel": "إلغاء", - "Yes, do it!": "Yes, do it!", - "Choose method": "اختر الطريقة", - "Sign in via %s": "لِج عبر %s", - "New": "جديد", - "Publish": "انشر", - "Extra": "إضافي", - "Revision": "مراجعة", - "Slide Mode": "نمط الشرائح التقديمية", - "Export": "تصدير", - "Import": "استيراد", - "Clipboard": "الحافظة", - "Download": "تنزيل", - "Raw HTML": "Raw HTML", - "Edit": "عدّل", - "View": "عرض", - "Both": "معا", - "Help": "المساعدة", - "Upload Image": "تحميل صورة", - "Menu": "القائمة", - "This page need refresh": "هذه الصفحة بحاجة إلى تحديث", - "You have an incompatible client version.": "نسخة العميل غير متوافقة ", - "Refresh to update.": "حدث الصفحة للحصول على التحديث", - "New version available!": "نسخة جديدة متوفرة", - "See releases notes here": "إطلع على ملاحضة الاصدار هنا ", - "Refresh to enjoy new features.": "حدث الصفحة لتستمتع بالمميزات الجديدة", - "Your user state has changed.": "لقد تغيرت حالة المستخدم الخاصة بك.", - "Refresh to load new user state.": "قم بتحديث الصفحة لتحميل حالة المستخدم الجديدة.", - "Refresh": "تحديث", - "Contacts": "جهات الاتصال", - "Report an issue": "بلغ عن خطأ", - "Meet us on %s": "قابِلنا في %s", - "Send us email": "أرسل لنا بريدا إلكترونيا", - "Documents": "المستندات", - "Features": "المميزات", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Slide Example", - "Cheatsheet": "Cheatsheet", - "Example": "مثال", - "Syntax": "Syntax", - "Header": "الترويسة", - "Unordered List": "قائمة غير مرتبة", - "Ordered List": "قائمة مرتبة", - "Todo List": "Checklist", - "Blockquote": "Blockquote", - "Bold font": "خط غامق", - "Italics font": "خط مائل", - "Strikethrough": "Strikethrough", - "Inserted text": "نص مُسَطَّر", - "Marked text": "نص بارز", - "Link": "الرابط", - "Image": "صورة", - "Code": "الشفرة", - "Externals": "Externals", - "This is a alert area.": "This is an alert area.", - "Revert": "تراجع", - "Import from clipboard": "استيراد من الحافظة", - "Paste your markdown or webpage here...": "Paste your markdown or webpage here…", - "Clear": "امسح", - "This note is locked": "هذه الملاحظة مقفلة", - "Sorry, only owner can edit this note.": "آسف ، يمكن للمالك فقط تعديل هذه الملاحظة.", - "OK": "حسنا", - "Reach the limit": "Reach the limit", - "Sorry, you've reached the max length this note can be.": "عذرًا ، لقد بلغت الحد الأقصى لطول هذه الملاحظة.", - "Please reduce the content or divide it to more notes, thank you!": "الرجاء قصر هذه الملاحظة", - "Import from Gist": "استيراد من Gist", - "Paste your gist url here...": "الصق عنوان url الخاص بك هنا...", - "Import from Snippet": "استرداد من سنيبت", - "Select From Available Projects": "اختر من بين المشاريع المتاحة", - "Select From Available Snippets": "اختر من بين المقتطفات المتاحة", - "OR": "أو", - "Export to Snippet": "صدر إلى سنيبت", - "Select Visibility Level": "حدد مستوى الرؤية", - "Night Theme": "الوضع الليلي", - "Follow us on %s and %s.": "تابِعنا على %s و %s.", - "Privacy": "الخصوصية", - "Terms of Use": "شروط الاستخدام", - "Do you really want to delete your user account?": "هل تريد حقًا حذف حسابك؟", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "سيؤدي هذا إلى حذف حسابك ، وجميع الملاحظات التي تملكها وإزالة جميع الإشارات إلى حسابك من الملاحظات الأخرى.", - "Delete user": "احذف المستخدم", - "Export user data": "تصدير بيانات المستخدم", - "Help us translating on %s": "ساعدنا في الترجمة على %s", - "Source Code": "الشفرة المصدرية", - "Register": "انشئ حسابا", - "Powered by %s": "مدعوم بـ %s", - "Help us translating": "ساعدنا في الترجمة", - "Join the community": "انضم إلى المجتمع", - "Imprint": "Imprint" -} \ No newline at end of file diff --git a/locales/ca.json b/locales/ca.json deleted file mode 100644 index 13520cb03..000000000 --- a/locales/ca.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Notes col·laboratives a Markdown", - "Realtime collaborative markdown notes on all platforms.": "Notes col·laboratives a Markdown per a totes les plataformes.", - "Best way to write and share your knowledge in markdown.": "La millor forma d'escriure i compartir el teu coneixement a Markdown.", - "Intro": "Introducció", - "History": "Història", - "New guest note": "Nova nota com a convidat", - "Collaborate with URL": "Col·laborar a través de URL", - "Support charts and MathJax": "Soport per a gràfics i MathJax", - "Support slide mode": "Soport per a diapositives", - "Sign In": "Entrar", - "Below is the history from browser": "A continuació es mostra l'historial del navegador", - "Welcome!": "Benvingut!", - "New note": "Nova nota", - "or": "o", - "Sign Out": "Sortir", - "Explore all features": "Explorar totes les funcions", - "Select tags...": "Seleccionar etiquetes...", - "Search keyword...": "Buscar paraules clau...", - "Sort by title": "Ordenar per títol", - "Title": "Títol", - "Sort by time": "Ordenar per hora", - "Time": "Tiempo", - "Export history": "Exportar historial", - "Import history": "Importar historial", - "Clear history": "Borrar historial", - "Refresh history": "Actualitzar historial", - "No history": "Cap historial", - "Import from browser": "Importar del navegador", - "Releases": "Versions", - "Are you sure?": "Estas segur?", - "Do you really want to delete this note?": "Estàs segur que vols eliminar aquesta nota?", - "All users will lose their connection.": "Tots els usuaris perdran la seva connexió.", - "Cancel": "Cancel·lar", - "Yes, do it!": "Si, fes-ho!", - "Choose method": "Triar mètode", - "Sign in via %s": "Entrar a través de %s", - "New": "Nou", - "Publish": "Publicar", - "Extra": "Extra", - "Revision": "Revisió", - "Slide Mode": "Mode presentació", - "Export": "Exportar", - "Import": "Importar", - "Clipboard": "Portapapers", - "Download": "Descarregar", - "Raw HTML": "HTML pur", - "Edit": "Editar", - "View": "Veure", - "Both": "Ambdós", - "Help": "Ajuda", - "Upload Image": "Pujar imatge", - "Menu": "Menú", - "This page need refresh": "Aquesta pàgina necessita ser refrescada", - "You have an incompatible client version.": "Tens una versió del client incompatible.", - "Refresh to update.": "Refrescar per actualitzar", - "New version available!": "Nova versió disponible!", - "See releases notes here": "Veure les notes de publicació aquí", - "Refresh to enjoy new features.": "Actualitzar per fer servir les noves funcions.", - "Your user state has changed.": "L'estat del teu usuari ha canviat.", - "Refresh to load new user state.": "Refrescar per actualitzar l'estat del teu usuari.", - "Refresh": "Refrescar", - "Contacts": "Contactes", - "Report an issue": "Reportar un problema", - "Meet us on %s": "Coneix-nos a %s", - "Send us email": "Enviar-nos un email", - "Documents": "Documents", - "Features": "Funcions", - "YAML Metadata": "Metadades de YAML", - "Slide Example": "Exemple de diapositiva", - "Cheatsheet": "Ajudamemories", - "Example": "Exemple", - "Syntax": "Sintaxis", - "Header": "Capçelera", - "Unordered List": "Llista desordenada", - "Ordered List": "Llista ordenada", - "Todo List": "Llista de tasques", - "Blockquote": "Bloc de cita", - "Bold font": "Font negreta", - "Italics font": "Font itàlica", - "Strikethrough": "Ratllat", - "Inserted text": "Text subrallat", - "Marked text": "Text marcat", - "Link": "Enllaç", - "Image": "Imatge", - "Code": "Codi", - "Externals": "Externs", - "This is a alert area.": "Això és una àrea d'alerta.", - "Revert": "Revertir", - "Import from clipboard": "Importar del portapapers", - "Paste your markdown or webpage here...": "Enganxa la teva markdown o pàgina web aquí...", - "Clear": "Netejar", - "This note is locked": "Aquesta nota està bloquejada", - "Sorry, only owner can edit this note.": "Perdona, només l'amo pot editar aquesta nota.", - "OK": "OK", - "Reach the limit": "Ha arribat al límit", - "Sorry, you've reached the max length this note can be.": "Perdona, ha arribat a la longitut màxima que pot tenir aquesta nota.", - "Please reduce the content or divide it to more notes, thank you!": "Siusplau, redueix el contingut o divideix-la en més notes, gràcies!", - "Import from Gist": "Importar d'un Gist", - "Paste your gist url here...": "Enganxa l'URL del teu Gist aquí...", - "Import from Snippet": "Importar d'Snippet", - "Select From Available Projects": "Triar d'un projecte disponsible", - "Select From Available Snippets": "Triar d'un Snippet disponible", - "OR": "O", - "Export to Snippet": "Exportar a Snippet", - "Select Visibility Level": "Triar el nivell de visibilitat", - "Night Theme": "Tema Fosc", - "Follow us on %s and %s.": "Segueix-nos a %s i %s", - "Privacy": "Privacitat", - "Terms of Use": "Condicions d'ús", - "Do you really want to delete your user account?": "Estàs segur que vols eliminar el teu compte?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Això esborrarà el teu compte, totes les teves notes i totes les teves referències cap al teu compte d'altres notes.", - "Delete user": "Esborrar compte", - "Export user data": "Exportar dades", - "Help us translating on %s": "Ajuda'ns traduïnt a %s", - "Source Code": "Codi Font", - "Register": "Registrar-se", - "Powered by %s": "Impulsat per %s", - "Help us translating": "Ajuda'ns traduïnt", - "Join the community": "Unir-se a la comunitat", - "Imprint": "Emprenta" -} \ No newline at end of file diff --git a/locales/cs.json b/locales/cs.json deleted file mode 100644 index 264c7abca..000000000 --- a/locales/cs.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "Collaborative markdown notes": "Kolaborativní markdown poznámky", - "Realtime collaborative markdown notes on all platforms.": "Spolupracujte na markdown poznámkách na všech platformách v reálném čase.", - "Best way to write and share your knowledge in markdown.": "Nejlepší platforma pro tvorbu a sdílení vašich znalostí v markdown.", - "Intro": "Intro", - "History": "Historie", - "New guest note": "Nová poznámka hosta", - "Collaborate with URL": "Spolupráce v reálném čase", - "Support charts and MathJax": "Funguje s grafy a MathJax", - "Support slide mode": "Podporuje režim prezentace", - "Sign In": "Přihlásit", - "Below is the history from browser": "Níže je historie z tohoto prohlížeče", - "Welcome!": "Vítejte!", - "New note": "Nová poznámka", - "or": "nebo", - "Sign Out": "Odhlásit", - "Explore all features": "Prozkoumat všechny funkce", - "Select tags...": "Zvolit štítky…", - "Search keyword...": "Vyhledat klíčové slovo …", - "Sort by title": "Seřadit podle názvu", - "Title": "Název", - "Sort by time": "Seřadit podle času", - "Time": "Čas", - "Export history": "Exportovat historii", - "Import history": "Importovat historii", - "Clear history": "Odstranit historii", - "Refresh history": "Aktualizovat historii", - "No history": "Žádná historie", - "Import from browser": "Importovat z prohlížeče", - "Releases": "Vydání", - "Are you sure?": "Jste si jisti?", - "Do you really want to delete this note?": "Opravdu chcete odstranit tuto poznámku?", - "All users will lose their connection.": "Všichni uživatelé ztratí spojení.", - "Cancel": "Storno", - "Yes, do it!": "Ano, provést!", - "Choose method": "Zvolit metodu", - "Sign in via %s": "Přihlásit se přes %s", - "New": "Nová", - "Publish": "Publikovat", - "Extra": "Extra", - "Revision": "Revize", - "Slide Mode": "Režim prezentace", - "Export": "Export", - "Import": "Import", - "Clipboard": "Schránka", - "Download": "Stáhnout", - "Raw HTML": "Raw HTML", - "Edit": "Editovat", - "View": "Zobrazit", - "Both": "Obojí", - "Help": "Nápověda", - "Upload Image": "Nahrát obrázek", - "Menu": "Menu", - "This page need refresh": "Tuto stránku je nutné znovu načíst", - "You have an incompatible client version.": "Verze vašeho klienta není kompatibilní.", - "Refresh to update.": "Znovu načíst a aktualizovat.", - "New version available!": "Je dostupná nová verze!", - "See releases notes here": "Viz poznámky k vydání zde", - "Refresh to enjoy new features.": "Znovu načíst a užít si nové funkce.", - "Your user state has changed.": "Váš uživatelský status se změnil.", - "Refresh to load new user state.": "Znovu načíst a nahrát nový uživatelský status.", - "Refresh": "Znovu načíst", - "Contacts": "Kontakty", - "Report an issue": "Nahlásit problém", - "Meet us on %s": "Potkejte se s námi na %s", - "Send us email": "Pošlete nám email", - "Documents": "Dokumenty", - "Features": "Funkce", - "YAML Metadata": "YAML metadata", - "Slide Example": "Příklad prezentace", - "Cheatsheet": "Tahák", - "Example": "Příklad", - "Syntax": "Syntaxe", - "Header": "Hlavička", - "Unordered List": "Nečíslovaný seznam", - "Ordered List": "Číslovaný seznam", - "Todo List": "Kontrolní seznam", - "Blockquote": "Citace", - "Bold font": "Tučně", - "Italics font": "Kurzívou", - "Strikethrough": "Přeškrtnuté", - "Inserted text": "Podtržený text", - "Marked text": "Zvýrazněný text", - "Link": "Odkaz", - "Image": "Obrázek", - "Code": "Kód", - "Externals": "Externí", - "This is a alert area.": "Toto je oblast upozornění.", - "Revert": "Vrátit", - "Import from clipboard": "Importovat ze schránky", - "Paste your markdown or webpage here...": "Sem vložte váš markdown nebo webovou stránku…", - "Clear": "Vyčistit", - "This note is locked": "Tato poznámka je uzamčena", - "Sorry, only owner can edit this note.": "Omlouvám se, pouze vlastník může editovat tuto poznámku.", - "OK": "OK", - "Reach the limit": "Dosažení limitu", - "Sorry, you've reached the max length this note can be.": "Omlouvám se, dosáhli jste maximální možné délky této poznámky.", - "Please reduce the content or divide it to more notes, thank you!": "Prosím zkraťte poznámku.", - "Import from Gist": "Importovat z Gist", - "Paste your gist url here...": "Sem vložte vaši gist url…", - "Import from Snippet": "Importovat ze Snippet", - "Select From Available Projects": "Zvolit z dostupných projektů", - "Select From Available Snippets": "Zvolit z dostupných úryvků", - "OR": "NEBO", - "Export to Snippet": "Exportovat do úryvku", - "Select Visibility Level": "Zvolit úroveň viditelnosti", - "Night Theme": "Noční téma", - "Follow us on %s and %s.": "Sledujte nás na %s, a %s.", - "Imprint": "Otisk", - "Privacy": "Soukromí", - "Terms of Use": "Podmínky použití", - "Do you really want to delete your user account?": "Opravdu chcete smazat váš uživatelský účet?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Tato operace odstraní váš účet, všechny poznámky, které vlastníte, a také odstraní všechny odkazy na váš účet z jiných poznámek.", - "Delete user": "Smazat uživatele", - "Export user data": "Exportovat uživatelská data", - "Source Code": "Zdrojový kód", - "Powered by %s": "Powered by %s", - "Register": "Registrovat", - "Help us translating": "Pomoci nám s překladem", - "Join the community": "Připojit ke komunitě" -} diff --git a/locales/da.json b/locales/da.json deleted file mode 100644 index 03c49ce51..000000000 --- a/locales/da.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Kollaborative markdown-noter", - "Realtime collaborative markdown notes on all platforms.": "Kollaborative markdown-noter i realtid på alle platforme.", - "Best way to write and share your knowledge in markdown.": "Bedste måde at skrive og dele din viden i markdown.", - "Intro": "Intro", - "History": "Historik", - "New guest note": "Ny gæstenote", - "Collaborate with URL": "Samarbejd via URL", - "Support charts and MathJax": "Mulighed for diagrammer og MathJax", - "Support slide mode": "Mulighed for præsentationer", - "Sign In": "Log Ind", - "Below is the history from browser": "Forneden findes historikken fra browseren", - "Welcome!": "Velkommen!", - "New note": "Ny note", - "or": "eller", - "Sign Out": " Log Ud", - "Explore all features": "Udforsk alle features", - "Select tags...": "Vælg tags...", - "Search keyword...": "Søg nøgleord...", - "Sort by title": "Sortér titler", - "Title": "Titel", - "Sort by time": "Sortér kronologisk", - "Time": "Tid", - "Export history": "Eksportér historik", - "Import history": "Importér historik", - "Clear history": "Ryd hsitorik", - "Refresh history": "Genindlæs historik", - "No history": "Ingen historik", - "Import from browser": "Importér fra browser", - "Releases": "Releases", - "Are you sure?": "Er du sikker?", - "Cancel": "Afbryd", - "Yes, do it!": "Ja, gør det!", - "Choose method": "Vælg metode", - "Sign in via %s": "Log ind med %s", - "New": "Ny", - "Publish": "Publicér", - "Extra": "Ekstra", - "Revision": "Revision", - "Slide Mode": "Præsentationstilstand", - "Export": "Eksportér", - "Import": "Importér", - "Clipboard": "Udklipsholder", - "Download": "Download", - "Raw HTML": "Rå HTML", - "Edit": "Redigér", - "View": "Vis", - "Both": "Begge", - "Help": "Hjælp", - "Upload Image": "Upload billede", - "Menu": "Menu", - "This page need refresh": "Denne side skal genindlæses", - "You have an incompatible client version.": "Din klientversion er inkompatibel.", - "Refresh to update.": "Genindlæs for at opdatere.", - "New version available!": "Ny version tilgængelig!", - "See releases notes here": "Se release notes her", - "Refresh to enjoy new features.": "Genindlæs for at anvende ny funktionalitet.", - "Your user state has changed.": "Din brugerstatus er ændret.", - "Refresh to load new user state.": "Genindlæs for at anvende ny brugerstatus.", - "Refresh": "Genindlæs", - "Contacts": "Kontakter", - "Report an issue": "Rapportér en fejl", - "Send us email": "Send os en email", - "Documents": "Dokumenter", - "Features": "Funktionalitet", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Præsentationseksempel", - "Cheatsheet": "Snydeark", - "Example": "Eksempel", - "Syntax": "Syntaks", - "Header": "Overskrift", - "Unordered List": "Uordnet Liste", - "Ordered List": "Ordnet Liste", - "Todo List": "Tjekliste", - "Blockquote": "Blokcitat", - "Bold font": "Fed skrift", - "Italics font": "Kursiv skrift", - "Strikethrough": "Gennemstregning", - "Inserted text": "Indsat tekst", - "Marked text": "Markeret tekst", - "Link": "Link", - "Image": "Billede", - "Code": "Kode", - "Externals": "Eksterne", - "This is a alert area.": "Dette er et alarmområde.", - "Revert": "Fortryd ændringer", - "Import from clipboard": "Importér fra udklipsholder", - "Paste your markdown or webpage here...": "Indsæt din markdown eller hjemmeside her...", - "Clear": "Ryd", - "This note is locked": "Denne note er låst", - "Sorry, only owner can edit this note.": "Beklager, men kun ejeren kan redigere denne note.", - "OK": "Okay", - "Reach the limit": "Nå grænsen", - "Sorry, you've reached the max length this note can be.": "Beklager, du har nået grænsen for den maksimale længde denne note må være.", - "Please reduce the content or divide it to more notes, thank you!": "Vær venlig at begrænse indholdets mængde eller opdel det i flere noter, tak!", - "Import from Gist": "Importér fra Gist", - "Paste your gist url here...": "Indsæt din gist-url her...", - "Import from Snippet": "Importér fra Snippet", - "Select From Available Projects": "Vælg fra tilgængelige projekter", - "Select From Available Snippets": "Vælg fra tilgængelige Snippets", - "OR": "ELLER", - "Export to Snippet": "Eksportér til Snippet", - "Select Visibility Level": "Vælg synlighedsniveau" -} diff --git a/locales/de.json b/locales/de.json deleted file mode 100644 index dbdc68992..000000000 --- a/locales/de.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Gemeinschaftliche Markdown Notizen", - "Realtime collaborative markdown notes on all platforms.": "Gemeinschaftliche Notizen in Echtzeit auf allen Plattformen.", - "Best way to write and share your knowledge in markdown.": "Der beste Weg, Notizen zu schreiben und teilen.", - "Intro": "Einleitung", - "History": "Verlauf", - "New guest note": "Neue Gastnotiz", - "Collaborate with URL": "Zusammenarbeiten mit URL", - "Support charts and MathJax": "Unterstützt Charts und MathJax", - "Support slide mode": "Unterstützt Präsentationsmodus", - "Sign In": "Einloggen", - "Below is the history from browser": "Lokaler Browserverlauf", - "Welcome!": "Willkommen!", - "New note": "Neue Notiz", - "or": "oder", - "Sign Out": "Ausloggen", - "Explore all features": "Alle Funktionen", - "Select tags...": "Tags auswählen ...", - "Search keyword...": "Suche nach Stichwort ...", - "Sort by title": "Nach Titel sortieren", - "Title": "Titel", - "Sort by time": "Nach Uhrzeit sortieren", - "Time": "Uhrzeit", - "Export history": "Verlauf exportieren", - "Import history": "Verlauf importieren", - "Clear history": "Verlauf löschen", - "Refresh history": "Verlauf aktualisieren", - "No history": "Kein Verlauf", - "Import from browser": "Vom Browser importieren", - "Releases": "Versionen", - "Are you sure?": "Sind Sie sicher?", - "Do you really want to delete this note?": "Möchten Sie diese Notiz wirklich löschen?", - "All users will lose their connection.": "Alle Benutzer werden getrennt.", - "Cancel": "Abbrechen", - "Yes, do it!": "Ja, mach es!", - "Choose method": "Methode wählen", - "Sign in via %s": "Einloggen über %s", - "New": "Neu", - "Publish": "Veröffentlichen", - "Extra": "Extra", - "Revision": "Version", - "Slide Mode": "Präsentationsmodus", - "Export": "Exportieren", - "Import": "Importieren", - "Clipboard": "Zwischenablage", - "Download": "Download", - "Raw HTML": "Reines HTML", - "Edit": "Bearbeiten", - "View": "Anzeigen", - "Both": "Beides", - "Help": "Hilfe", - "Upload Image": "Foto hochladen", - "Menu": "Menü", - "This page need refresh": "Bitte laden Sie die Seite neu", - "You have an incompatible client version.": "Ihre Client-Version ist nicht mit dem Server kompatibel", - "Refresh to update.": "Neu laden zum aktualisieren.", - "New version available!": "Neue Version verfügbar.", - "See releases notes here": "Versionshinweise", - "Refresh to enjoy new features.": "Neu laden für neue Funktionen", - "Your user state has changed.": "Ihr Nutzerstatus hat sich geändert.", - "Refresh to load new user state.": "Neu laden für neuen Nutzerstatus.", - "Refresh": "Neu laden", - "Contacts": "Kontakte", - "Report an issue": "Fehlerbericht senden", - "Meet us on %s": "Triff uns auf %s", - "Send us email": "Kontakt", - "Documents": "Dokumente", - "Features": "Funktionen", - "YAML Metadata": "YAML-Metadaten", - "Slide Example": "Beispiel-Präsentation", - "Cheatsheet": "Cheatsheet", - "Example": "Beispiel", - "Syntax": "Syntax", - "Header": "Überschrift", - "Unordered List": "Stichpunkte", - "Ordered List": "Nummeriert", - "Todo List": "To-do-Liste", - "Blockquote": "Zitat", - "Bold font": "Fett", - "Italics font": "Kursiv", - "Strikethrough": "Durchgestrichen", - "Inserted text": "Unterstrichen", - "Marked text": "Markiert", - "Link": "Link", - "Image": "Foto", - "Code": "Code", - "Externals": "Extern", - "This is a alert area.": "Hinweisfeld", - "Revert": "Zurücksetzen", - "Import from clipboard": "Importieren aus der Zwischenablage", - "Paste your markdown or webpage here...": "Markdown oder Website hier einfügen", - "Clear": "Zurücksetzen", - "This note is locked": "Diese Notiz ist gesperrt", - "Sorry, only owner can edit this note.": "Entschuldigung, nur der Besitzer darf die Notiz bearbeiten.", - "OK": "OK", - "Reach the limit": "Limit erreicht", - "Sorry, you've reached the max length this note can be.": "Entschuldigung, die maximale Länge der Notiz ist erreicht.", - "Please reduce the content or divide it to more notes, thank you!": "Bitte reduzieren Sie den Inhalt oder nutzen zwei Notizen, danke.", - "Import from Gist": "Aus GitHub Gist importieren", - "Paste your gist url here...": "Gist URL hier einfügen ...", - "Import from Snippet": "Aus Snippet importieren", - "Select From Available Projects": "Aus verfügbaren Projekten wählen", - "Select From Available Snippets": "Aus verfügbaren Snippets wählen", - "OR": "Oder", - "Export to Snippet": "Zu Snippet exportieren", - "Select Visibility Level": "Sichtbarkeit bestimmen", - "Night Theme": "Nachtmodus", - "Follow us on %s and %s.": "Folge uns auf %s und %s.", - "Privacy": "Datenschutz", - "Terms of Use": "Nutzungsbedingungen", - "Do you really want to delete your user account?": "Möchten Sie wirklich Ihr Nutzerkonto löschen?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Hiermit löschen Sie Ihr Konto, alle Ihre Dokumente und alle Verweise auf Ihr Konto aus anderen Dokumenten.", - "Delete user": "Benutzer löschen", - "Export user data": "Exportiere Nutzerdaten", - "Help us translating on %s": "Hilf uns bei der Übersetzung auf %s", - "Source Code": "Quelltext", - "Register": "Registrieren", - "Powered by %s": "Betrieben mit %s", - "Help us translating": "Hilf uns beim Übersetzen", - "Join the community": "Tritt der Community bei", - "Imprint": "Impressum" -} \ No newline at end of file diff --git a/locales/el.json b/locales/el.json deleted file mode 100644 index 8f65dfa28..000000000 --- a/locales/el.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Συνεργατικές σημειώσεις markdown", - "Realtime collaborative markdown notes on all platforms.": "Συνεργατική σημειώσεις markdown σε όλες τις πλατφόρμες σε πραγματικό χρόνο.", - "Best way to write and share your knowledge in markdown.": "Ο καλύτερος τρόπος να γράψεις και να μοιραστείς την γνώση σου σε markdown.", - "Intro": "Εισαγωγή", - "History": "Ιστορία", - "New guest note": "Νέα σημείωση επισκέπτη", - "Collaborate with URL": "Συνεργαστείτε με URL", - "Support charts and MathJax": "Υποστηρίζει διαγράμματα και MathJax", - "Support slide mode": "Υποστηρίζει λειτουργία συρσίματος", - "Sign In": "Eίσοδος", - "Below is the history from browser": "Παρακάτω είναι η ιστορία του περιηγητή", - "Welcome!": "Καλωσήρθατε!", - "New note": "Νέα σημείωση", - "or": "ή", - "Sign Out": "Αποσύνδεση", - "Explore all features": "Ανακαλύψτε όλες τις λειτουργίες", - "Select tags...": "Επιλέξτε ετικέτα...", - "Search keyword...": "Αναζήτηση λέξης-κλειδί...", - "Sort by title": "Ταξινόμηση κατά τίτλο", - "Title": "Τίτλος", - "Sort by time": "Ταξινόμηση κατά ώρα", - "Time": "Ώρα", - "Export history": "Εξαγωγή ιστορίας", - "Import history": "Εισαγωγή ιστορίας", - "Clear history": "Καθαρισμός Ιστορίας", - "Refresh history": "Ανανέωση ιστορίας", - "No history": "Δεν υπάρχει ιστορία", - "Import from browser": "Εισαγωγή απο τον περιηγητή", - "Releases": "Κυκλοφορίες", - "Are you sure?": "Είστε σίγουρος?", - "Cancel": "Ακύρωση", - "Yes, do it!": "Ναι, κάντο!", - "Choose method": "Επιλογή μεθόδου", - "Sign in via %s": "Σύνδεση μέσω %s", - "New": "Νέο", - "Publish": "Δημοσίευση", - "Extra": "Επιπλέον", - "Revision": "Αναθεώρηση", - "Slide Mode": "Λειτουργία με σύρσιμο", - "Export": "Εξαγωγή", - "Import": "Εισαγωγή", - "Clipboard": "Πρόχειρο", - "Download": "Κατέβασμα", - "Raw HTML": "Aκατέργαστο HTML", - "Edit": "Επεξεργασία", - "View": "Δες", - "Both": "Και τα δύο", - "Help": "Βοήθεια", - "Upload Image": "Ανέβασμα φωτογραφίας", - "Menu": "Μενού", - "This page need refresh": "Η σελίδα χρειάζεται ανανέωση", - "You have an incompatible client version.": "Έχετε μια μη συμβατή έκδοση.", - "Refresh to update.": "Ανανεώστε για ενημέρωση", - "New version available!": "Νέα διαθέσιμη έκδοση ", - "See releases notes here": "Δείτε τις κυκλοφορίες της σημείωσης εδώ", - "Refresh to enjoy new features.": "Ανανεώστε για να δείτε τις κανούργιες λειτουργίες", - "Your user state has changed.": "Η κατάσταση χρήστη έχει αλλάξει.", - "Refresh to load new user state.": "Ανανεώστε για να φορτώσετε την νέα κατάσταση χρήστη.", - "Refresh": "Ανανέωση", - "Contacts": "Επαφές", - "Report an issue": "Αναφέρετε ένα θέμα", - "Send us email": "Στείλτε μας email", - "Documents": "Έγγραφα", - "Features": "Λειτουργία", - "YAML Metadata": "YAML μεταδεδομένα", - "Slide Example": "Σύρετε για παράδειγμα", - "Cheatsheet": "Σκονάκι", - "Example": "Παράδειγμα", - "Syntax": "Σύνταξη", - "Header": "Επικεφαλίδα", - "Unordered List": "Μη αριθμημένη λίστα", - "Ordered List": "Αριθμημένη λίστα", - "Todo List": "Todo List", - "Blockquote": "Παράγραφος", - "Bold font": "Εντονη γραμματοσειρά", - "Italics font": "Πλάγια γραμματοσειρά", - "Strikethrough": "Διαγραμένη γραμματοσειρά", - "Inserted text": "Εισαγμένο κείμενο", - "Marked text": "Επιλεγμένο κείμενο", - "Link": "Σύνδεσμος", - "Image": "Εικόνα", - "Code": "Κώδικας", - "Externals": "Εξωτερικά", - "This is a alert area.": "Αυτή είναι μια περιοχή ειδοποίησης", - "Revert": "Επαναστροφή", - "Import from clipboard": "Εισαγωγή από πρόχειρο", - "Paste your markdown or webpage here...": "Επικολλήστε markdown ή την ιστοσελίδα σας εδώ...", - "Clear": "Καθαρισμός", - "This note is locked": "Η σημείωση είναι κλειδωμένη", - "Sorry, only owner can edit this note.": "Συγνώμη, μόνο ο ιδιοκτήτης μπορεί να επεξεργαστεί αυτη την σημείωση.", - "OK": "Εντάξει", - "Reach the limit": "Φτάσατε το όριο", - "Sorry, you've reached the max length this note can be.": "Συγνώμη, φτάσατε το μέγιστο μέγεθος αυτής της σημείωσης.", - "Please reduce the content or divide it to more notes, thank you!": "Παρακαλώ μειώστε το περιεχόμενο η διαιρέστε το σε περισσότερες σημειώσεις, ευχαριστώ!", - "Import from Gist": "Εισαγωγή από Gist", - "Paste your gist url here...": "Κάντε επικκόληση του gist url εδώ...", - "Import from Snippet": "Εισαγωγή από Snippet", - "Select From Available Projects": "Eπιλογή από διαθέσιμα Projects", - "Select From Available Snippets": "Eπιλογή από διαθέσιμα Snippets", - "OR": "Ή", - "Export to Snippet": "Eξαγωγή σε Snippet", - "Select Visibility Level": "Επιλέξτε επίπεδο ορατότητας" -} diff --git a/locales/en.json b/locales/en.json deleted file mode 100644 index 66f0bceda..000000000 --- a/locales/en.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Collaborative markdown notes", - "Realtime collaborative markdown notes on all platforms.": "Collaborate on markdown notes on all platforms in realtime.", - "Best way to write and share your knowledge in markdown.": "The best platform to write and share markdown.", - "Intro": "Intro", - "History": "History", - "New guest note": "New guest note", - "Collaborate with URL": "Real time collaboration", - "Support charts and MathJax": "Works with charts and MathJax", - "Support slide mode": "Supports slide mode", - "Sign In": "Sign In", - "Below is the history from browser": "Below is history from this browser", - "Welcome!": "Welcome!", - "New note": "New note", - "or": "or", - "Sign Out": "Sign Out", - "Explore all features": "Explore all features", - "Select tags...": "Select tags…", - "Search keyword...": "Search keyword…", - "Sort by title": "Sort by title", - "Title": "Title", - "Sort by time": "Sort by time", - "Time": "Time", - "Export history": "Export history", - "Import history": "Import history", - "Clear history": "Clear history", - "Refresh history": "Refresh history", - "No history": "No history", - "Import from browser": "Import from browser", - "Releases": "Releases", - "Are you sure?": "Are you sure?", - "Do you really want to delete this note?": "Do you really want to delete this note?", - "All users will lose their connection.": "All users will lose their connection.", - "Cancel": "Cancel", - "Yes, do it!": "Yes, do it!", - "Choose method": "Choose method", - "Sign in via %s": "Sign in via %s", - "New": "New", - "Publish": "Publish", - "Extra": "Extra", - "Revision": "Revision", - "Slide Mode": "Slide Mode", - "Export": "Export", - "Import": "Import", - "Clipboard": "Clipboard", - "Download": "Download", - "Raw HTML": "Raw HTML", - "Edit": "Edit", - "View": "View", - "Both": "Both", - "Help": "Help", - "Upload Image": "Upload Image", - "Menu": "Menu", - "This page need refresh": "This page needs to be refreshed", - "You have an incompatible client version.": "Your client's version is incompatible.", - "Refresh to update.": "Refresh to update.", - "New version available!": "New version available!", - "See releases notes here": "See releases notes here", - "Refresh to enjoy new features.": "Refresh to enjoy new features.", - "Your user state has changed.": "Your user state has changed.", - "Refresh to load new user state.": "Refresh to load new user state.", - "Refresh": "Refresh", - "Contacts": "Contacts", - "Report an issue": "Report an issue", - "Meet us on %s": "Meet us on %s", - "Send us email": "Send us email", - "Documents": "Documents", - "Features": "Features", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Slide Example", - "Cheatsheet": "Cheatsheet", - "Example": "Example", - "Syntax": "Syntax", - "Header": "Header", - "Unordered List": "Unordered List", - "Ordered List": "Ordered List", - "Todo List": "Checklist", - "Blockquote": "Blockquote", - "Bold font": "Bold", - "Italics font": "Italicize", - "Strikethrough": "Strikethrough", - "Inserted text": "Underlined text", - "Marked text": "Highlighted text", - "Link": "Link", - "Image": "Image", - "Code": "Code", - "Externals": "Externals", - "This is a alert area.": "This is an alert area.", - "Revert": "Revert", - "Import from clipboard": "Import from clipboard", - "Paste your markdown or webpage here...": "Paste your markdown or webpage here…", - "Clear": "Clear", - "This note is locked": "This note is locked", - "Sorry, only owner can edit this note.": "Sorry, only the owner can edit this note.", - "OK": "OK", - "Reach the limit": "Reach the limit", - "Sorry, you've reached the max length this note can be.": "Sorry, you've reached the maximum length this note can be.", - "Please reduce the content or divide it to more notes, thank you!": "Please shorten the note.", - "Import from Gist": "Import from Gist", - "Paste your gist url here...": "Paste your gist url here…", - "Import from Snippet": "Import from Snippet", - "Select From Available Projects": "Select From Available Projects", - "Select From Available Snippets": "Select From Available Snippets", - "OR": "OR", - "Export to Snippet": "Export to Snippet", - "Select Visibility Level": "Select Visibility Level", - "Night Theme": "Night Theme", - "Follow us on %s and %s.": "Follow us on %s, and %s.", - "Privacy": "Privacy", - "Terms of Use": "Terms of Use", - "Do you really want to delete your user account?": "Do you really want to delete your user account?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.", - "Delete user": "Delete user", - "Export user data": "Export user data", - "Help us translating on %s": "Help us translating on %s", - "Source Code": "Source Code", - "Register": "Register", - "Powered by %s": "Powered by %s", - "Help us translating": "Help us translating", - "Join the community": "Join the community", - "Imprint": "Imprint" -} \ No newline at end of file diff --git a/locales/eo.json b/locales/eo.json deleted file mode 100644 index c7c8cad26..000000000 --- a/locales/eo.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Kunlaborataj marksubenaj notoj", - "Realtime collaborative markdown notes on all platforms.": "Tujkunlaborataj marksubenaj notoj ĉe ĉiuj sistemoj.", - "Best way to write and share your knowledge in markdown.": "La plej bona maniero skribi kaj havigi vian scion marksubene.", - "Intro": "Enkonduko", - "History": "Historio", - "New guest note": "Novan gastan noton", - "Collaborate with URL": "Kunlaboru per URL", - "Support charts and MathJax": "Ebleco por skemoj kaj MathJax", - "Support slide mode": "Ebleco por bildvica modo", - "Sign In": "Ensalutu", - "Below is the history from browser": "Malsupre estas la historio de la retumilo", - "Welcome!": "Bonvenon!", - "New note": "Novan Noton", - "or": "aŭ", - "Sign Out": "Elsalutu", - "Explore all features": "Esploru ĉiujn eblecojn", - "Select tags...": "Elektu etikedojn..", - "Search keyword...": "Serĉu ĉefvorton...", - "Sort by title": "Ordigu laŭ titolo", - "Title": "Titolo", - "Sort by time": "Ordigu laŭ tempo", - "Time": "Tempo", - "Export history": "Elportu historion", - "Import history": "Alportu historion", - "Clear history": "Malplenigu historion", - "Refresh history": "Refreŝigu historion", - "No history": "Neniu historio", - "Import from browser": "Alportu de retumilo", - "Releases": "Eldonoj", - "Are you sure?": "Ĉu vi certas?", - "Cancel": "Nuligu", - "Yes, do it!": "Jes, faru ĝin!", - "Choose method": "Elektu metodon", - "Sign in via %s": "Ensalutu per %s", - "New": "Nova", - "Publish": "Dissendu", - "Extra": "Plia", - "Revision": "Versio", - "Slide Mode": "Bildvica modo", - "Export": "Elportu", - "Import": "Alportu", - "Clipboard": "Poŝo", - "Download": "Elŝuti", - "Raw HTML": "Kruda HTML", - "Edit": "Redaktu", - "View": "Vidu", - "Both": "Ambaŭ", - "Help": "Helpo", - "Upload Image": "Alŝutu bildon", - "Menu": "Menuo", - "This page need refresh": "Ĉi tiu paĝo bezonas refreŝiĝi", - "You have an incompatible client version.": "Vi havas malkongruan klientversion.", - "Refresh to update.": "Refreŝigu por ĝisdatigi", - "New version available!": "Nova versio disponeblas!", - "See releases notes here": "Vidu elsendajn notojn ĉi tie", - "Refresh to enjoy new features.": "Refreŝigu por ĝui novajn eblecojn.", - "Your user state has changed.": "Via uzantstato ŝanĝiĝis.", - "Refresh to load new user state.": "Refreŝigu por ŝargi novan uzantstaton.", - "Refresh": "Refreŝigu", - "Contacts": "Kontaktuloj", - "Report an issue": "Raportu problemon", - "Send us email": "Sendu al ni retpoŝton", - "Documents": "Dosieroj", - "Features": "Eblecoj", - "YAML Metadata": "YAML metadateno", - "Slide Example": "Bildvica ekzemplo", - "Cheatsheet": "Gvidfolio", - "Example": "Ekzemplo", - "Syntax": "Sintakso", - "Header": "Paĝokapo", - "Unordered List": "Neordita Listo", - "Ordered List": "Ordita Listo", - "Todo List": "Farenda Listo", - "Blockquote": "Deŝovita cito", - "Bold font": "Dika tiparo", - "Italics font": "Kursiva tiparo", - "Strikethrough": "Trastrekita", - "Inserted text": "Enmetita teksto", - "Marked text": "Markita teksto", - "Link": "Ligilo", - "Image": "Bildo", - "Code": "Kodo", - "Externals": "Eksteraĵoj", - "This is a alert area.": "Ĉi tiu estas avertzono.", - "Revert": "Malfaru ŝanĝojn", - "Import from clipboard": "Alportu de la poŝo", - "Paste your markdown or webpage here...": "Algluu vian marksubenon aŭ retpaĝaron ĉi tie...", - "Clear": "Malplenigu", - "This note is locked": "Ĉi tiu noto estas ŝlosita", - "Sorry, only owner can edit this note.": "Bedaŭrinde, nur la proprulo povas redakti ĉi tiun noton.", - "OK": "Bone", - "Reach the limit": "Atingi la limigon", - "Sorry, you've reached the max length this note can be.": "Pardonon, ĉi tiu noto jam atingis maksimuman longecon.", - "Please reduce the content or divide it to more notes, thank you!": "Bonvolu malpligrandigi la enhavaĵon, aŭ dividi ĝin en pliajn notojn!", - "Import from Gist": "Alportu el Gist", - "Paste your gist url here...": "Algluu vian gist-an URL-n ĉi tie...", - "Import from Snippet": "Alportu el tekstero", - "Select From Available Projects": "Elektu el disponeblaj projektoj", - "Select From Available Snippets": "Elektu el disponeblaj teksteroj", - "OR": "AŬ", - "Export to Snippet": "Elportu al Snippet", - "Select Visibility Level": "Elektu videblecan nivelon" -} diff --git a/locales/es.json b/locales/es.json deleted file mode 100644 index 5bbb856bc..000000000 --- a/locales/es.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Notas colaborativas en Markdown", - "Realtime collaborative markdown notes on all platforms.": "Notas colaborativas en Markdown para todas las plataformas en tiempo real.", - "Best way to write and share your knowledge in markdown.": "La mejor forma de escribir y compartir tu conocimiento en Markdown.", - "Intro": "Introduccion", - "History": "Historia", - "New guest note": "Nueva nota como invitado", - "Collaborate with URL": "Colaborar via URL", - "Support charts and MathJax": "Soporte para gráficos y MathJax", - "Support slide mode": "Soporte para diapositivas", - "Sign In": "Ingresar", - "Below is the history from browser": "A continuación se muestra el historial del navegador", - "Welcome!": "¡Bienvenido!", - "New note": "Nueva nota", - "or": "o", - "Sign Out": "Salir", - "Explore all features": "Explorar todas las funciones", - "Select tags...": "Seleccionar etiquetas...", - "Search keyword...": "Buscar palabras clave...", - "Sort by title": "Ordenar por título", - "Title": "Título", - "Sort by time": "Ordenar por fecha", - "Time": "Tiempo", - "Export history": "Exportar historial", - "Import history": "Importar historial", - "Clear history": "Borrar historial", - "Refresh history": "Actualizar historial", - "No history": "Ningún historial", - "Import from browser": "Importar del navegador", - "Releases": "Versiones", - "Are you sure?": "¿Estás seguro?", - "Do you really want to delete this note?": "¿Realmente quieres eliminar esta nota?", - "All users will lose their connection.": "Todos los usuarios perderán su conexión.", - "Cancel": "Cancelar", - "Yes, do it!": "Si, ¡hazlo!", - "Choose method": "Elegir método", - "Sign in via %s": "Ingresar via %s", - "New": "Nuevo", - "Publish": "Publicar", - "Extra": "Extra", - "Revision": "Revision", - "Slide Mode": "Modo presentación", - "Export": "Exportar", - "Import": "Importar", - "Clipboard": "Portapapeles", - "Download": "Descargar", - "Raw HTML": "HTML puro", - "Edit": "Editar", - "View": "Ver", - "Both": "Ambos", - "Help": "Ayuda", - "Upload Image": "Subir imagen", - "Menu": "Menú", - "This page need refresh": "Esta página necesita ser cargada de nuevo", - "You have an incompatible client version.": "Tienes una version del cliente incompatible.", - "Refresh to update.": "Cargar de nuevo para actualizar.", - "New version available!": "¡Nueva versión disponible!", - "See releases notes here": "Ver aquí las notas de publicación", - "Refresh to enjoy new features.": "Actualizar para usar las nuevas funciones.", - "Your user state has changed.": "El estado de tu usuario ha cambiado.", - "Refresh to load new user state.": "Recargar para actualizar el estado de tu usuario.", - "Refresh": "Recargar", - "Contacts": "Contactos", - "Report an issue": "Reportar un problema", - "Meet us on %s": "Encuéntranos en %s", - "Send us email": "Enviarnos un email", - "Documents": "Documentos", - "Features": "Funciones", - "YAML Metadata": "Metadatos en YAML", - "Slide Example": "Ejemplo de diapositiva", - "Cheatsheet": "Ayudamemorias", - "Example": "Ejemplo", - "Syntax": "Sintaxis", - "Header": "Cabecera", - "Unordered List": "Lista desordenada", - "Ordered List": "Lista ordenada", - "Todo List": "Lista de tareas", - "Blockquote": "Bloque de cita", - "Bold font": "Fuente negrita", - "Italics font": "Fuente itálica", - "Strikethrough": "Tachado", - "Inserted text": "Texto subrayado", - "Marked text": "Texto marcado", - "Link": "Enlace", - "Image": "Imagen", - "Code": "Código", - "Externals": "Externos", - "This is a alert area.": "Esto es un área de alerta.", - "Revert": "Revertir", - "Import from clipboard": "Importar del portapapeles", - "Paste your markdown or webpage here...": "Pega tu markdown o página web aquí...", - "Clear": "Limpiar", - "This note is locked": "Esta nota está bloqueada", - "Sorry, only owner can edit this note.": "Disculpa, solo el dueño puede editar esta nota.", - "OK": "OK", - "Reach the limit": "Haz alcanzado el límite", - "Sorry, you've reached the max length this note can be.": "Disculpa, haz alcanzado la longitud máxima que puede tener esta nota.", - "Please reduce the content or divide it to more notes, thank you!": "Por favor, reduce el contenido o dividela en mas notas, ¡gracias!", - "Import from Gist": "Importar de un Gist", - "Paste your gist url here...": "Pega el URL de tu Gist aquí...", - "Import from Snippet": "Importar de Snippet", - "Select From Available Projects": "Elegir de un proyecto disponible", - "Select From Available Snippets": "Elegir de un Snippet disponible", - "OR": "O", - "Export to Snippet": "Exportar a Snippet", - "Select Visibility Level": "Elegir el nivel de visibilidad", - "Night Theme": "Modo nocturno", - "Follow us on %s and %s.": "Síguenos en %s, y %s.", - "Privacy": "Privacidad", - "Terms of Use": "Términos de uso", - "Do you really want to delete your user account?": "¿Estás seguro que quieres eliminar tu cuenta de usuario?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Esta acción eliminará tu cuenta, todas tus notas y las referencias a tu cuenta desde otras notas.", - "Delete user": "Eliminar usuario", - "Export user data": "Exportar información de usuario", - "Help us translating on %s": "Ayúdanos traduciendo en %s", - "Source Code": "Código fuente", - "Register": "Registrar", - "Powered by %s": "Desarrollado por %s.", - "Help us translating": "Ayúdanos traduciendo", - "Join the community": "Únete a la comunidad", - "Imprint": "Huella" -} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json deleted file mode 100644 index 3dc434ae0..000000000 --- a/locales/fr.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Notes collaboratives en markdown", - "Realtime collaborative markdown notes on all platforms.": "Notes en markdown collaboratives en temps réel sur toutes les plateformes.", - "Best way to write and share your knowledge in markdown.": "Le meilleur moyen d'écrire et partager votre savoir en markdown.", - "Intro": "Intro", - "History": "Historique", - "New guest note": "Nouvelle note invité", - "Collaborate with URL": "Collaborez avec l'URL", - "Support charts and MathJax": "Supporte les graphiques et MathJax", - "Support slide mode": "Supporte le mode présentation", - "Sign In": "Se connecter", - "Below is the history from browser": "Ci-dessous, l'historique du navigateur", - "Welcome!": "Bienvenue !", - "New note": "Nouvelle note", - "or": "ou", - "Sign Out": "Se déconnecter", - "Explore all features": "Explorer toutes les fonctionnalités", - "Select tags...": "Sélectionner les tags...", - "Search keyword...": "Chercher un mot-clef...", - "Sort by title": "Trier par titre", - "Title": "Titre", - "Sort by time": "Trier par date", - "Time": "Date", - "Export history": "Exporter l'historique", - "Import history": "Importer l'historique", - "Clear history": "Supprimer l'historique", - "Refresh history": "Actualiser l'historique", - "No history": "Pas d'historique", - "Import from browser": "Importer depuis le navigateur", - "Releases": "Versions", - "Are you sure?": "Ëtes-vous sûr ?", - "Do you really want to delete this note?": "Voulez-vous vraiment supprimer cette note ?", - "All users will lose their connection.": "Tous les utilisateurs perdront leur connexion.", - "Cancel": "Annuler", - "Yes, do it!": "Oui, je suis sûr !", - "Choose method": "Choisir la méthode", - "Sign in via %s": "Se connecter depuis %s", - "New": "Nouvelle", - "Publish": "Publier", - "Extra": "Extra", - "Revision": "Historique", - "Slide Mode": "Mode présentation", - "Export": "Exporter", - "Import": "Importer", - "Clipboard": "Presse-papier", - "Download": "Télécharger", - "Raw HTML": "HTML brut", - "Edit": "Éditer", - "View": "Voir", - "Both": "Les deux", - "Help": "Aide", - "Upload Image": "Uploader une image", - "Menu": "Menu", - "This page need refresh": "Cette page doit être rechargée", - "You have an incompatible client version.": "Vous avez une version client incompatible.", - "Refresh to update.": "Recharger pour mettre à jour.", - "New version available!": "Nouvelle version disponible !", - "See releases notes here": "Voir les commentaires de version ici", - "Refresh to enjoy new features.": "Recharger pour bénéficier des nouvelles fonctionnalités.", - "Your user state has changed.": "Votre statut utilisateur a changé.", - "Refresh to load new user state.": "Recharger pour avoir le nouveau statut utilisateur.", - "Refresh": "Recharger", - "Contacts": "Contacts", - "Report an issue": "Signaler un problème", - "Meet us on %s": "Rencontrez-nous sur %s", - "Send us email": "Envoyez-nous un mail", - "Documents": "Documents", - "Features": "Fonctionnalités", - "YAML Metadata": "Métadonnées YAML", - "Slide Example": "Exemple de présentation", - "Cheatsheet": "Pense-bête", - "Example": "Exemple", - "Syntax": "Syntaxe", - "Header": "En-tête", - "Unordered List": "Liste à puce", - "Ordered List": "List numérotée", - "Todo List": "Liste de tâches", - "Blockquote": "Citation", - "Bold font": "Gras", - "Italics font": "Italique", - "Strikethrough": "Barré", - "Inserted text": "Souligné", - "Marked text": "Surligné", - "Link": "Lien", - "Image": "Image", - "Code": "Code", - "Externals": "Externes", - "This is a alert area.": "Ceci est un texte d'alerte.", - "Revert": "Revenir en arrière", - "Import from clipboard": "Importer depuis le presse-papier", - "Paste your markdown or webpage here...": "Collez votre markdown ou votre page web ici...", - "Clear": "Vider", - "This note is locked": "Cette note est verrouillée", - "Sorry, only owner can edit this note.": "Désolé, seul le propriétaire peut éditer cette note.", - "OK": "OK", - "Reach the limit": "Atteindre la limite", - "Sorry, you've reached the max length this note can be.": "Désolé, vous avez atteint la longueur maximale que cette note peut avoir.", - "Please reduce the content or divide it to more notes, thank you!": "Merci de réduire le contenu ou de le diviser en plusieurs notes !", - "Import from Gist": "Importer depuis Gist", - "Paste your gist url here...": "Coller l'URL de votre Gist ici...", - "Import from Snippet": "Importer depuis Snippet", - "Select From Available Projects": "Sélectionner depuis les projets disponibles", - "Select From Available Snippets": "Sélectionner depuis les Snippets disponibles", - "OR": "OU", - "Export to Snippet": "Exporter vers Snippet", - "Select Visibility Level": "Sélectionner le niveau de visibilité", - "Night Theme": "Thème Nuit", - "Follow us on %s and %s.": "Suivez-nous sur %s, et %s.", - "Privacy": "Confidentialité", - "Terms of Use": "Conditions d'utilisation", - "Do you really want to delete your user account?": "Voulez-vous vraiment supprimer votre compte utilisateur ?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Cela supprimera votre compte, toutes les notes dont vous êtes propriétaire et supprimera toute référence à votre compte dans les autres notes.", - "Delete user": "Supprimer l'utilisateur", - "Export user data": "Exporter les données utilisateur", - "Help us translating on %s": "Aidez nous à traduire sur %s", - "Source Code": "Code source", - "Register": "S'enregistrer", - "Powered by %s": "Propulsé par %s", - "Help us translating": "Aidez nous à traduire", - "Join the community": "Rejoignez la communauté", - "Imprint": "Mentions légales" -} \ No newline at end of file diff --git a/locales/hi.json b/locales/hi.json deleted file mode 100644 index e8868087b..000000000 --- a/locales/hi.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "सहयोगात्मक मार्कडॉऊन नोट्स", - "Realtime collaborative markdown notes on all platforms.": "सभी प्लेटफार्मों पर वास्तविक समय सहयोगी मार्कडॉऊन के नोट्स", - "Best way to write and share your knowledge in markdown.": "मार्कडॉऊन में लिखने के लिए और अपना ज्ञान शेयर करने का सबसे अच्छा तरीका", - "Intro": "परिचय", - "History": "इतिहास", - "New guest note": "नया अतिथि नोट", - "Collaborate with URL": "यूआरएल के साथ सहयोग करें", - "Support charts and MathJax": "चार्ट और MathJax का समर्थन", - "Support slide mode": "स्लाइड मोड का समर्थन", - "Sign In": "साइन इन करें", - "Below is the history from browser": "नीचे ब्राउज़र से इतिहास है", - "Welcome!": "स्वागत हे!", - "New note": "नया नोट", - "or": "या", - "Sign Out": "साइन आउट", - "Explore all features": "सभी सुविधाओं का अन्वेषण करें", - "Select tags...": "टैग का चयन करें ...", - "Search keyword...": "मुख्य शब्द ढूंडो...", - "Sort by title": "शीर्षक द्वारा क्रमबद्ध करें", - "Title": "शीर्षक", - "Sort by time": "समय के अनुसार क्रमबद्ध करें", - "Time": "समय", - "Export history": "इतिहास को निर्यात करें", - "Import history": "इतिहास को आयात करें", - "Clear history": "इतिहास मिटा दें", - "Refresh history": "इतिहास ताज़ा करे", - "No history": "इतिहास न रखें", - "Import from browser": "ब्राउज़र से आयात", - "Releases": "विज्ञप्ति", - "Are you sure?": "क्या आपको यकीन है?", - "Cancel": "रद्द करे", - "Yes, do it!": "हाँ करो इसे!", - "Choose method": "विधि चुनें", - "Sign in via %s": "%s के माध्यम से साइन इन करें", - "New": "नया", - "Publish": "प्रकाशित करें", - "Extra": "अतिरिक्त", - "Revision": "संशोधन", - "Slide Mode": "स्लाइड मोड", - "Export": "निर्यात", - "Import": "आयात", - "Clipboard": "क्लिपबोर्ड", - "Download": "डाउनलोड", - "Raw HTML": "सिर्फ एच टी एम एल", - "Edit": "संपादित करें", - "View": "देखें", - "Both": "दोनों", - "Help": "मदद", - "Upload Image": "तस्वीर डालिये", - "Menu": "मेन्यू", - "This page need refresh": "इस पेज को ताजा करने की जरूरत है", - "You have an incompatible client version.": "आप एक असंगत ग्राहक संस्करण है।", - "Refresh to update.": "अद्यतन करने के लिए ताज़ा करें।", - "New version available!": "नया संस्करण उपलब्ध है!", - "See releases notes here": "यहाँ रिलीज़ नोट देखें ", - "Refresh to enjoy new features.": "नई सुविधाओं का आनंद करने के लिए ताज़ा करें।", - "Your user state has changed.": "आपका उपयोगकर्ता राज्य बदल गया है।", - "Refresh to load new user state.": "नई उपयोगकर्ता राज्य लोड करने के लिए ताज़ा करें।", - "Refresh": "ताज़ा करे", - "Contacts": "संपर्क", - "Report an issue": "मामले की रिपोर्ट करें", - "Send us email": "हमें ईमेल भेजें", - "Documents": "दस्तावेज़", - "Features": "विशेषताएं", - "YAML Metadata": "YAML मेटाडाटा", - "Slide Example": "स्लाइड उदाहरण", - "Cheatsheet": "प्रवंचक पत्रक", - "Example": "उदाहरण", - "Syntax": "वाक्य - विन्यास", - "Header": "हैडर", - "Unordered List": "अव्यवस्थित सूची", - "Ordered List": "आदेश सूची", - "Todo List": "करने के लिए सूची", - "Blockquote": "ब्लॉककोट", - "Bold font": "बोल्ड फ़ॉन्ट", - "Italics font": "इटालिक फ़ॉन्ट", - "Strikethrough": "स्ट्राइकथ्रू", - "Inserted text": "डाला गया टेक्स्ट", - "Marked text": "निशान किया हुआ टेक्स्ट", - "Link": "लिंक", - "Image": "तस्वीर", - "Code": "कोड", - "Externals": "बाहरी", - "This is a alert area.": "यह एक चेतावनी क्षेत्र है।", - "Revert": "वापस करें", - "Import from clipboard": "क्लिपबोर्ड से आयात", - "Paste your markdown or webpage here...": "यहाँ अपने मार्कडॉऊन या वेब पेज पेस्ट करें ...", - "Clear": "साफ़ करें", - "This note is locked": "इस नोट को बंद कर दिया है", - "Sorry, only owner can edit this note.": "क्षमा करें, केवल मालिक इस नोट को संपादित कर सकते हैं।", - "OK": "ठीक", - "Reach the limit": "सीमा तक पहुँचना", - "Sorry, you've reached the max length this note can be.": "क्षमा करें, आप इस नोट की अधिकतम लंबाई तक पहुँच गए हैं।", - "Please reduce the content or divide it to more notes, thank you!": "सामग्री को कम करें या इसे और अधिक नोटों में विभाजित करें, धन्यवाद!", - "Import from Gist": "Gist से आयात करें", - "Paste your gist url here...": "यहाँ अपना gist यूआरएल पेस्ट करें ...", - "Import from Snippet": "स्निपेट से आयात करें", - "Select From Available Projects": "उपलब्ध परियोजनाओं से चयन करें", - "Select From Available Snippets": "उपलब्ध स्निपेट से चयन करें", - "OR": "या", - "Export to Snippet": "स्निपेट में निर्यात", - "Select Visibility Level": "दृश्यता के स्तर का चयन" -} diff --git a/locales/hr.json b/locales/hr.json deleted file mode 100644 index e8b4a6fb8..000000000 --- a/locales/hr.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Kolaborativne markdown bilješke", - "Realtime collaborative markdown notes on all platforms.": "Kolaborativne markdown bilješke na svim platformama u realnom vremenu.", - "Best way to write and share your knowledge in markdown.": "Najbolji način za pisanje i dijeljenje svog znanja u markdown-u.", - "Intro": "Uvod", - "History": "Povijest", - "New guest note": "Nova bilješka gosta", - "Collaborate with URL": "Kolaboracija sa URL-om", - "Support charts and MathJax": "Support charts and MathJax", - "Support slide mode": "Način podrške slajda", - "Sign In": "Prijavu se", - "Below is the history from browser": "Ispod je povijest preglednika", - "Welcome!": "Dobrodošli!", - "New note": "Nova bilješka", - "or": "ili", - "Sign Out": "Odjavi se", - "Explore all features": "Istraži sve značajke", - "Select tags...": "Odaberi oznake...", - "Search keyword...": "Pretraži ključnu riječ...", - "Sort by title": "Sortiraj po naslovu", - "Title": "Naslov", - "Sort by time": "Sortiraj po vremenu", - "Time": "Vrijeme", - "Export history": "Izvezi povijest", - "Import history": "Uvezi povijest", - "Clear history": "Očisti povijest", - "Refresh history": "Osvježi povijest", - "No history": "Nema povijesti", - "Import from browser": "Uvezi iz preglednika", - "Releases": "Izdanja", - "Are you sure?": "Jeste li sigurni?", - "Cancel": "Odustani", - "Yes, do it!": "Da, učini to!", - "Choose method": "Izaberi metodu", - "Sign in via %s": "Prijavi se pomoću %s", - "New": "Novo", - "Publish": "Objavi", - "Extra": "Dodatno", - "Revision": "Revizija", - "Slide Mode": "Način slajda", - "Export": "Izvoz", - "Import": "Uvoz", - "Clipboard": "Međuspremnik", - "Download": "Preuzimanje", - "Raw HTML": "Raw HTML", - "Edit": "Uredi", - "View": "Pregledaj", - "Both": "Oboje", - "Help": "Pomoć", - "Upload Image": "Prenesi sliku", - "Menu": "Meni", - "This page need refresh": "Ovu stranicu je potrebno osvježiti", - "You have an incompatible client version.": "Imate nekompatibilnu verziju klijenta.", - "Refresh to update.": "Osvježite za ažuriranje.", - "New version available!": "Nova verzija dostupna!", - "See releases notes here": "Pogledajte bilješke izdanja ovdje", - "Refresh to enjoy new features.": "Osvježi za nove značajke.", - "Your user state has changed.": "Stanje Vašeg korisnika se promijenilo.", - "Refresh to load new user state.": "Osvježi za učitavanje novog stanja korisnika.", - "Refresh": "Osvježi", - "Contacts": "Kontakti", - "Report an issue": "Prijavi problem", - "Send us email": "Pošalji nam email", - "Documents": "Dokumenti", - "Features": "Značajke", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Primjer slajda", - "Cheatsheet": "Cheatsheet", - "Example": "Primjer", - "Syntax": "Sintaksa", - "Header": "Zaglavlje", - "Unordered List": "Neuređeni popis", - "Ordered List": "Uređeni popis", - "Todo List": "Popis obaveza", - "Blockquote": "Blockquote", - "Bold font": "Bold font", - "Italics font": "Kurzivan font", - "Strikethrough": "Precrtano", - "Inserted text": "Umetnuti tekst", - "Marked text": "Označeni tekst", - "Link": "Link", - "Image": "Slika", - "Code": "Kod", - "Externals": "Vanjski izgled", - "This is a alert area.": "Ovo je područje upozorenja.", - "Revert": "Vrati", - "Import from clipboard": "Uvezi iz međuspremnika", - "Paste your markdown or webpage here...": "Zalijepi svoj markdown ili web stranicu ovdje...", - "Clear": "Očisti", - "This note is locked": "Ova bilješka je zaključana", - "Sorry, only owner can edit this note.": "Žao nam je, samo vlasnik ove bilješke ju može uređivati.", - "OK": "OK", - "Reach the limit": "Dosegni granicu", - "Sorry, you've reached the max length this note can be.": "Žao nam je, dosegli ste maksimalnu moguću duljinu ove bilješke.", - "Please reduce the content or divide it to more notes, thank you!": "Molimo Vas smanjite sardžaj ili ga podijelite na više bilješki, hvala!", - "Import from Gist": "Uvezi iz Gist-a", - "Paste your gist url here...": "Zalijepi svoj gist url ovdje...", - "Import from Snippet": "Uvezi iz isječka", - "Select From Available Projects": "Odaberi iz raspoloživih projekta", - "Select From Available Snippets": "Odaberi iz raspoloživih isječaka", - "OR": "ILI", - "Export to Snippet": "Izvoz u isječak", - "Select Visibility Level": "Odaberi razinu vidljivosti" -} \ No newline at end of file diff --git a/locales/id.json b/locales/id.json deleted file mode 100644 index a6f985a36..000000000 --- a/locales/id.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Catatan markdown kolaboratif", - "Realtime collaborative markdown notes on all platforms.": "Berkolaborasi di catatan markdown di semua platform secara realtime", - "Best way to write and share your knowledge in markdown.": "Platform terbaik untuk menulis dan membagikan markdown", - "Intro": "Perkenalan", - "History": "Riwayat", - "New guest note": "Catatan baru (sebagai tamu)", - "Collaborate with URL": "Kolaborasi real-time", - "Support charts and MathJax": "Mendukung charts dan MathJax", - "Support slide mode": "Mendukung mode slide", - "Sign In": "Masuk", - "Below is the history from browser": "Dibawah ini adalah riwayat dari peramban ini", - "Welcome!": "Selamat Datang", - "New note": "Catatan Baru", - "or": "atau", - "Sign Out": "Keluar", - "Explore all features": "Jelajahi semua fitur", - "Select tags...": "Pilih tanda...", - "Search keyword...": "Cari berdasarkan kata kunci...", - "Sort by title": "Urutkan berdasarkan judul", - "Title": "Judul", - "Sort by time": "Urutkan berdasarkan waktu", - "Time": "Waktu", - "Export history": "Ekspor Riwayat", - "Import history": "Impor Riwayat", - "Clear history": "Bersihkan Riwayat", - "Refresh history": "Muat-ulang Riwayat", - "No history": "Tidak ada riwayat", - "Import from browser": "Impor dari browser", - "Releases": "Penerbitan", - "Are you sure?": "Apakah anda yakin?", - "Do you really want to delete this note?": "Apakah anda yakin ingin menghapus catatan ini?", - "All users will lose their connection.": "Semua pengguna akan kehilangan koneksi nya", - "Cancel": "Batal", - "Yes, do it!": "Ya, lakukan!", - "Choose method": "Pilih cara", - "Sign in via %s": "Masuk menggunakan %s", - "New": "Baru", - "Publish": "Terbitkan", - "Extra": "Tambahan", - "Revision": "Revisi", - "Slide Mode": "Mode Slide", - "Export": "Ekspor", - "Import": "Impor", - "Clipboard": "Papan Klip", - "Download": "Unduh", - "Raw HTML": "File HTML", - "Edit": "Ubah", - "View": "Lihat", - "Both": "Keduanya", - "Help": "Bantuan", - "Upload Image": "Unggah Gambar", - "Menu": "Menu", - "This page need refresh": "Halaman ini perlu dimuat ulang", - "You have an incompatible client version.": "Versi pramban anda tidak kompatibel", - "Refresh to update.": "Muat ulang untuk memperbarui", - "New version available!": "Versi baru tersedia!", - "See releases notes here": "Lihat catatan penerbitan", - "Refresh to enjoy new features.": "Muat ulang untuk menikmati fitur baru.", - "Your user state has changed.": "Data pengguna anda telah berubah.", - "Refresh to load new user state.": "Muat ulang untuk memuat data baru pengguna.", - "Refresh": "Muat ulang", - "Contacts": "Kontak", - "Report an issue": "Laporkan kesalahan", - "Meet us on %s": "Temui kami di %s", - "Send us email": "Kirim kami email", - "Documents": "Dokumen", - "Features": "Fitur", - "YAML Metadata": "Metadata YML", - "Slide Example": "Contoh Slide", - "Cheatsheet": "Cheatsheet", - "Example": "Contoh", - "Syntax": "Sintaks", - "Header": "Header", - "Unordered List": "Daftar tak ber-urutan", - "Ordered List": "Daftar ber-urutan", - "Todo List": "Centang", - "Blockquote": "Blok kutipan", - "Bold font": "Tebal", - "Italics font": "Miring", - "Strikethrough": "Garis", - "Inserted text": "Teks ber-garis bawah", - "Marked text": "Teks yang disorot", - "Link": "Link", - "Image": "Gambar", - "Code": "Kode", - "Externals": "Eksternal", - "This is a alert area.": "Ini adalah area alert.", - "Revert": "Kembalikan", - "Import from clipboard": "Impor dari papan klip", - "Paste your markdown or webpage here...": "Tempel markdown atau halaman web disini", - "Clear": "Bersihkan", - "This note is locked": "Catatan ini terkunci", - "Sorry, only owner can edit this note.": "Maaf, hanya pemilik yang bisa mengubah catatan ini", - "OK": "OK", - "Reach the limit": "Memenuhi batas", - "Sorry, you've reached the max length this note can be.": "Maaf, anda telah memenuhi batas maksimum jumlah catatan ini", - "Please reduce the content or divide it to more notes, thank you!": "Tolong persingkat catatan nya.", - "Import from Gist": "Impor dari Gist", - "Paste your gist url here...": "Templekan URL gist anda disini...", - "Import from Snippet": "Impor dari Snippet", - "Select From Available Projects": "Pilih dari Project yang tersedia", - "Select From Available Snippets": "Pilih dari Snippet yang tersedia", - "OR": "Atau", - "Export to Snippet": "Ekspor ke Snippet", - "Select Visibility Level": "Pilih tingkat penglihatan", - "Night Theme": "Mode Malam", - "Follow us on %s and %s.": "Ikuti kami di %s, dan %s.", - "Privacy": "Privasi", - "Terms of Use": "Aturan Penggunaan", - "Do you really want to delete your user account?": "Apakah anda yakin ingin menghapus akun anda?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Ini akan menghapus akun anda, semua catatan yang dimiliki oleh anda akan dihapus dan menghapus semua referensi ke akun anda dari catatan lain.", - "Delete user": "Hapus pengguna", - "Export user data": "Ekspor data pengguna", - "Help us translating on %s": "Bantu kami menerjemahkan di %s", - "Source Code": "Sumber Kode", - "Register": "Daftar", - "Powered by %s": "Ditenagai oleh %s", - "Help us translating": "Bantu kami menerjemahkan", - "Join the community": "Bergabung dengan komunitas", - "Imprint": "Jejak" -} \ No newline at end of file diff --git a/locales/it.json b/locales/it.json deleted file mode 100644 index d4e20bb38..000000000 --- a/locales/it.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Note collaborative in markdown", - "Realtime collaborative markdown notes on all platforms.": "Note markdown collaborative in tempo reale per tutte le piattaforme.", - "Best way to write and share your knowledge in markdown.": "Miglior modo per scrivere e condividere le tue conoscenze in markdown.", - "Intro": "Intro", - "History": "Cronologia", - "New guest note": "Nuova nota ospite", - "Collaborate with URL": "Collabora tramite URL", - "Support charts and MathJax": "Supporta grafici e MathJax", - "Support slide mode": "Supporta modalità slide", - "Sign In": "Entra", - "Below is the history from browser": "Qui sotto c'è la cronologia del browser", - "Welcome!": "Benvenuto!", - "New note": "Nuova nota", - "or": "o", - "Sign Out": "Disconettiti", - "Explore all features": "Esplora tutte le funzioni", - "Select tags...": "Seleziona tag...", - "Search keyword...": "Cerca...", - "Sort by title": "Ordina per titolo", - "Title": "Titolo", - "Sort by time": "Ordina per data", - "Time": "Data", - "Export history": "Esporta cronologia", - "Import history": "Importa cronologia", - "Clear history": "Cancella cronologia", - "Refresh history": "Aggiorna cronologia", - "No history": "Nessuna cronologia", - "Import from browser": "Importa da browser", - "Releases": "Versioni", - "Are you sure?": "Sei sicuro?", - "Do you really want to delete this note?": "Vuoi veramente eliminare questa nota?", - "All users will lose their connection.": "Tutti gli utenti perderanno la loro connessione.", - "Cancel": "Annulla", - "Yes, do it!": "SI, fallo!", - "Choose method": "Scegli metodo", - "Sign in via %s": "Entra con %s", - "New": "Nuovo", - "Publish": "Pubblica", - "Extra": "Extra", - "Revision": "Revisione", - "Slide Mode": "Modalità slide", - "Export": "Esporta", - "Import": "Importa", - "Clipboard": "Appunti", - "Download": "Scarica", - "Raw HTML": "Raw HTML", - "Edit": "Modifica", - "View": "Visualizza", - "Both": "Entrambi", - "Help": "Aiuto", - "Upload Image": "Carica Immagine", - "Menu": "Menu", - "This page need refresh": "Questa pagina deve essere aggiornata", - "You have an incompatible client version.": "La versione del tuo client è incompatibile.", - "Refresh to update.": "Ricarica per aggiornare.", - "New version available!": "Nuova versione disponibile!", - "See releases notes here": "Vedi note di rilascio qui", - "Refresh to enjoy new features.": "Ricarica per godere delle nuove funzioni.", - "Your user state has changed.": "Il tuo stato utente è cambiato.", - "Refresh to load new user state.": "Aggiorna per caricare il nuovo stato utente.", - "Refresh": "Ricarica", - "Contacts": "Contatti", - "Report an issue": "Segnala un problema", - "Meet us on %s": "Vieni a trovarci su %s", - "Send us email": "Inviaci una email", - "Documents": "Documenti", - "Features": "Caratteristiche", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Esempio Slide", - "Cheatsheet": "Cheatsheet", - "Example": "Esempio", - "Syntax": "Sintassi", - "Header": "Intestazione", - "Unordered List": "Lista non ordinata", - "Ordered List": "Lista ordinata", - "Todo List": "Elenco", - "Blockquote": "Citazione", - "Bold font": "Grassetto", - "Italics font": "Corsivo", - "Strikethrough": "Barrato", - "Inserted text": "Sottolineato", - "Marked text": "Evidenziato", - "Link": "Link", - "Image": "Immagine", - "Code": "Codice", - "Externals": "Esterni", - "This is a alert area.": "Questa è un area di avviso.", - "Revert": "Annulla", - "Import from clipboard": "Importa dagli appunti", - "Paste your markdown or webpage here...": "Incollare il markdown o una pagina web qui...", - "Clear": "Pulisci", - "This note is locked": "Questa nota è bloccata", - "Sorry, only owner can edit this note.": "Siamo spiacenti, solo il proprietario può modificare questa nota.", - "OK": "OK", - "Reach the limit": "Limite raggiunto", - "Sorry, you've reached the max length this note can be.": "Siamo spiacenti, hai raggiunto la lunghezza massima per questa nota.", - "Please reduce the content or divide it to more notes, thank you!": "Si prega di ridurre il contenuto o dividerlo in più note, grazie!", - "Import from Gist": "Importa da Gist", - "Paste your gist url here...": "Incolla il tuo link gist qui...", - "Import from Snippet": "Importa da Snippet", - "Select From Available Projects": "Seleziona da progetti disponibili", - "Select From Available Snippets": "Seleziona da snippets disponibili", - "OR": "O", - "Export to Snippet": "Esporta Snippet", - "Select Visibility Level": "Seleziona livello visibilità", - "Night Theme": "Tema Scuro", - "Follow us on %s and %s.": "Seguici su %s, e %s.", - "Privacy": "Privacy", - "Terms of Use": "Termini di Utilizzo", - "Do you really want to delete your user account?": "Vuoi veramente cancellare il tuo account utente?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Questo cancellerà il tuo account, tutte le note di cui sei proprietario e rimuoverà i riferimenti al tuo account dalle altre note.", - "Delete user": "Elimina utente", - "Export user data": "Esporta dati utente", - "Help us translating on %s": "Aiutaci nella traduzione su %s", - "Source Code": "Codice Sorgente", - "Register": "Registrati", - "Powered by %s": "Alimentato da %s", - "Help us translating": "Aiutaci nella traduzione", - "Join the community": "Unisciti alla comunità", - "Imprint": "Imprint" -} \ No newline at end of file diff --git a/locales/ja.json b/locales/ja.json deleted file mode 100644 index 0aaf9163d..000000000 --- a/locales/ja.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "共同編集できるMarkdownノート", - "Realtime collaborative markdown notes on all platforms.": "マルチプラットフォーム、リアルタイムで共同編集できるMarkdownノート", - "Best way to write and share your knowledge in markdown.": "Markdownでナレッジを蓄積・共有できるベストツール", - "Intro": "サービスの紹介", - "History": "履歴", - "New guest note": "新規ゲストノート", - "Collaborate with URL": "URLで共同編集", - "Support charts and MathJax": "グラフとMathJaxのサポート", - "Support slide mode": "スライドモードのサポート", - "Sign In": "サインイン", - "Below is the history from browser": "ブラウザからの履歴", - "Welcome!": "ようこそ!", - "New note": "新規ノート", - "or": "または", - "Sign Out": "サインアウト", - "Explore all features": "すべての機能をチェック", - "Select tags...": "タグで検索", - "Search keyword...": "キーワードで検索", - "Sort by title": "タイトル順でソート", - "Title": "タイトル", - "Sort by time": "日時順でソート", - "Time": "日時", - "Export history": "履歴をエクスポート", - "Import history": "履歴をインポート", - "Clear history": "履歴をクリア", - "Refresh history": "履歴を更新", - "No history": "履歴はありません", - "Import from browser": "ブラウザからインポート", - "Releases": "リリース", - "Are you sure?": "本当にいいですか?", - "Do you really want to delete this note?": "本当にこのノートを削除しますか?", - "All users will lose their connection.": "すべてのユーザーの接続が切断されます。", - "Cancel": "キャンセル", - "Yes, do it!": "はい", - "Choose method": "選択してください", - "Sign in via %s": "%sでサインイン", - "New": "新規作成", - "Publish": "公開する", - "Extra": "その他", - "Revision": "編集履歴", - "Slide Mode": "スライドモード", - "Export": "エクスポート", - "Import": "インポート", - "Clipboard": "クリップボード", - "Download": "ダウンロード", - "Raw HTML": "HTMLパーツ", - "Edit": "編集モード", - "View": "表示モード", - "Both": "分割モード", - "Help": "ヘルプ", - "Upload Image": "画像をアップロード", - "Menu": "メニュー", - "This page need refresh": "ページをリロードしてください", - "You have an incompatible client version.": "クライアントのバージョンが一致しません", - "Refresh to update.": "リロードして更新を反映させてください", - "New version available!": "新しいバージョンが利用できます!", - "See releases notes here": "リリースノートをごらんください", - "Refresh to enjoy new features.": "リロードして新しい機能を試してみましょう", - "Your user state has changed.": "ユーザー情報が変更されました", - "Refresh to load new user state.": "リロードすると最新のユーザー情報が反映されます", - "Refresh": "リロード", - "Contacts": "コンタクト", - "Report an issue": "問題を報告する", - "Meet us on %s": "%sでチャットする", - "Send us email": "メールを送る", - "Documents": "ドキュメント", - "Features": "機能", - "YAML Metadata": "YAMLメタデータ", - "Slide Example": "スライドサンプル", - "Cheatsheet": "チートシート", - "Example": "例", - "Syntax": "構文", - "Header": "見出し", - "Unordered List": "番号なしリスト", - "Ordered List": "番号付きリスト", - "Todo List": "TODOリスト", - "Blockquote": "引用文", - "Bold font": "太字", - "Italics font": "斜体", - "Strikethrough": "打ち消し線", - "Inserted text": "挿入文", - "Marked text": "マーカー", - "Link": "リンク", - "Image": "画像", - "Code": "コード", - "Externals": "モジュール", - "This is a alert area.": "これはアラートエリアです", - "Revert": "戻す", - "Import from clipboard": "クリップボードからインポート", - "Paste your markdown or webpage here...": "Markdownまたはウェブページを貼り付けてください", - "Clear": "クリア", - "This note is locked": "このノートはロックされています", - "Sorry, only owner can edit this note.": "このノートはオーナーのみが編集できます", - "OK": "OK", - "Reach the limit": "上限に達しました", - "Sorry, you've reached the max length this note can be.": "ノートの文字数が上限に達しました。", - "Please reduce the content or divide it to more notes, thank you!": "内容を減らすか、別のノートに分けてください", - "Import from Gist": "gistからインポート", - "Paste your gist url here...": "gistのURLを貼り付けてください", - "Import from Snippet": "スニペットからインポート", - "Select From Available Projects": "プロジェクトを一覧から選択してください", - "Select From Available Snippets": "スニペットを一覧から選択してください", - "OR": "または", - "Export to Snippet": "スニペットにエクスポート", - "Select Visibility Level": "公開範囲を選んでください", - "Night Theme": "ナイトテーマ", - "Follow us on %s and %s.": "%s と %s でフォローしてください。", - "Privacy": "プライバシー", - "Terms of Use": "利用条件", - "Do you really want to delete your user account?": "本当にアカウントを削除しますか?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "この操作はあなたのアカウントとあなたの所有するすべてのノートを削除し、さらに他の人のノートからあなたのアカウントへの参照を除去します。", - "Delete user": "ユーザーの削除", - "Export user data": "ユーザーデータをエクスポート", - "Help us translating on %s": "%s の翻訳にご協力ください", - "Source Code": "ソースコード", - "Register": "登録", - "Powered by %s": "Powered by %s", - "Help us translating": "翻訳のお手伝いをお願いします", - "Join the community": "コミュニティに参加しましょう", - "Imprint": "インプリント" -} \ No newline at end of file diff --git a/locales/ko.json b/locales/ko.json deleted file mode 100644 index a1df7b9d6..000000000 --- a/locales/ko.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "Collaborative markdown notes": "협동 마크다운 노트", - "Realtime collaborative markdown notes on all platforms.": "실시간으로 모든 플랫폼에서 마크다운 노트를 함께 작성해보세요.", - "Best way to write and share your knowledge in markdown.": "마크다운을 쓰고 공유하는 최고의 플랫폼입니다.", - "Intro": "소개", - "History": "기록", - "New guest note": "새 손님 노트", - "Collaborate with URL": "URL을 통한 실시간 협업", - "Support charts and MathJax": "차트와 MathJax 지원", - "Support slide mode": "슬라이드 모드 지원", - "Sign In": "로그인", - "Below is the history from browser": "아래는 이 브라우저에서 찾은 기록입니다.", - "Welcome!": "환영합니다!", - "New note": "새 노트", - "or": "또는", - "Sign Out": "로그아웃", - "Explore all features": "모든 기능 둘러보기", - "Select tags...": "태그 선택하기", - "Search keyword...": "키워드 검색하기", - "Sort by title": "제목 기준 정렬", - "Title": "제목", - "Sort by time": "시간 기준 정렬", - "Time": "시간", - "Export history": "기록 내보내기", - "Import history": "기록 불러오기", - "Clear history": "기록 초기화", - "Refresh history": "기록 새로고침", - "No history": "기록 없음", - "Import from browser": "브라우저에서 불러오기", - "Releases": "릴리즈", - "Are you sure?": "확실합니까?", - "Do you really want to delete this note?": "정말로 이 노트를 삭제하시겠습니까?", - "All users will lose their connection.": "모든 사용자의 연결이 끊어집니다.", - "Cancel": "취소", - "Yes, do it!": "네", - "Choose method": "방법 선택", - "Sign in via %s": "%s으로 로그인", - "New": "새", - "Publish": "공개하기", - "Extra": "추가", - "Revision": "기록", - "Slide Mode": "슬라이드 모드", - "Export": "내보내기", - "Import": "들여오기", - "Clipboard": "클립보드", - "Download": "다운로드", - "Raw HTML": "순수 HTML", - "Edit": "수정", - "View": "보기", - "Both": "한번에", - "Help": "도움말", - "Upload Image": "이미지 업로드", - "Menu": "메뉴", - "This page need refresh": "새로고침이 필요합니다", - "You have an incompatible client version.": "호환되지 않는 클라이언트입니다.", - "Refresh to update.": "새로고침하기", - "New version available!": "새로운 버전이 있습니다!", - "See releases notes here": "릴리즈 노트를 읽어보세요", - "Refresh to enjoy new features.": "새로운 기능을 즐기려면 새로고침하십시오", - "Your user state has changed.": "유저 상태가 변경되었습니다.", - "Refresh to load new user state.": "새로고침하여 새로운 유저 상태를 적용합니다.", - "Refresh": "새로고침", - "Contacts": "연락처", - "Report an issue": "이슈 보고하기", - "Meet us on %s": "%s에서 만나보세요", - "Send us email": "이메일 보내기", - "Documents": "문서", - "Features": "기능", - "YAML Metadata": "YAML 속성", - "Slide Example": "슬라이드 예제", - "Cheatsheet": "치트시트", - "Example": "예시", - "Syntax": "문법", - "Header": "머리글", - "Unordered List": "순서 없는 목록", - "Ordered List": "순서 있는 목록", - "Todo List": "체크리스트", - "Blockquote": "인용문", - "Bold font": "굵게", - "Italics font": "기울임", - "Strikethrough": "취소선", - "Inserted text": "밑줄", - "Marked text": "강조", - "Link": "링크", - "Image": "이미지", - "Code": "코드", - "Externals": "외부 서비스 연동", - "This is a alert area.": "여기는 알림 공간입니다.", - "Revert": "되돌리기", - "Import from clipboard": "클립보드에서 불러오기", - "Paste your markdown or webpage here...": "마크다운이나 웹페이지 붙여넣기", - "Clear": "Clear", - "This note is locked": "이 노트는 잠겨있습니다.", - "Sorry, only owner can edit this note.": "죄송하지만 소유자만 이 노트를 수정할 수 있습니다.", - "OK": "확인", - "Reach the limit": "한계에 도달", - "Sorry, you've reached the max length this note can be.": "죄송합니다. 노트 최대 길이를 초과하였습니다.", - "Please reduce the content or divide it to more notes, thank you!": "노트 길이를 줄여주십시오.", - "Import from Gist": "Gist에서 불러오기", - "Paste your gist url here...": "Gist URL을 입력하세요", - "Import from Snippet": "Import from Snippet", - "Select From Available Projects": "가능한 프로젝트 중 선택", - "Select From Available Snippets": "Select From Available Snippets", - "OR": "또는", - "Export to Snippet": "Export to Snippet", - "Select Visibility Level": "Select Visibility Level", - "Night Theme": "다크 테마", - "Follow us on %s and %s.": "%s과 %s에서 저희를 팔로우해보세요", - "Privacy": "Privacy", - "Terms of Use": "Terms of Use", - "Do you really want to delete your user account?": "Do you really want to delete your user account?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.", - "Delete user": "Delete user", - "Export user data": "Export user data", - "Help us translating on %s": "%s에서 번역으로 저희를 도와주세요", - "Source Code": "Source Code" -} \ No newline at end of file diff --git a/locales/nl.json b/locales/nl.json deleted file mode 100644 index 250153bbd..000000000 --- a/locales/nl.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Samenwerkende markdown notities", - "Realtime collaborative markdown notes on all platforms.": "Realtime samenwerkende markdown notities.", - "Best way to write and share your knowledge in markdown.": "De beste manier om je kennis vast te leggen en te delen. ", - "Intro": "Introductie", - "History": "Geschiedenis", - "New guest note": "Nieuwe gastnotitie", - "Collaborate with URL": "Samenwerken met URL", - "Support charts and MathJax": "Ondersteunt grafieken en MathJax", - "Support slide mode": "Ondersteunt presentatiemodus", - "Sign In": "Inloggen", - "Below is the history from browser": "Hier onder staat de browser geschiedenis", - "Welcome!": "Welkom!", - "New note": "Nieuwe notitie", - "or": "of", - "Sign Out": "Uitloggen", - "Explore all features": "Ontdek alle features", - "Select tags...": "Selecteer tags...", - "Search keyword...": "Zoeken op keyword...", - "Sort by title": "Sorteren op titel", - "Title": "Titel", - "Sort by time": "Sorteren op tijd", - "Time": "Tijd", - "Export history": "Exporteer geschiedenis", - "Import history": "Importeer geschiedenis", - "Clear history": "Verwijder geschiedenis", - "Refresh history": "Ververs geschiedenis", - "No history": "Geen geschidenis gevonden", - "Import from browser": "Importeer van browser", - "Releases": "Versies", - "Are you sure?": "Weet je het zeker?", - "Do you really want to delete this note?": "Will je deze notitie echt verwijderen?", - "All users will lose their connection.": "Alle gebruikers zullen hun verbinding verliezen.", - "Cancel": "Stoppen", - "Yes, do it!": "Ja, doe het!", - "Choose method": "Kies methode", - "Sign in via %s": "Log in via %s", - "New": "Nieuw", - "Publish": "Publiceren", - "Extra": "Extra", - "Revision": "Versie", - "Slide Mode": "Presentatiemodus", - "Export": "Exporteer", - "Import": "Importeren", - "Clipboard": "Kladbord", - "Download": "Downloaden", - "Raw HTML": "Ruwe HTML", - "Edit": "Aanpassen", - "View": "Bekijken", - "Both": "Beide", - "Help": "Help", - "Upload Image": "Afbeelding uploaden", - "Menu": "Menu", - "This page need refresh": "Deze pagina moet vernieuwd worden", - "You have an incompatible client version.": "Je client is niet compatibel.", - "Refresh to update.": "Ververs om te updaten.", - "New version available!": "Nieuwe versie beschikbaar!", - "See releases notes here": "Bekijk de release notes hier", - "Refresh to enjoy new features.": "Ververs om de nieuwe features te zien.", - "Your user state has changed.": "Je gebruikers-status is veranderd.", - "Refresh to load new user state.": "Ververs om je nieuwe gebruikers-status te zien.", - "Refresh": "Ververs", - "Contacts": "Contacten", - "Report an issue": "Probleem rapporteren", - "Meet us on %s": "Ontmoet ons op %s", - "Send us email": "Stuur ons een mail", - "Documents": "Documenten", - "Features": "Features", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Slide Voorbeeld", - "Cheatsheet": "Spiekbrief", - "Example": "Voorbeeld", - "Syntax": "Syntax", - "Header": "Koptekst", - "Unordered List": "Ongesorteerde Lijst", - "Ordered List": "Gesorteerde List", - "Todo List": "Todo Lijst", - "Blockquote": "Citaat", - "Bold font": "Vette tekst", - "Italics font": "Schuine tekst van maken", - "Strikethrough": "Doorstreepte tekst", - "Inserted text": "Onderstreepte tekst", - "Marked text": "Gemarkeerde tekst", - "Link": "Link", - "Image": "Afbeelding", - "Code": "Code", - "Externals": "Uiterlijkheden", - "This is a alert area.": "Dit is een waarschuwingsgebied.", - "Revert": "Terugzetten", - "Import from clipboard": "Importeren from kladbord", - "Paste your markdown or webpage here...": "Plak je markdown of webpagina hier...", - "Clear": "Legen", - "This note is locked": "Deze notitie is vergrendeld", - "Sorry, only owner can edit this note.": "Sorry, alleen de eigenaar kan deze notitie aanpassen.", - "OK": "OK", - "Reach the limit": "Limiet bereikt", - "Sorry, you've reached the max length this note can be.": "Sorry, je notitie heeft de maximale lengte bereikt.", - "Please reduce the content or divide it to more notes, thank you!": "Verwijder alsjeblieft wat tekst of verdeel het over meerdere notities!", - "Import from Gist": "Importeren vanaf een Gist", - "Paste your gist url here...": "Plak je Gist URL hier...", - "Import from Snippet": "Imporeren vanaf een Snippet", - "Select From Available Projects": "Selecteer van beschikbare projecten", - "Select From Available Snippets": "Selecteer van beschikbare Snippets", - "OR": "OF", - "Export to Snippet": "Exporteren naar Snippet", - "Select Visibility Level": "Selecteer zichtbaarheids niveau", - "Night Theme": "Donkere modus", - "Follow us on %s and %s.": "Volg ons op %s en %s.", - "Privacy": "Privacy", - "Terms of Use": "Gebruikersvoorwaarden", - "Do you really want to delete your user account?": "Weet je zeker dat je je account wilt verwijderen?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Dit zal je account verwijderen. Alle notities waar je eigenaar van bent worden verwijderd, samen met alle verwijzingen naar je account.", - "Delete user": "Gebruiker verwijderen", - "Export user data": "Gebruikersdata exporteren", - "Help us translating on %s": "Help ons vertalen op %s", - "Source Code": "Broncode", - "Register": "Registreren", - "Powered by %s": "Powered by %s", - "Help us translating": "Help ons vertalen", - "Join the community": "Lid worden", - "Imprint": "Afdruk" -} \ No newline at end of file diff --git a/locales/pl.json b/locales/pl.json deleted file mode 100644 index 0eeb1b5e3..000000000 --- a/locales/pl.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Wspólne markdown notatki", - "Realtime collaborative markdown notes on all platforms.": "Rzeczywiste wspólne markdown notatki dla wszystkich platform", - "Best way to write and share your knowledge in markdown.": "Najlepszy sposób na pisanie i dzielenie się swoją wiedzą w markdown.", - "Intro": "Intro", - "History": "Historia", - "New guest note": "Nowa notatka gościa", - "Collaborate with URL": "Kolaboracja w czasie rzeczywistym", - "Support charts and MathJax": "Kompatybilne z wykresami oraz MathJax", - "Support slide mode": "Obsługuje tryb slajdów", - "Sign In": "Zaloguj się", - "Below is the history from browser": "Historia z przeglądarki poniżej", - "Welcome!": "Witam!", - "New note": "Nowa notatka", - "or": "lub", - "Sign Out": "Wyloguj się", - "Explore all features": "Przeglądaj wszystkie funkcje", - "Select tags...": "Wybierz tagi...", - "Search keyword...": "Znajdź kluczowe słowo...", - "Sort by title": "Sortuj według tytułu", - "Title": "Tytuł", - "Sort by time": "Sortuj według czasu", - "Time": "Czas", - "Export history": "Eksportuj historię", - "Import history": "Importuj historię", - "Clear history": "Wyczyść historię", - "Refresh history": "Odśwież historię", - "No history": "Brak historii", - "Import from browser": "Importuj z przeglądarki", - "Releases": "Wydania", - "Are you sure?": "Jesteś pewny?", - "Do you really want to delete this note?": "Czy chcesz usunąć tą notatkę?", - "All users will lose their connection.": "Wszyscy użytkownicy stracą swoje połączenie.", - "Cancel": "Anuluj", - "Yes, do it!": "Tak, zrób to!", - "Choose method": "Wybierz metodę", - "Sign in via %s": "Zaloguj się poprzez %s", - "New": "Nowy", - "Publish": "Publikuj", - "Extra": "Ekstra", - "Revision": "Korekta", - "Slide Mode": "Tryb slajdów", - "Export": "Eksport", - "Import": "Import", - "Clipboard": "Schowek", - "Download": "Pobierz", - "Raw HTML": "Raw HTML", - "Edit": "Edytuj", - "View": "Pogląd", - "Both": "Both", - "Help": "Pomoc", - "Upload Image": "Prześlij zdjęcie", - "Menu": "Menu", - "This page need refresh": "Strona wymaga odświeżenia", - "You have an incompatible client version.": "Posiadasz niezgodną wersję kliencką.", - "Refresh to update.": "Odświerz aby zaktualizować.", - "New version available!": "Nowa wersja dostępna!", - "See releases notes here": "Zobacz informacje o wydaniach tutaj", - "Refresh to enjoy new features.": "Odśwież, aby korzystać z nowych funkcji.", - "Your user state has changed.": "Stan twojego użytkownika się zmienił.", - "Refresh to load new user state.": "Odśwież aby załadować nowy stan użytkownika.", - "Refresh": "Odśwież", - "Contacts": "Kontakty", - "Report an issue": "Zgłoś błąd", - "Meet us on %s": "Spotkaj się z nami na %s", - "Send us email": "Wyślij nam email", - "Documents": "Dokumenty", - "Features": "Funkcje", - "YAML Metadata": "YAML Meta dane", - "Slide Example": "Przykład slajdu", - "Cheatsheet": "Ściągawka", - "Example": "Przykład", - "Syntax": "Składnia", - "Header": "Nagłówek", - "Unordered List": "Nie posortowana lista", - "Ordered List": "Posortowana lista", - "Todo List": "Todo lista", - "Blockquote": "Cytat blokowy", - "Bold font": "Czcionka pogrubiona", - "Italics font": "Czcionka pochylona", - "Strikethrough": "Przekreślenie", - "Inserted text": "Wstawiony tekst", - "Marked text": "Zaznaczony tekst", - "Link": "Odnośnik", - "Image": "Zdjęcie", - "Code": "Kod", - "Externals": "Zewnętrzne", - "This is a alert area.": "This is a alert area.", - "Revert": "Cofnij", - "Import from clipboard": "Importuj ze schowka", - "Paste your markdown or webpage here...": "Wklej markdown lub stronę tutaj...", - "Clear": "Wyczyść", - "This note is locked": "Notatka jest zablokowana", - "Sorry, only owner can edit this note.": "Tylko właściciel może edytować tą notatkę.", - "OK": "OK", - "Reach the limit": "Osiągnięto limit", - "Sorry, you've reached the max length this note can be.": "Niestety, osiągnięto maksymalną długość notatki.", - "Please reduce the content or divide it to more notes, thank you!": "Proszę zmniejszyć zawartość notatki lub podzielić ją na kilka notatek, dziękuję!", - "Import from Gist": "Importuj z Gist", - "Paste your gist url here...": "Wklej gist url tutaj...", - "Import from Snippet": "Importuj z Snippet", - "Select From Available Projects": "Wybierz z dostępnych projektów", - "Select From Available Snippets": "Wybierz z dostępnych Snippets", - "OR": "LUB", - "Export to Snippet": "Eksportuj do Snippet", - "Select Visibility Level": "Wybierz poziom widoczności", - "Night Theme": "Motyw Nocny", - "Follow us on %s and %s.": "Znajdź nas na %s oraz %s.", - "Privacy": "Prywatność", - "Terms of Use": "Warunki korzystania", - "Do you really want to delete your user account?": "Czy chcesz usunąć swoje konto użytkownika?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Ta akcja usunie twoje konto, wszystkie notatki które posiadasz oraz wszystkie referencje do tego konta w twoich pozostałych notatkach.", - "Delete user": "Usuń użytkownika", - "Export user data": "Eksportuj dane użytkownika", - "Help us translating on %s": "Pomóż nam przetłumaczyć na język %s", - "Source Code": "Kod źródłowy", - "Register": "Zarejestruj", - "Powered by %s": "Wspierany przez %s", - "Help us translating": "Pomóż nam w tłumaczeniu", - "Join the community": "Dołącz do społeczności", - "Imprint": "Impressum" -} \ No newline at end of file diff --git a/locales/pt.json b/locales/pt.json deleted file mode 100644 index 799feea63..000000000 --- a/locales/pt.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Notas em Markdown colaborativas", - "Realtime collaborative markdown notes on all platforms.": "Notas colaborativas em Markdown para todas as plataformas.", - "Best way to write and share your knowledge in markdown.": "A melhor forma de escrever e compartilhar seu conhecimento em Markdown.", - "Intro": "Introdução", - "History": "Histórico", - "New guest note": "Nova nota como convidado", - "Collaborate with URL": "Colaborar via URL", - "Support charts and MathJax": "Suporte para gráficos e MathJax", - "Support slide mode": "Suporte para modo apresentação", - "Sign In": "Entrar", - "Below is the history from browser": "A seguir está o histórico do navegador", - "Welcome!": "Bem vindo!", - "New note": "Nova nota", - "or": "ou", - "Sign Out": "Sair", - "Explore all features": "Explore todas as funções", - "Select tags...": "Selecionar etiquetas...", - "Search keyword...": "Buscar palavra-chave...", - "Sort by title": "Ordenar por título", - "Title": "Título", - "Sort by time": "Ordenar por hora", - "Time": "Hora", - "Export history": "Exportar histórico", - "Import history": "Importar histórico", - "Clear history": "Apagar histórico", - "Refresh history": "Atualizar histórico", - "No history": "Nenhum histórico", - "Import from browser": "Importar do navegador", - "Releases": "Lançamentos", - "Are you sure?": "Tem certeza?", - "Do you really want to delete this note?": "Do you really want to delete this note?", - "All users will lose their connection.": "All users will lose their connection.", - "Cancel": "Cancelar", - "Yes, do it!": "Sim, faça!", - "Choose method": "Escolher método", - "Sign in via %s": "Entrar via %s", - "New": "Novo", - "Publish": "Publicar", - "Extra": "Extra", - "Revision": "Revisão", - "Slide Mode": "Modo Apresentação", - "Export": "Exportar", - "Import": "Importar", - "Clipboard": "Área de transferência", - "Download": "Baixar", - "Raw HTML": "HTML puro", - "Edit": "Editar", - "View": "Ver", - "Both": "Ambos", - "Help": "Ajuda", - "Upload Image": "Carregar Imagem", - "Menu": "Menu", - "This page need refresh": "Esta página precisa ser recarregada", - "You have an incompatible client version.": "Você tem uma versão incompatível do cliente.", - "Refresh to update.": "Recarregar para atualizar.", - "New version available!": "Nova versão disponível!", - "See releases notes here": "Veja notas de lançamento aqui", - "Refresh to enjoy new features.": "Atualize para usar as novas funções.", - "Your user state has changed.": "O estado do seu usuário mudou.", - "Refresh to load new user state.": "Atualize para carregar o novo estado do usuário.", - "Refresh": "Recarregar", - "Contacts": "Contatos", - "Report an issue": "Relatar um problema", - "Meet us on %s": "Meet us on %s", - "Send us email": "Envie-nos um email", - "Documents": "Documentos", - "Features": "Funções", - "YAML Metadata": "Metadados YAML", - "Slide Example": "Exemplo de Apresentação", - "Cheatsheet": "Dicas", - "Example": "Exemplo", - "Syntax": "Sintaxe", - "Header": "Cabeçalho", - "Unordered List": "Lista não ordenada", - "Ordered List": "Lista ordenada", - "Todo List": "Lista de tarefas", - "Blockquote": "Citação", - "Bold font": "Fonte negrito", - "Italics font": "Fonte itálico", - "Strikethrough": "Tachado", - "Inserted text": "Texto inserido", - "Marked text": "Texto marcado", - "Link": "Ligação", - "Image": "Imagem", - "Code": "Código", - "Externals": "Externos", - "This is a alert area.": "Esta é uma área de alerta.", - "Revert": "Reverter", - "Import from clipboard": "Importar da área de transferência", - "Paste your markdown or webpage here...": "Cole seu markdown ou página web aqui...", - "Clear": "Limpar", - "This note is locked": "Esta nota está bloqueada", - "Sorry, only owner can edit this note.": "Desculpe, somente o dono pode editar esta nota.", - "OK": "OK", - "Reach the limit": "Alcançou o limite", - "Sorry, you've reached the max length this note can be.": "Desculpe, você alcançou o tamanho máximo que esta nota pode ter.", - "Please reduce the content or divide it to more notes, thank you!": "Por favor reduza o conteúdo ou divida em mais de uma nota, obrigado!", - "Import from Gist": "Importar de um Gist", - "Paste your gist url here...": "Cole a URL de seu Gist aqui...", - "Import from Snippet": "Importar de Snippet", - "Select From Available Projects": "Selecionar de Projetos Disponíveis", - "Select From Available Snippets": "Selecionar de Snippets Disponíveis", - "OR": "OU", - "Export to Snippet": "Exportar para Snippet", - "Select Visibility Level": "Selecionar Nível de Visibilidade", - "Night Theme": "Night Theme", - "Follow us on %s and %s.": "Follow us on %s, and %s.", - "Privacy": "Privacy", - "Terms of Use": "Terms of Use", - "Do you really want to delete your user account?": "Do you really want to delete your user account?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.", - "Delete user": "Delete user", - "Export user data": "Export user data", - "Help us translating on %s": "Help us translating on %s", - "Source Code": "Source Code", - "Register": "Register", - "Powered by %s": "Powered by %s", - "Help us translating": "Help us translating", - "Join the community": "Join the community", - "Imprint": "Imprint" -} \ No newline at end of file diff --git a/locales/ru.json b/locales/ru.json deleted file mode 100644 index e11be5a07..000000000 --- a/locales/ru.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Совместные markdown заметки", - "Realtime collaborative markdown notes on all platforms.": "Совместные markdown заметки в режиме реального времени на всех платформах.", - "Best way to write and share your knowledge in markdown.": "Лучший способ записывать свои знания и делиться ими в формате markdown.", - "Intro": "Введение", - "History": "История", - "New guest note": "Новая гостевая заметка", - "Collaborate with URL": "Сотрудничество по ссылке", - "Support charts and MathJax": "Поддержка графиков и MathJax", - "Support slide mode": "Поддержка режима слайдера", - "Sign In": "Войти", - "Below is the history from browser": "Ниже приводится история браузера", - "Welcome!": "Добро пожаловать!", - "New note": "Новая заметка", - "or": "или", - "Sign Out": "Выйти", - "Explore all features": "Изучите все возможности", - "Select tags...": "Выберите теги...", - "Search keyword...": "Поиск...", - "Sort by title": "Сортировка по заголовку", - "Title": "Заголовок", - "Sort by time": "Сортировка по времени", - "Time": "Время", - "Export history": "Экспорт истории", - "Import history": "Импорт истории", - "Clear history": "Очистить историю", - "Refresh history": "Обновить историю", - "No history": "Нет истории", - "Import from browser": "Импорт из браузера", - "Releases": "Релизы", - "Are you sure?": "Вы уверены?", - "Do you really want to delete this note?": "Вы точно хотите удалить эту заметку?", - "All users will lose their connection.": "Все пользователи потеряют соединение.", - "Cancel": "Отмена", - "Yes, do it!": "Да, сделать это!", - "Choose method": "Выберите метод", - "Sign in via %s": "Войти с помощью %s", - "New": "Новая", - "Publish": "Опубликовать", - "Extra": "Дополнительно", - "Revision": "Изменения", - "Slide Mode": "Режим слайдера", - "Export": "Экспорт", - "Import": "Импорт", - "Clipboard": "Буфер обмена", - "Download": "Скачать", - "Raw HTML": "Raw HTML", - "Edit": "Редактировать", - "View": "Посмотреть", - "Both": "И то и другое", - "Help": "Помощь", - "Upload Image": "Загрузить изображение", - "Menu": "Меню", - "This page need refresh": "Эту страницу необходимо обновить", - "You have an incompatible client version.": "Вы используете несовместимую версию клиента.", - "Refresh to update.": "Обновите страницу для обновления клиента.", - "New version available!": "Доступна новая версия!", - "See releases notes here": "Смотрите подробности обновлений здесь", - "Refresh to enjoy new features.": "Обновите, чтобы наслаждаться новыми возможностями.", - "Your user state has changed.": "Ваш аккаунт изменен.", - "Refresh to load new user state.": "Обновите, чтобы загрузить изменения аккаунта.", - "Refresh": "Обновить", - "Contacts": "Контакты", - "Report an issue": "Сообщить о проблеме", - "Meet us on %s": "Познакомьтесь с нами в %s", - "Send us email": "Отправить нам письмо", - "Documents": "Документы", - "Features": "Особенности", - "YAML Metadata": "Метаданные YAML", - "Slide Example": "Пример слайдера", - "Cheatsheet": "Шпаргалка", - "Example": "Пример", - "Syntax": "Синтаксис", - "Header": "Заголовок", - "Unordered List": "Маркированный список", - "Ordered List": "Нумерованный список", - "Todo List": "Список дел", - "Blockquote": "Цитата", - "Bold font": "Жирный шрифт", - "Italics font": "Курсив", - "Strikethrough": "Зачеркнутый", - "Inserted text": "Подчеркнутый текст", - "Marked text": "Выделенный текст", - "Link": "Ссылка", - "Image": "Изображение", - "Code": "Код", - "Externals": "Внешнее", - "This is a alert area.": "Это уведомление.", - "Revert": "Отменить", - "Import from clipboard": "Импорт из буфера обмена", - "Paste your markdown or webpage here...": "Вставьте ваш markdown код или веб-страницу здесь...", - "Clear": "Очистить", - "This note is locked": "Эта заметка заблокирована", - "Sorry, only owner can edit this note.": "К сожалению, только автор может редактировать эту заметку.", - "OK": "OK", - "Reach the limit": "Вы достигли лимита", - "Sorry, you've reached the max length this note can be.": "К сожалению, вы достигли максимальной длины заметки.", - "Please reduce the content or divide it to more notes, thank you!": "Пожалуйста, уменьшите размер содержимого или разделите его на несколько заметок, спасибо!", - "Import from Gist": "Импорт из Gist", - "Paste your gist url here...": "Вставьте ссылку на ваш gist здесь...", - "Import from Snippet": "Импорт фрагмента кода", - "Select From Available Projects": "Выберите из доступных проектов", - "Select From Available Snippets": "Выберите из доступных фрагментов кода", - "OR": "ИЛИ", - "Export to Snippet": "Экспорт фрагмента кода", - "Select Visibility Level": "Выберите уровень видимости", - "Night Theme": "Тёмная тема", - "Follow us on %s and %s.": "Подпишитесь на нас в %s и %s.", - "Privacy": "Безопасность", - "Terms of Use": "Условия использования", - "Do you really want to delete your user account?": "Вы точно хотите удалить свою учётную запись?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Это действие удалит вашу учётную запись, все ваши заметки и удалит все ссылки на вашу учетную запись из других заметок.", - "Delete user": "Удалить пользователя", - "Export user data": "Экспортировать данные пользователя", - "Help us translating on %s": "Помогите нам перевести %s", - "Source Code": "Исходный код", - "Register": "Регистрация", - "Powered by %s": "Powered by %s", - "Help us translating": "Помочь с переводом", - "Join the community": "Присоединиться к сообществу", - "Imprint": "Imprint" -} \ No newline at end of file diff --git a/locales/sk.json b/locales/sk.json deleted file mode 100644 index 6c2891a4e..000000000 --- a/locales/sk.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Kolaboratívne markdown poznámky", - "Realtime collaborative markdown notes on all platforms.": "Spolupracujte na markdown poznámkach na všetkých platformách v reálnom čase.", - "Best way to write and share your knowledge in markdown.": "Nejlepšia platforma pre tvorbu a zdieľanie vašich znalostí v markdown.", - "Intro": "Intro", - "History": "História", - "New guest note": "Nová poznámka hosťa", - "Collaborate with URL": "Spolupráca v reálnom čase", - "Support charts and MathJax": "Funguje s grafmi a MathJax", - "Support slide mode": "Podporuje prezentačný režim", - "Sign In": "Prihlásiť sa", - "Below is the history from browser": "Nižšie je história z tohto prehliadača", - "Welcome!": "Vitajte!", - "New note": "Nová poznámka", - "or": "alebo", - "Sign Out": "Odhlásiť sa", - "Explore all features": "Preskúmať všetky funkcie", - "Select tags...": "Zvoliť štítky…", - "Search keyword...": "Vyhľadať klúčové slovo …", - "Sort by title": "Zoradiť podľa názvu", - "Title": "Názov", - "Sort by time": "Zoradiť podľa času", - "Time": "Čas", - "Export history": "Exportovať históriu", - "Import history": "Importovať históriu", - "Clear history": "Odstrániť históriu", - "Refresh history": "Aktualizovať históriu", - "No history": "Žiadna história", - "Import from browser": "Importovať z prehliadača", - "Releases": "Vydania", - "Are you sure?": "Ste si istý?", - "Do you really want to delete this note?": "Naozaj chcete odstrániť túto poznámku?", - "All users will lose their connection.": "Všetci používatelia stratia spojenie.", - "Cancel": "Späť", - "Yes, do it!": "Áno, pokračovať!", - "Choose method": "Zvoliť spôsob", - "Sign in via %s": "Prihlásiť sa cez %s", - "New": "Nová", - "Publish": "Publikovať", - "Extra": "Extra", - "Revision": "Revízia", - "Slide Mode": "Prezentačný režim", - "Export": "Export", - "Import": "Import", - "Clipboard": "Schránka", - "Download": "Stiahnuť", - "Raw HTML": "Raw HTML", - "Edit": "Editovať", - "View": "Zobraziť", - "Both": "Oboje", - "Help": "Pomoc", - "Upload Image": "Nahrať obrázok", - "Menu": "Menu", - "This page need refresh": "Túto stránku je potrebné znovu načítať", - "You have an incompatible client version.": "Verzia vášho klienta nie je kompatibilná.", - "Refresh to update.": "Znovu načítať a aktualizovať", - "New version available!": "Je dostupná nová verzia!", - "See releases notes here": "Pozrite si poznmáky k vydaniu tu", - "Refresh to enjoy new features.": "Znovu načítať a začať si uzívať nové funkcie.", - "Your user state has changed.": "Váš užívateľský stav sa zmenil.", - "Refresh to load new user state.": "Znovu načítať a nahrať užívateľský stav", - "Refresh": "Znovu načítať", - "Contacts": "Kontakty", - "Report an issue": "Nahlásiť problém", - "Meet us on %s": "Stretnite nás na %s", - "Send us email": "Pošlite nám email", - "Documents": "Dokumenty", - "Features": "Funkcie", - "YAML Metadata": "YAML metadáta", - "Slide Example": "Príklad prezentácie", - "Cheatsheet": "Ťahák", - "Example": "Príklad", - "Syntax": "Syntax", - "Header": "Hlavička", - "Unordered List": "Nečíslovaný zoznam", - "Ordered List": "Číslovaný zoznam", - "Todo List": "Kontrolný zoznam", - "Blockquote": "Citácia", - "Bold font": "Tučne", - "Italics font": "Kurzíva", - "Strikethrough": "Preškrtnuté", - "Inserted text": "Vložený text", - "Marked text": "Zvýraznený text", - "Link": "Odkaz", - "Image": "Obrázok", - "Code": "Kód", - "Externals": "Externé", - "This is a alert area.": "Toto je oblasť upozornení.", - "Revert": "Vrátiť", - "Import from clipboard": "Importovať zo schránky", - "Paste your markdown or webpage here...": "Sem vložte váš markdown alebo webovú stránku…", - "Clear": "Vyčistiť", - "This note is locked": "Táto poznámka je zamknutá", - "Sorry, only owner can edit this note.": "Prepáčte, túto poznámku môže editovať iba vlastník.", - "OK": "OK", - "Reach the limit": "Dosiahnutie limitu", - "Sorry, you've reached the max length this note can be.": "Ospravedlňujeme sa, dosiahli ste maximálnu dĺžku poznámky.", - "Please reduce the content or divide it to more notes, thank you!": "Prosím skráťte poznámku.", - "Import from Gist": "Importovať z Gist", - "Paste your gist url here...": "Sem vložte vašu gist url…", - "Import from Snippet": "Importovať zo Snippet", - "Select From Available Projects": "Zvoliť z dostupných projektov", - "Select From Available Snippets": "Zvoliť z dostupných úryvkov", - "OR": "ALEBO", - "Export to Snippet": "Exportovať do úryvku", - "Select Visibility Level": "Zvoliť úroveň viditeľnosti", - "Night Theme": "Nočná téma", - "Follow us on %s and %s.": "Sledujte nás na %s, a %s.", - "Privacy": "Súkromie", - "Terms of Use": "Podmienky použitia", - "Do you really want to delete your user account?": "Naozaj chcete zmazať váš používateľský účet?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Táto operácia odstráni váš účet, všetky poznámky, ktoré vlastníte, a tiež odstráni všetky odkazy na váš účet z iných poznámok.", - "Delete user": "Zmazať používateľa", - "Export user data": "Exportovať používateľské dáta", - "Help us translating on %s": "Help us translating on %s", - "Source Code": "Zdrojový kód", - "Register": "Registrovať", - "Powered by %s": "Powered by %s", - "Help us translating": "Pomôžte nám s prekladom", - "Join the community": "Pripojiť sa ku komunite", - "Imprint": "Odtlačok" -} \ No newline at end of file diff --git a/locales/sr.json b/locales/sr.json deleted file mode 100644 index ef81feffe..000000000 --- a/locales/sr.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "Collaborative markdown notes": "Дељене белешке у Markdown формату", - "Realtime collaborative markdown notes on all platforms.": "Заједнички рад на markdown тексту у реалном времену, на свим платформама", - "Best way to write and share your knowledge in markdown.": "Савршен начин за писање и дељење знања у markdown формату", - "Intro": "Увод", - "History": "Историја", - "New guest note": "Нова белешка госта", - "Collaborate with URL": "Сарадња уз помоћ URL-а", - "Support charts and MathJax": "Подршка за графиконе и MathJax", - "Support slide mode": "Подршка за слајдове и презентације", - "Sign In": "Пријави се", - "Below is the history from browser": "Ниже је историјат преузет из прегледача", - "Welcome!": "Добродошли!", - "New note": "Нова белешка", - "or": "или", - "Sign Out": "Одјави се", - "Explore all features": "Истражи све могућности", - "Select tags...": "Одабери тагове...", - "Search keyword...": "Претрага по кључној речи...", - "Sort by title": "Редослед по наслову", - "Title": "Наслов", - "Sort by time": "Редослед по времену", - "Time": "време", - "Export history": "Извези историјат", - "Import history": "Увези историјат", - "Clear history": "Очисти историју", - "Refresh history": "Освежи историју", - "No history": "Нема историје", - "Import from browser": "Увези из прегледача", - "Releases": "Издања", - "Are you sure?": "Јесте ли сигурни?", - "Do you really want to delete this note?": "Да ли заиста желите да обришете ову белешку?", - "All users will lose their connection.": "Сви корисници ће изгубити везу у реалном времену.", - "Cancel": "Одустани", - "Yes, do it!": "Да, уради!", - "Choose method": "Изаберите начин", - "Sign in via %s": "Пријави се уз %s", - "New": "Ново", - "Publish": "Објави", - "Extra": "Додатно", - "Revision": "Ревизија", - "Slide Mode": "Презентациони мод", - "Export": "Извоз", - "Import": "Увоз", - "Clipboard": "Клипборд", - "Download": "Преузимање", - "Raw HTML": "Сирови HTML", - "Edit": "Измени", - "View": "Прегледај", - "Both": "Обоје", - "Help": "Помоћ", - "Upload Image": "Пошаљи слику", - "Menu": "Мени", - "This page need refresh": "Ову страну је неопходно освежити", - "You have an incompatible client version.": "Ова верзија клијента није компатибилна.", - "Refresh to update.": "Освежите за приказ измена.", - "New version available!": "Доступна је нова верзија!", - "See releases notes here": "Овде погледајте напомене о издањима", - "Refresh to enjoy new features.": "Освежите како бисте уживали у новим функцијама.", - "Your user state has changed.": "Ваше корисничко стање се променило.", - "Refresh to load new user state.": "Освежите за учитавање новог корисничког стања.", - "Refresh": "Освежи", - "Contacts": "Контакти", - "Report an issue": "Пријава проблема", - "Meet us on %s": "Пронађите нас на %s", - "Send us email": "Пошаљите нам имејл", - "Documents": "Документи", - "Features": "Могућности", - "YAML Metadata": "YAML Метаподаци", - "Slide Example": "Пример слајда", - "Cheatsheet": "Трикови и форе", - "Example": "Пример", - "Syntax": "Синтакса", - "Header": "Заглавље", - "Unordered List": "Неуређени списак", - "Ordered List": "Уређени списак", - "Todo List": "Списак обавеза", - "Blockquote": "Пасус са наводима", - "Bold font": "Масна слова", - "Italics font": "Закривљена слова", - "Strikethrough": "Прецртано", - "Inserted text": "Уметнут текст", - "Marked text": "Означени текст", - "Link": "Линк", - "Image": "Слика", - "Code": "Код", - "Externals": "Спољни", - "This is a alert area.": "Ово је пасус за упозорења.", - "Revert": "Врати", - "Import from clipboard": "Увези из клипборда", - "Paste your markdown or webpage here...": "Залепи свој markdown или веб страну овде...", - "Clear": "Очисти", - "This note is locked": "Ова белешка је закључана", - "Sorry, only owner can edit this note.": "Жао нам је, ову белешку може мењати само њен власник.", - "OK": "OK", - "Reach the limit": "Досегни лимит", - "Sorry, you've reached the max length this note can be.": "Нажалост, досегли сте максималну дужину ове белешке.", - "Please reduce the content or divide it to more notes, thank you!": "Молимо Вас да смањите количину текста или да га поделите на више белешки, хвала!", - "Import from Gist": "Увези из Github Gist-а", - "Paste your gist url here...": "Залепите Gist URL адресу овде...", - "Import from Snippet": "Увези из \"исечака\"", - "Select From Available Projects": "Изабери из доступних пројеката", - "Select From Available Snippets": "Изабери из доступних исечака", - "OR": "ИЛИ", - "Export to Snippet": "Извези у \"исечак\"", - "Select Visibility Level": "Изаберите ниво читкости", - "Night Theme": "Ноћна тема", - "Follow us on %s and %s.": "Пратите нас на %s и %s.", - "Privacy": "Приватност", - "Terms of Use": "Услови коришћења", - "Do you really want to delete your user account?": "Да ли заиста желите да трајно обришете свој налог?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Ова операција ће избрисати ваш налог, све ваше белешке, а уклониће и све везе ка вашем налогу из других белешки.", - "Delete user": "Обриши корисника", - "Export user data": "Извоз свих корисничких података", - "Help us translating on %s": "Помозите око превода на %s", - "Source Code": "Изворни код", - "Register": "Региструј се", - "Powered by %s": "Покреће %s", - "Help us translating": "Помозите око превода", - "Join the community": "Приступите заједници" -} \ No newline at end of file diff --git a/locales/sv.json b/locales/sv.json deleted file mode 100644 index ef89a27fc..000000000 --- a/locales/sv.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Kollaborativa markdownanteckningar", - "Realtime collaborative markdown notes on all platforms.": "Kollaborativa markdownantackningar på alla plattformar.", - "Best way to write and share your knowledge in markdown.": "Bästa sättet att skriva och dela din kunskap i markdown.", - "Intro": "Intro", - "History": "Historik", - "New guest note": "Ny gästanteckning", - "Collaborate with URL": "Samarbeta med URL", - "Support charts and MathJax": "Stöd för diagram och MathJax", - "Support slide mode": "Stöd för slide mode", - "Sign In": "Logga in", - "Below is the history from browser": "Nedanför finns historia från webbläsaren", - "Welcome!": "Välkommen!", - "New note": "Ny anteckning", - "or": "eller", - "Sign Out": "Logga ut", - "Explore all features": "Upptäck alla funktioner", - "Select tags...": "Välj taggar...", - "Search keyword...": "Sök nyckelord...", - "Sort by title": "Sortera titlar", - "Title": "Titel", - "Sort by time": "Sortera kronologiskt", - "Time": "Tid", - "Export history": "Exporthistorik", - "Import history": "Importhistorik", - "Clear history": "Rensa historik", - "Refresh history": "Uppdatera historik", - "No history": "Ingen historik", - "Import from browser": "Importera från webbläsare", - "Releases": "Lanseringar", - "Are you sure?": "Är du säker?", - "Do you really want to delete this note?": "Vill du verkligen radera denna anteckning?", - "All users will lose their connection.": "Alla användare kommer att förlora sin anslutning.", - "Cancel": "Avbryt", - "Yes, do it!": "Ja, gör det!", - "Choose method": "Välj metod", - "Sign in via %s": "Logga in via %s", - "New": "Ny", - "Publish": "Publicera", - "Extra": "Extra", - "Revision": "Revision", - "Slide Mode": "Slide Mode", - "Export": "Exportera", - "Import": "Importera", - "Clipboard": "Urklipp", - "Download": "Ladda ner", - "Raw HTML": "Rå HTML", - "Edit": "Redigera", - "View": "Visa", - "Both": "Båda", - "Help": "Hjälp", - "Upload Image": "Ladda upp bilder", - "Menu": "Meny", - "This page need refresh": "Den här sidan behöver laddas om", - "You have an incompatible client version.": "Du har en inkompatibel klientversion.", - "Refresh to update.": "Ladda om för att uppdatera.", - "New version available!": "Ny version tillgänglig!", - "See releases notes here": "Se releaseanteckningar här", - "Refresh to enjoy new features.": "Ladda om för att använda de nya funktionerna.", - "Your user state has changed.": "Din användarstatus har förändrats.", - "Refresh to load new user state.": "Ladda om för att ladda ny användarstatus.", - "Refresh": "Ladda om", - "Contacts": "Kontakter", - "Report an issue": "Rapportera ett fel", - "Meet us on %s": "Träffa oss på %s", - "Send us email": "Skicka e-post till oss", - "Documents": "Dokument", - "Features": "Funktioner", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Slideexempel", - "Cheatsheet": "Cheatsheet", - "Example": "Exempel", - "Syntax": "Syntax", - "Header": "Huvud", - "Unordered List": "Oordnad lists", - "Ordered List": "Ordnad lista", - "Todo List": "Todo-lista", - "Blockquote": "Blockcitat", - "Bold font": "Fet stil", - "Italics font": "Kursiv stil", - "Strikethrough": "Genomstrykning", - "Inserted text": "Insatt text", - "Marked text": "Markerad text", - "Link": "Länk", - "Image": "Bild", - "Code": "Kod", - "Externals": "Externa", - "This is a alert area.": "Det här är ett varnande område.", - "Revert": "Återgå", - "Import from clipboard": "Importera från urklipp", - "Paste your markdown or webpage here...": "Klipp in din markdown eller hemsida här...", - "Clear": "Rensa", - "This note is locked": "Anteckningen är låst", - "Sorry, only owner can edit this note.": "Ursäkta, men endast ägaren kan redigera den här anteckningen.", - "OK": "Okej", - "Reach the limit": "Nå gränsen", - "Sorry, you've reached the max length this note can be.": "Usräkta, men duhar nått maxlängden för vad en anteckning får vara.", - "Please reduce the content or divide it to more notes, thank you!": "Var vänlig förkorta innehållet eller dela upp det i flera anteckningar, tack!", - "Import from Gist": "Importera från Gist", - "Paste your gist url here...": "Klipp in din gist-url här...", - "Import from Snippet": "Importera från Snippet", - "Select From Available Projects": "Välj från tillgängliga projekt", - "Select From Available Snippets": "Välj från tillgängliga Snippets", - "OR": "ELLER", - "Export to Snippet": "Exportera till Snippet", - "Select Visibility Level": "Välj synlighetsnivå", - "Night Theme": "Natttema", - "Follow us on %s and %s.": "Följ oss på %s och %s.", - "Privacy": "Integritet", - "Terms of Use": "Villkor", - "Do you really want to delete your user account?": "Vill du verkligen ta bort ditt användarkonto?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Detta tar bort ditt konto, alla anteckningar som ägs av dig och tar bort alla referenser till ditt konto från andra anteckningar.", - "Delete user": "Ta bort användare", - "Export user data": "Exportera användardata", - "Help us translating on %s": "Hjälp oss att översätta på %s", - "Source Code": "Källkod", - "Register": "Registrera", - "Powered by %s": "Drivs av %s", - "Help us translating": "Hjälp oss att översätta", - "Join the community": "Gå med i samhället", - "Imprint": "Avtryck" -} \ No newline at end of file diff --git a/locales/tr.json b/locales/tr.json deleted file mode 100644 index b0682469a..000000000 --- a/locales/tr.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Ortak markdown notları", - "Realtime collaborative markdown notes on all platforms.": "Tüm platformlarda gerçek zamanlı markdown notları", - "Best way to write and share your knowledge in markdown.": "Markdownda bilginizi paylaşmanın en kolay yolu.", - "Intro": "Giriş", - "History": "Geçmiş", - "New guest note": "Yeni kullanıcı notu", - "Collaborate with URL": "URL ile katkıda bulun", - "Support charts and MathJax": "Grafikler ve MathJax'ı destekle", - "Support slide mode": "Sunum modunu destekle", - "Sign In": "Kaydol", - "Below is the history from browser": "Aşağıda tarayıcınızın geçmişi var", - "Welcome!": "Hoşgeldiniz!", - "New note": "Yeni not", - "or": "veya", - "Sign Out": "Çıkış Yap", - "Explore all features": "Özellikleri keşfet", - "Select tags...": "Etiketleri seçin...", - "Search keyword...": "Anahtar kelimeleri arayın...", - "Sort by title": "Başlığa göre sırala", - "Title": "Başlık", - "Sort by time": "Zamana göre sırala", - "Time": "Zaman", - "Export history": "Geçmişe dışa aktar", - "Import history": "Geçmişi içe aktar", - "Clear history": "Geçmişi temizle", - "Refresh history": "Geçmişi yenile", - "No history": "Geçmiş yok", - "Import from browser": "Tarayıcıdan içe aktar", - "Releases": "Sürümler", - "Are you sure?": "Emin misiniz?", - "Cancel": "İptal", - "Yes, do it!": "Evet, devam et!", - "Choose method": "Metot seçin", - "Sign in via %s": "%s ile giriş yapın", - "New": "Yeni", - "Publish": "Yayınla", - "Extra": "Ekstra", - "Revision": "Sürüm", - "Slide Mode": "Slayt Modu", - "Export": "Dışa Aktar", - "Import": "İçe Aktar", - "Clipboard": "Pano", - "Download": "İndir", - "Raw HTML": "Kaynak HTML", - "Edit": "Düzenle", - "View": "İncele", - "Both": "İkisi de", - "Help": "Yardım", - "Upload Image": "Resim Yükle", - "Menu": "Menü", - "This page need refresh": "Bu sayfayı yeniden yüklemek lazım", - "You have an incompatible client version.": "Yerel uygulamanız uyumlu olmayan bir sürümde.", - "Refresh to update.": "Güncellemek için yenileyin.", - "New version available!": "Yeni versiyon kullanıma hazır!", - "See releases notes here": "Değişikliklere burdan bakabilirsiniz", - "Refresh to enjoy new features.": "Yeni özelliklere yenileyerek erişebilirsiniz.", - "Your user state has changed.": "Kullanıcı durumunuz değişti.", - "Refresh to load new user state.": "Yeni kullanıcı durumunuzu yüklemek için yenileyin.", - "Refresh": "Yenile", - "Contacts": "Kişiler", - "Report an issue": "Hata bildir", - "Send us email": "Bize email gönderin", - "Documents": "Belgeler", - "Features": "Özellikler", - "YAML Metadata": "YAML Özbilgisi", - "Slide Example": "Slayt Örneği", - "Cheatsheet": "Cheatsheet", - "Example": "Örnek", - "Syntax": "Sentaks", - "Header": "Başlık", - "Unordered List": "Sırasız Liste", - "Ordered List": "Sıralı Liste", - "Todo List": "Yapılacaklar Listesi", - "Blockquote": "Alıntı Bloğu", - "Bold font": "Kalın yazı", - "Italics font": "İtalik yazı", - "Strikethrough": "Üstüçizili", - "Inserted text": "Eklenmiş yazı", - "Marked text": "Seçili yazı", - "Link": "Link", - "Image": "Resim", - "Code": "Kod", - "Externals": "Dış veriler", - "This is a alert area.": "Burası bir uyarı bölgesi.", - "Revert": "Geri al", - "Import from clipboard": "Panodan içe aktar", - "Paste your markdown or webpage here...": "Markdown veya web sayfanızı buraya yapıştırın...", - "Clear": "Temizle", - "This note is locked": "Burası kilitli", - "Sorry, only owner can edit this note.": "Üzgünüm, bu not sadece sahibi tarafından düzenlenebilir.", - "OK": "Tamam", - "Reach the limit": "Limite eriş", - "Sorry, you've reached the max length this note can be.": "Üzgünüm, bu not için maksimum harf sayısına ulaştınız", - "Please reduce the content or divide it to more notes, thank you!": "Lütfen notu değiştirin veya birden fazla notlara bölün, teşekkürler!", - "Import from Gist": "Gist'ten içe aktar", - "Paste your gist url here...": "Gist URL'nizi buraya yapıştırın...", - "Import from Snippet": "Snippet'ten içe aktar", - "Select From Available Projects": "Uygun Projelerden Seçin", - "Select From Available Snippets": "Uygun Snippet'lerden Seçin", - "OR": "VEYA", - "Export to Snippet": "Snippet olarak dışa aktarın", - "Select Visibility Level": "Görünebilirlik seviyesini belirleyin" -} diff --git a/locales/uk.json b/locales/uk.json deleted file mode 100644 index 0afc8796b..000000000 --- a/locales/uk.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "Collaborative markdown notes": "Спільні примітки щодо знижок", - "Realtime collaborative markdown notes on all platforms.": "Спільні примітки щодо знижок в реальному часі на всіх платформах.", - "Best way to write and share your knowledge in markdown.": "Кращий спосіб, щоб записувати і ділитись своїми знаннями щодо знижок в реальному часі.", - "Intro": "Вступ", - "History": "Історія", - "New guest note": "Примітка нового гостя", - "Collaborate with URL": "Спільна робота по URL", - "Support charts and MathJax": "Підтримка графіків і MathJax", - "Support slide mode": "Підтримка режиму слайдера", - "Sign In": "Ввійти", - "Below is the history from browser": "Нижче показана історія браузера", - "Welcome!": "Ласкаво просимо!", - "New note": "Нова примітка", - "or": "або", - "Sign Out": "Вийти", - "Explore all features": "Дослідити всі можливості", - "Select tags...": "Вибрати теги...", - "Search keyword...": "Пошук...", - "Sort by title": "Сортувати по заголовку", - "Title": "Заголовок", - "Sort by time": "Сортувати по часу", - "Time": "Час", - "Export history": "Еспортувати історію", - "Import history": "Імпортувати історію", - "Clear history": "Очистити історію", - "Refresh history": "Оновити історію", - "No history": "Історія відсутня", - "Import from browser": "Імпортувати з браузера", - "Releases": "Релізи", - "Are you sure?": "Ви впевнені?", - "Cancel": "Відмінити", - "Yes, do it!": "Так, зробити це!", - "Choose method": "Вибрати метод", - "Sign in via %s": "Увійти за допомогою %s", - "New": "Нова", - "Publish": "Опублікувати", - "Extra": "Дотатково", - "Revision": "Ревізія", - "Slide Mode": "Режим слайдера", - "Export": "Експорт", - "Import": "Імпорт", - "Clipboard": "Буфер обміну", - "Download": "Завантажити", - "Raw HTML": "Raw HTML", - "Edit": "Редагувати", - "View": "Вигляд", - "Both": "Обоє", - "Help": "Допомога", - "Upload Image": "Завантажити зображення", - "Menu": "Меню", - "This page need refresh": "Цю сторінку необхідно обновити", - "You have an incompatible client version.": "Ви використовуєте несумісну версію клієнта.", - "Refresh to update.": "Оновіть сторінку для оновлення.", - "New version available!": "Нова версія доступна!", - "See releases notes here": "Огляньте деталі оновлень тут", - "Refresh to enjoy new features.": "Оновіть, щоб насолоджуватись новими можливостями.", - "Your user state has changed.": "Ваш акаунт змінено.", - "Refresh to load new user state.": "Оновіть, щоб завантажити зміни акаунта.", - "Refresh": "Оновити", - "Contacts": "Контакти", - "Report an issue": "Повідомити про проблему", - "Send us email": "Відправити нам лист", - "Documents": "Документи", - "Features": "Можливості", - "YAML Metadata": "Метадані YAML", - "Slide Example": "Приклад слайдера", - "Cheatsheet": "Шпаргалка", - "Example": "Приклад", - "Syntax": "Синтаксис", - "Header": "Заголовок", - "Unordered List": "Маркований список", - "Ordered List": "Нумерований список", - "Todo List": "Список завдань", - "Blockquote": "Цитата", - "Bold font": "Жирний шрифт", - "Italics font": "Курсив", - "Strikethrough": "Перекреслений", - "Inserted text": "Підкреслений текст", - "Marked text": "Виділений текст", - "Link": "Посилання", - "Image": "Зображення", - "Code": "Код", - "Externals": "Зовнішнє", - "This is a alert area.": "Це область повідомлення.", - "Revert": "Відмінити", - "Import from clipboard": "Імпорт з буферу обміну", - "Paste your markdown or webpage here...": "Вставте ваш markdown або веб-сторінку тут...", - "Clear": "Очистити", - "This note is locked": "Ця замітка заблокована", - "Sorry, only owner can edit this note.": "Вибачте, лише власник може редагувати цю замітку.", - "OK": "OK", - "Reach the limit": "Досягнено ліміту", - "Sorry, you've reached the max length this note can be.": "Нажаль, ви досягли максимальної довжини замітки.", - "Please reduce the content or divide it to more notes, thank you!": "Будь-ласка, зменшіть розмір вмісту або розділіть його на декілька заміток!", - "Import from Gist": "Імпортувати з Gist", - "Paste your gist url here...": "Вставте посилання на ваш gist тут...", - "Import from Snippet": "Імпортувати фрагмент коду", - "Select From Available Projects": "Виберіть з доступних проектів", - "Select From Available Snippets": "Виберіть з доступних фрагментів коду", - "OR": "АБО", - "Export to Snippet": "Експорт фрагменту коду", - "Select Visibility Level": "Вибрати рівень видимості" -} diff --git a/locales/vi.json b/locales/vi.json deleted file mode 100644 index 40c9257a0..000000000 --- a/locales/vi.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "Collaborative markdown notes": "Cộng tác ghi chú markdown", - "Realtime collaborative markdown notes on all platforms.": "Cộng tác ghi chú markdown đa nền tảng thời gian thực", - "Best way to write and share your knowledge in markdown.": "Nền tảng tốt nhất để viết và chia sẻ markdown", - "Intro": "Giới thiệu", - "History": "Lịch sử", - "New guest note": "Khách mới", - "Collaborate with URL": "Cộng tác thời gian thực", - "Support charts and MathJax": "Làm việc với biểu đồ và MathJax", - "Support slide mode": "Hỗ trợ chế độ slide", - "Sign In": "Đăng nhập", - "Below is the history from browser": "Dưới đây là lịch sử của trình duyệt", - "Welcome!": "Chào mừng bạn!", - "New note": "Tạo mới ghi chú", - "or": "hoặc", - "Sign Out": "Đăng xuất", - "Explore all features": "Khám phá tất cả tính năng", - "Select tags...": "Chọn tag", - "Search keyword...": "Tìm kiếm", - "Sort by title": "Sắp xếp theo tiêu đề", - "Title": "Tiêu đề", - "Sort by time": "Sắp xếp theo thời gian", - "Time": "Thời gian", - "Export history": "Xuất lịch sử", - "Import history": "Nhập lịch sử", - "Clear history": "Xóa lịch sử", - "Refresh history": "Làm mới lịch sử", - "No history": "Không có lịch sử", - "Import from browser": "Nhập từ trình duyệt", - "Releases": "Xuất bản", - "Are you sure?": "Bạn có chắc chắn không ?", - "Do you really want to delete this note?": "Bạn có thực sự muốn xóa ghi chú này ?", - "All users will lose their connection.": "Tất cả người dùng sẽ mất liên kết này.", - "Cancel": "Hủy", - "Yes, do it!": "Đồng ý", - "Choose method": "Chọn phương thức", - "Sign in via %s": "Đăng nhấp với %s", - "New": "Mới", - "Publish": "Xuất bản", - "Extra": "Extra", - "Revision": "Sửa đổi", - "Slide Mode": "Chế độ slide", - "Export": "Xuất", - "Import": "Nhập", - "Clipboard": "Clipboard", - "Download": "Tải xuống", - "Raw HTML": "Raw HTML", - "Edit": "Sửa", - "View": "Hiện", - "Both": "Cả hai", - "Help": "Trợ giúp", - "Upload Image": "Tải ảnh lên", - "Menu": "Menu", - "This page need refresh": "Trang này cần được làm mới", - "You have an incompatible client version.": "Phiên bản của client không tương thích.", - "Refresh to update.": "Làm mới để cập nhập.", - "New version available!": "Phiên bản mới đã có sẵn.", - "See releases notes here": "Xem ghi chú xuất bản ở đây.", - "Refresh to enjoy new features.": "Làm mới để trải nghiệm tính năng mới.", - "Your user state has changed.": "Trạng thái người dùng bị thay đổi.", - "Refresh to load new user state.": "Làm mới để cập nhập trạng thái người dùng mới.", - "Refresh": "Làm mới", - "Contacts": "Liên Lạc", - "Report an issue": "Báo cáo vấn đề", - "Meet us on %s": "Gặp chúng tôi ở %s", - "Send us email": "Gửi email cho chúng tôi", - "Documents": "Tài liệu", - "Features": "Tính năng", - "YAML Metadata": "YAML Metadata", - "Slide Example": "Slide ví dụ", - "Cheatsheet": "Cheetsheet", - "Example": "Ví dụ", - "Syntax": "Cú pháp", - "Header": "Đầu đề", - "Unordered List": "Danh sách chưa sắp xếp", - "Ordered List": "Danh sách đã sắp xếp", - "Todo List": "Checklist", - "Blockquote": "Blockquote", - "Bold font": "Bôi đậm", - "Italics font": "In nghiêng", - "Strikethrough": "Gạch ngang", - "Inserted text": "Gạch chân", - "Marked text": "Hightlight", - "Link": "Liên kết", - "Image": "Ảnh", - "Code": "Code", - "Externals": "Externals", - "This is a alert area.": "Đây là khu vực cảnh báo", - "Revert": "Trở lại như cũ", - "Import from clipboard": "Thêm từ clipboard", - "Paste your markdown or webpage here...": "Dán markdown hoặc webpage ở đây ...", - "Clear": "Xóa", - "This note is locked": "Ghi chú này bị khóa.", - "Sorry, only owner can edit this note.": "Xin lỗi, chỉ chủ sở hữu có thể xóa note.", - "OK": "Đồng ý", - "Reach the limit": "Đạt giới hạn", - "Sorry, you've reached the max length this note can be.": "Rất tiếc, bạn đã đạt tới độ dài tối đa ", - "Please reduce the content or divide it to more notes, thank you!": "Vui lòng rút ngắn ghi chú", - "Import from Gist": "Nhập từ Gist", - "Paste your gist url here...": "Dán liên kết gist vào đây ...", - "Import from Snippet": "Thêm từ Snippet", - "Select From Available Projects": "Chọn từ Project có sẵn", - "Select From Available Snippets": "Chọn từ Snippets có sẵn", - "OR": "HOẶC", - "Export to Snippet": "Xuất ra Snippet", - "Select Visibility Level": "Chọn cấp độ hiển thị", - "Night Theme": "Giao diện tối", - "Follow us on %s and %s.": "Cho phép chúng tôi %s, và %s.", - "Privacy": "Quyền riêng tư.", - "Terms of Use": "Điều khoản sử dụng.", - "Do you really want to delete your user account?": "Bạn có thực sự muốn xóa tài khoản ?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "Điều này sẽ xóa tài khoản của bạn, tất cả các ghi chú thuộc sở hữu của bạn và xóa tất cả các liên kết đến tài khoản của bạn khỏi các ghi chú khác.", - "Delete user": "Xóa người dùng", - "Export user data": "Xuất dữ liệu người dùng", - "Help us translating on %s": "Giúp chúng tôi dịch trên %s", - "Source Code": "Mã nguồn", - "Register": "Đăng ký", - "Powered by %s": "Cung cấp bởi %s", - "Help us translating": "Giúp chúng tôi dịch", - "Join the community": "Tham gia vào cộng đồng" -} \ No newline at end of file diff --git a/locales/zh-CN.json b/locales/zh-CN.json deleted file mode 100644 index deabf0e1c..000000000 --- a/locales/zh-CN.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Markdown 协作笔记", - "Realtime collaborative markdown notes on all platforms.": "使用 Markdown 的跨平台即时协作笔记。", - "Best way to write and share your knowledge in markdown.": "写作与分享 Markdown 的最佳平台。", - "Intro": "简介", - "History": "历史", - "New guest note": "新建访客笔记", - "Collaborate with URL": "实时协作", - "Support charts and MathJax": "支持图表与 MathJax", - "Support slide mode": "支持幻灯模式", - "Sign In": "登录", - "Below is the history from browser": "以下为来自浏览器的历史", - "Welcome!": "欢迎!", - "New note": "新建笔记", - "or": "或", - "Sign Out": "登出", - "Explore all features": "探索所有功能", - "Select tags...": "选择标签...", - "Search keyword...": "搜索关键字...", - "Sort by title": "按标题排序", - "Title": "标题", - "Sort by time": "按时间排序", - "Time": "时间", - "Export history": "导出历史", - "Import history": "导入历史", - "Clear history": "清空历史", - "Refresh history": "刷新历史", - "No history": "无历史记录", - "Import from browser": "从浏览器导入", - "Releases": "版本", - "Are you sure?": "您确定吗?", - "Do you really want to delete this note?": "您确定要删除这篇笔记吗?", - "All users will lose their connection.": "所有用户将失去连接。", - "Cancel": "取消", - "Yes, do it!": "是的,就这样做!", - "Choose method": "选择方式", - "Sign in via %s": "通过 %s 登录", - "New": "新建", - "Publish": "发表", - "Extra": "附加功能", - "Revision": "修订版本", - "Slide Mode": "幻灯模式", - "Export": "导出", - "Import": "导入", - "Clipboard": "剪贴板", - "Download": "下载", - "Raw HTML": "原始 HTML", - "Edit": "编辑", - "View": "预览", - "Both": "双栏", - "Help": "帮助", - "Upload Image": "上传图片", - "Menu": "菜单", - "This page need refresh": "此页面需要刷新", - "You have an incompatible client version.": "您的客户端版本不兼容。", - "Refresh to update.": "刷新页面以更新。", - "New version available!": "新版本可用!", - "See releases notes here": "在此查看更新记录", - "Refresh to enjoy new features.": "刷新页面以体验新功能。", - "Your user state has changed.": "您的用户状态已变更。", - "Refresh to load new user state.": "刷新页面以加载新的用户状态。", - "Refresh": "刷新", - "Contacts": "联系我们", - "Report an issue": "报告问题", - "Meet us on %s": "在 %s 上联系我们", - "Send us email": "给我们发送电子邮件", - "Documents": "文档", - "Features": "功能", - "YAML Metadata": "YAML 元数据", - "Slide Example": "幻灯范例", - "Cheatsheet": "速查表", - "Example": "范例", - "Syntax": "语法", - "Header": "标题", - "Unordered List": "无序列表", - "Ordered List": "有序列表", - "Todo List": "清单", - "Blockquote": "引用", - "Bold font": "粗体", - "Italics font": "斜体", - "Strikethrough": "删除线", - "Inserted text": "下划线文字", - "Marked text": "高亮文字", - "Link": "链接", - "Image": "图片", - "Code": "代码", - "Externals": "外部扩展", - "This is a alert area.": "这是一个警告区块。", - "Revert": "还原", - "Import from clipboard": "从剪贴板导入", - "Paste your markdown or webpage here...": "在这里粘贴 Markdown 或网页内容...", - "Clear": "清除", - "This note is locked": "这篇笔记已被锁定", - "Sorry, only owner can edit this note.": "抱歉,只有所有者可以编辑这篇笔记。", - "OK": "好的", - "Reach the limit": "达到上限", - "Sorry, you've reached the max length this note can be.": "抱歉,您的这篇笔记已达到可用的最大长度。", - "Please reduce the content or divide it to more notes, thank you!": "请减少笔记的内容。", - "Import from Gist": "从 Gist 导入", - "Paste your gist url here...": "在这里粘贴 Gist 网址...", - "Import from Snippet": "从 Snippet 导入", - "Select From Available Projects": "从可用的项目中选择", - "Select From Available Snippets": "从可用的 Snippet 中选择", - "OR": "或", - "Export to Snippet": "导出到 Snippet", - "Select Visibility Level": "选择可见层级", - "Night Theme": "夜间主题", - "Follow us on %s and %s.": "在 %s 和 %s 上关注我们", - "Privacy": "隐私", - "Terms of Use": "使用条款", - "Do you really want to delete your user account?": "您确定要删除帐户吗?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "您的帐户、您所拥有的笔记、他人笔记中对您帐户的引用都将被删除。", - "Delete user": "删除帐户", - "Export user data": "导出用户数据", - "Help us translating on %s": "在 %s 上帮我们翻译", - "Source Code": "源代码", - "Register": "注册", - "Powered by %s": "由 %s 驱动", - "Help us translating": "帮助我们翻译", - "Join the community": "加入社区", - "Imprint": "法律声明" -} \ No newline at end of file diff --git a/locales/zh-TW.json b/locales/zh-TW.json deleted file mode 100644 index 2e674f90f..000000000 --- a/locales/zh-TW.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "Collaborative markdown notes": "Markdown 協作筆記", - "Realtime collaborative markdown notes on all platforms.": "使用 Markdown 的跨平台即時協作筆記", - "Best way to write and share your knowledge in markdown.": "您使用 Markdown 寫作與分享知識的最佳方式", - "Intro": "簡介", - "History": "紀錄", - "New guest note": "建立訪客筆記", - "Collaborate with URL": "使用網址協作", - "Support charts and MathJax": "支援圖表與 MathJax", - "Support slide mode": "支援簡報模式", - "Sign In": "登入", - "Below is the history from browser": "以下為來自瀏覽器的紀錄", - "Welcome!": "歡迎!", - "New note": "建立筆記", - "or": "或", - "Sign Out": "登出", - "Explore all features": "探索所有功能", - "Select tags...": "選擇標籤...", - "Search keyword...": "搜尋關鍵字...", - "Sort by title": "用標題排序", - "Title": "標題", - "Sort by time": "用時間排序", - "Time": "時間", - "Export history": "匯出紀錄", - "Import history": "匯入紀錄", - "Clear history": "清空紀錄", - "Refresh history": "更新紀錄", - "No history": "沒有紀錄", - "Import from browser": "從瀏覽器匯入", - "Releases": "版本", - "Are you sure?": "你確定嗎?", - "Do you really want to delete this note?": "確定要刪除這個文件嗎?", - "All users will lose their connection.": "所有使用者將會失去連線", - "Cancel": "取消", - "Yes, do it!": "沒錯,就這樣辦!", - "Choose method": "選擇方式", - "Sign in via %s": "透過 %s 登入", - "New": "新增", - "Publish": "發表", - "Extra": "增益", - "Revision": "修訂版本", - "Slide Mode": "簡報模式", - "Export": "匯出", - "Import": "匯入", - "Clipboard": "剪貼簿", - "Download": "下載", - "Raw HTML": "純 HTML", - "Edit": "編輯", - "View": "檢視", - "Both": "雙欄", - "Help": "協助", - "Upload Image": "上傳圖片", - "Menu": "選單", - "This page need refresh": "此頁面需要重新整理", - "You have an incompatible client version.": "您使用的是不相容的客戶端", - "Refresh to update.": "請重新整理來更新", - "New version available!": "新版本來了!", - "See releases notes here": "請由此查閱更新紀錄", - "Refresh to enjoy new features.": "請重新整理來享受最新功能", - "Your user state has changed.": "您的使用者狀態已變更", - "Refresh to load new user state.": "請重新整理來載入新的使用者狀態", - "Refresh": "重新整理", - "Contacts": "聯絡方式", - "Report an issue": "回報問題", - "Meet us on %s": "透過 %s 聯絡我們", - "Send us email": "寄信給我們", - "Documents": "文件", - "Features": "功能簡介", - "YAML Metadata": "YAML Metadata", - "Slide Example": "簡報範例", - "Cheatsheet": "快速簡表", - "Example": "範例", - "Syntax": "語法", - "Header": "標題", - "Unordered List": "無序清單", - "Ordered List": "有序清單", - "Todo List": "待辦事項", - "Blockquote": "引用", - "Bold font": "粗體", - "Italics font": "斜體", - "Strikethrough": "刪除線", - "Inserted text": "插入文字", - "Marked text": "標記文字", - "Link": "連結", - "Image": "圖片", - "Code": "程式碼", - "Externals": "外部", - "This is a alert area.": "這是警告區塊", - "Revert": "還原", - "Import from clipboard": "從剪貼簿匯入", - "Paste your markdown or webpage here...": "在這裡貼上 Markdown 或是網頁內容...", - "Clear": "清除", - "This note is locked": "此份筆記已被鎖定", - "Sorry, only owner can edit this note.": "抱歉,只有擁有者可以編輯此筆記", - "OK": "好的", - "Reach the limit": "到達上限", - "Sorry, you've reached the max length this note can be.": "抱歉,您已使用到此份筆記可用的最大長度", - "Please reduce the content or divide it to more notes, thank you!": "請減少內容或是將內容切成更多筆記,謝謝!", - "Import from Gist": "從 Gist 匯入", - "Paste your gist url here...": "在這裡貼上 gist 網址...", - "Import from Snippet": "從 Snippet 匯入", - "Select From Available Projects": "從可用的專案中選擇", - "Select From Available Snippets": "從可用的 Snippets 中選擇", - "OR": "或是", - "Export to Snippet": "匯出到 Snippet", - "Select Visibility Level": "選擇可見層級", - "Night Theme": "夜間主題", - "Follow us on %s and %s.": "來 %s 或 %s 和我們互動吧!", - "Privacy": "隱私權政策", - "Terms of Use": "使用條款", - "Do you really want to delete your user account?": "你確定真的想要刪除帳戶?", - "This will delete your account, all notes that are owned by you and remove all references to your account from other notes.": "我們將會刪除你的帳戶、你所擁有的筆記、以及你在別人筆記裡的作者紀錄。", - "Delete user": "刪除使用者", - "Export user data": "匯出使用者資料", - "Help us translating on %s": "來 %s 幫我們翻譯", - "Source Code": "原始碼", - "Register": "註冊", - "Powered by %s": "由 %s 強力驅動", - "Help us translating": "幫助我們改進翻譯", - "Join the community": "加入社群", - "Imprint": "版本說明" -} \ No newline at end of file From a5ad35f94d206b75ed877f647bfc0bedc34ed240 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 5 Jan 2021 20:26:03 +0100 Subject: [PATCH 04/10] Delete old sources To reduce confusion, we should not have the old code in this branch Signed-off-by: David Mehren --- .eslintignore | 6 - .travis.yml | 27 - app.json | 135 --- config.json.example | 126 --- old_src/lib/app.ts | 312 ------ old_src/lib/config/default.ts | 122 --- old_src/lib/config/defaultSSL.ts | 15 - old_src/lib/config/dockerSecret.ts | 57 - old_src/lib/config/enum.ts | 29 - old_src/lib/config/environment.ts | 138 --- old_src/lib/config/hackmdEnvironment.ts | 118 --- old_src/lib/config/index.ts | 211 ---- old_src/lib/config/interfaces.ts | 159 --- old_src/lib/config/oldDefault.ts | 39 - old_src/lib/config/oldEnvironment.ts | 8 - old_src/lib/config/utils.ts | 53 - old_src/lib/csp.ts | 106 -- old_src/lib/errors.ts | 54 - old_src/lib/history.ts | 208 ---- old_src/lib/letter-avatars.ts | 45 - old_src/lib/library-ext.d.ts | 8 - old_src/lib/logger.ts | 20 - .../migrations/20150504155329-create-users.js | 24 - .../migrations/20150508114741-create-notes.js | 21 - .../migrations/20150515125813-create-temp.js | 18 - .../20150702001020-update-to-0_3_1.js | 45 - ...150915153700-change-notes-title-to-text.js | 28 - .../20160112220142-note-add-lastchange.js | 26 - .../20160420180355-note-add-alias.js | 25 - .../20160515114000-user-add-tokens.js | 21 - .../20160607060246-support-revision.js | 33 - .../20160703062241-support-authorship.js | 36 - .../20161009040430-support-delete-note.js | 17 - .../20161201050312-support-email-signin.js | 28 - .../20171009121200-longtext-for-mysql.js | 16 - .../20180209120907-longtext-of-authorship.js | 13 - .../lib/migrations/20180306150303-fix-enum.js | 11 - .../20180326103000-use-text-in-tokens.js | 23 - .../20180525153000-user-add-delete-token.js | 13 - old_src/lib/models/author.ts | 41 - old_src/lib/models/index.ts | 60 -- old_src/lib/models/note.ts | 672 ------------ old_src/lib/models/revision.ts | 347 ------ old_src/lib/models/temp.ts | 13 - old_src/lib/models/user.ts | 74 -- old_src/lib/ot/client.js | 312 ------ old_src/lib/ot/editor-socketio-server.ts | 154 --- old_src/lib/ot/index.js | 8 - old_src/lib/ot/selection.js | 117 --- old_src/lib/ot/server.js | 52 - old_src/lib/ot/simple-text-operation.js | 188 ---- old_src/lib/ot/text-operation.js | 530 ---------- old_src/lib/ot/wrapped-operation.js | 80 -- old_src/lib/realtime.ts | 991 ------------------ old_src/lib/response.ts | 184 ---- old_src/lib/utils/PhotoProfile.ts | 102 -- old_src/lib/utils/functions.ts | 96 -- old_src/lib/web/auth/dropbox/index.ts | 41 - old_src/lib/web/auth/email/index.ts | 95 -- old_src/lib/web/auth/facebook/index.ts | 31 - old_src/lib/web/auth/github/index.ts | 36 - old_src/lib/web/auth/gitlab/index.ts | 41 - old_src/lib/web/auth/google/index.ts | 44 - old_src/lib/web/auth/index.ts | 69 -- old_src/lib/web/auth/interface.ts | 5 - old_src/lib/web/auth/ldap/index.ts | 96 -- old_src/lib/web/auth/oauth2/index.ts | 36 - .../web/auth/oauth2/oauth2-custom-strategy.ts | 84 -- old_src/lib/web/auth/openid/index.ts | 59 -- old_src/lib/web/auth/saml/index.ts | 107 -- old_src/lib/web/auth/twitter/index.ts | 33 - old_src/lib/web/auth/utils.ts | 73 -- old_src/lib/web/baseRouter.ts | 22 - old_src/lib/web/historyRouter.ts | 18 - old_src/lib/web/imageRouter/azure.ts | 38 - old_src/lib/web/imageRouter/filesystem.ts | 24 - old_src/lib/web/imageRouter/imgur.ts | 30 - old_src/lib/web/imageRouter/index.ts | 75 -- old_src/lib/web/imageRouter/lutim.ts | 34 - old_src/lib/web/imageRouter/minio.ts | 60 -- old_src/lib/web/imageRouter/s3.ts | 59 -- old_src/lib/web/index.ts | 9 - old_src/lib/web/middleware/checkURIValid.ts | 13 - old_src/lib/web/middleware/codiMDVersion.ts | 9 - old_src/lib/web/middleware/index.ts | 6 - .../redirectWithoutTrailingSlashes.ts | 16 - old_src/lib/web/middleware/tooBusy.ts | 14 - old_src/lib/web/note/actions.ts | 95 -- old_src/lib/web/note/controller.ts | 131 --- old_src/lib/web/note/router.ts | 29 - old_src/lib/web/note/slide.ts | 41 - old_src/lib/web/note/util.ts | 149 --- old_src/lib/web/statusRouter.ts | 106 -- old_src/lib/web/userRouter.ts | 144 --- old_src/lib/web/utils.ts | 14 - old_src/lib/workers/dmpWorker.ts | 173 --- old_src/test/auth.ts | 110 -- old_src/test/csp.ts | 109 -- old_src/test/letter-avatars.ts | 51 - old_src/test/user.ts | 60 -- 100 files changed, 8904 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .travis.yml delete mode 100644 app.json delete mode 100644 config.json.example delete mode 100644 old_src/lib/app.ts delete mode 100644 old_src/lib/config/default.ts delete mode 100644 old_src/lib/config/defaultSSL.ts delete mode 100644 old_src/lib/config/dockerSecret.ts delete mode 100644 old_src/lib/config/enum.ts delete mode 100644 old_src/lib/config/environment.ts delete mode 100644 old_src/lib/config/hackmdEnvironment.ts delete mode 100644 old_src/lib/config/index.ts delete mode 100644 old_src/lib/config/interfaces.ts delete mode 100644 old_src/lib/config/oldDefault.ts delete mode 100644 old_src/lib/config/oldEnvironment.ts delete mode 100644 old_src/lib/config/utils.ts delete mode 100644 old_src/lib/csp.ts delete mode 100644 old_src/lib/errors.ts delete mode 100644 old_src/lib/history.ts delete mode 100644 old_src/lib/letter-avatars.ts delete mode 100644 old_src/lib/library-ext.d.ts delete mode 100644 old_src/lib/logger.ts delete mode 100644 old_src/lib/migrations/20150504155329-create-users.js delete mode 100644 old_src/lib/migrations/20150508114741-create-notes.js delete mode 100644 old_src/lib/migrations/20150515125813-create-temp.js delete mode 100644 old_src/lib/migrations/20150702001020-update-to-0_3_1.js delete mode 100644 old_src/lib/migrations/20150915153700-change-notes-title-to-text.js delete mode 100644 old_src/lib/migrations/20160112220142-note-add-lastchange.js delete mode 100644 old_src/lib/migrations/20160420180355-note-add-alias.js delete mode 100644 old_src/lib/migrations/20160515114000-user-add-tokens.js delete mode 100644 old_src/lib/migrations/20160607060246-support-revision.js delete mode 100644 old_src/lib/migrations/20160703062241-support-authorship.js delete mode 100644 old_src/lib/migrations/20161009040430-support-delete-note.js delete mode 100644 old_src/lib/migrations/20161201050312-support-email-signin.js delete mode 100644 old_src/lib/migrations/20171009121200-longtext-for-mysql.js delete mode 100644 old_src/lib/migrations/20180209120907-longtext-of-authorship.js delete mode 100644 old_src/lib/migrations/20180306150303-fix-enum.js delete mode 100644 old_src/lib/migrations/20180326103000-use-text-in-tokens.js delete mode 100644 old_src/lib/migrations/20180525153000-user-add-delete-token.js delete mode 100644 old_src/lib/models/author.ts delete mode 100644 old_src/lib/models/index.ts delete mode 100644 old_src/lib/models/note.ts delete mode 100644 old_src/lib/models/revision.ts delete mode 100644 old_src/lib/models/temp.ts delete mode 100644 old_src/lib/models/user.ts delete mode 100755 old_src/lib/ot/client.js delete mode 100755 old_src/lib/ot/editor-socketio-server.ts delete mode 100644 old_src/lib/ot/index.js delete mode 100644 old_src/lib/ot/selection.js delete mode 100644 old_src/lib/ot/server.js delete mode 100644 old_src/lib/ot/simple-text-operation.js delete mode 100644 old_src/lib/ot/text-operation.js delete mode 100644 old_src/lib/ot/wrapped-operation.js delete mode 100644 old_src/lib/realtime.ts delete mode 100644 old_src/lib/response.ts delete mode 100644 old_src/lib/utils/PhotoProfile.ts delete mode 100644 old_src/lib/utils/functions.ts delete mode 100644 old_src/lib/web/auth/dropbox/index.ts delete mode 100644 old_src/lib/web/auth/email/index.ts delete mode 100644 old_src/lib/web/auth/facebook/index.ts delete mode 100644 old_src/lib/web/auth/github/index.ts delete mode 100644 old_src/lib/web/auth/gitlab/index.ts delete mode 100644 old_src/lib/web/auth/google/index.ts delete mode 100644 old_src/lib/web/auth/index.ts delete mode 100644 old_src/lib/web/auth/interface.ts delete mode 100644 old_src/lib/web/auth/ldap/index.ts delete mode 100644 old_src/lib/web/auth/oauth2/index.ts delete mode 100644 old_src/lib/web/auth/oauth2/oauth2-custom-strategy.ts delete mode 100644 old_src/lib/web/auth/openid/index.ts delete mode 100644 old_src/lib/web/auth/saml/index.ts delete mode 100644 old_src/lib/web/auth/twitter/index.ts delete mode 100644 old_src/lib/web/auth/utils.ts delete mode 100644 old_src/lib/web/baseRouter.ts delete mode 100644 old_src/lib/web/historyRouter.ts delete mode 100644 old_src/lib/web/imageRouter/azure.ts delete mode 100644 old_src/lib/web/imageRouter/filesystem.ts delete mode 100644 old_src/lib/web/imageRouter/imgur.ts delete mode 100644 old_src/lib/web/imageRouter/index.ts delete mode 100644 old_src/lib/web/imageRouter/lutim.ts delete mode 100644 old_src/lib/web/imageRouter/minio.ts delete mode 100644 old_src/lib/web/imageRouter/s3.ts delete mode 100644 old_src/lib/web/index.ts delete mode 100644 old_src/lib/web/middleware/checkURIValid.ts delete mode 100644 old_src/lib/web/middleware/codiMDVersion.ts delete mode 100644 old_src/lib/web/middleware/index.ts delete mode 100644 old_src/lib/web/middleware/redirectWithoutTrailingSlashes.ts delete mode 100644 old_src/lib/web/middleware/tooBusy.ts delete mode 100644 old_src/lib/web/note/actions.ts delete mode 100644 old_src/lib/web/note/controller.ts delete mode 100644 old_src/lib/web/note/router.ts delete mode 100644 old_src/lib/web/note/slide.ts delete mode 100644 old_src/lib/web/note/util.ts delete mode 100644 old_src/lib/web/statusRouter.ts delete mode 100644 old_src/lib/web/userRouter.ts delete mode 100644 old_src/lib/web/utils.ts delete mode 100644 old_src/lib/workers/dmpWorker.ts delete mode 100644 old_src/test/auth.ts delete mode 100644 old_src/test/csp.ts delete mode 100644 old_src/test/letter-avatars.ts delete mode 100644 old_src/test/user.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 685b64a84..000000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -old_src/lib/ot -old_src/lib/migrations -public/vendor -public/build -node_modules -build diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f6a58300d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: node_js -dist: xenial -cache: yarn - -stages: - - Static Tests - - test - -node_js: - - 10 - - 12 - - 14 -env: - - TEST_SUITE=test - - TEST_SUITE=test:e2e -script: "yarn run $TEST_SUITE" - -jobs: - include: - - stage: Static Tests - name: eslint - script: - - yarn run lint - - name: ShellCheck - script: - - shellcheck bin/heroku bin/setup - language: generic diff --git a/app.json b/app.json deleted file mode 100644 index 63d6b323b..000000000 --- a/app.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "name": "CodiMD", - "description": "Realtime collaborative markdown notes on all platforms", - "keywords": [ - "Collaborative", - "Markdown", - "Notes" - ], - "website": "https://codimd.org", - "repository": "https://github.com/codimd/server", - "logo": "https://github.com/codimd/server/raw/master/public/codimd-icon-1024.png", - "success_url": "/", - "env": { - "NPM_CONFIG_PRODUCTION": { - "description": "Let npm also install development build tool", - "value": "false" - }, - "DB_TYPE": { - "description": "Specify database type. See sequelize available databases. Default using postgres", - "value": "postgres" - }, - "CMD_SESSION_SECRET": { - "description": "Secret used to secure session cookies.", - "required": false - }, - "CMD_HSTS_ENABLE": { - "description": "whether to also use HSTS if HTTPS is enabled", - "required": false - }, - "CMD_HSTS_MAX_AGE": { - "description": "max duration, in seconds, to tell clients to keep HSTS status", - "required": false - }, - "CMD_HSTS_INCLUDE_SUBDOMAINS": { - "description": "whether to tell clients to also regard subdomains as HSTS hosts", - "required": false - }, - "CMD_HSTS_PRELOAD": { - "description": "whether to allow at all adding of the site to HSTS preloads (e.g. in browsers)", - "required": false - }, - "CMD_DOMAIN": { - "description": "domain name", - "required": false - }, - "CMD_URL_PATH": { - "description": "sub url path, like `www.example.com/`", - "required": false - }, - "CMD_ALLOW_ORIGIN": { - "description": "domain name whitelist (use comma to separate)", - "required": false, - "value": "localhost" - }, - "CMD_PROTOCOL_USESSL": { - "description": "set to use ssl protocol for resources path (only applied when domain is set)", - "required": false - }, - "CMD_URL_ADDPORT": { - "description": "set to add port on callback url (port 80 or 443 won't applied) (only applied when domain is set)", - "required": false - }, - "CMD_FACEBOOK_CLIENTID": { - "description": "Facebook API client id", - "required": false - }, - "CMD_FACEBOOK_CLIENTSECRET": { - "description": "Facebook API client secret", - "required": false - }, - "CMD_TWITTER_CONSUMERKEY": { - "description": "Twitter API consumer key", - "required": false - }, - "CMD_TWITTER_CONSUMERSECRET": { - "description": "Twitter API consumer secret", - "required": false - }, - "CMD_GITHUB_CLIENTID": { - "description": "GitHub API client id", - "required": false - }, - "CMD_GITHUB_CLIENTSECRET": { - "description": "GitHub API client secret", - "required": false - }, - "CMD_GITLAB_BASEURL": { - "description": "GitLab authentication endpoint, set to use other endpoint than GitLab.com (optional)", - "required": false - }, - "CMD_GITLAB_CLIENTID": { - "description": "GitLab API client id", - "required": false - }, - "CMD_GITLAB_CLIENTSECRET": { - "description": "GitLab API client secret", - "required": false - }, - "CMD_GITLAB_SCOPE": { - "description": "GitLab API client scope (optional)", - "required": false - }, - "CMD_DROPBOX_CLIENTID": { - "description": "Dropbox API client id", - "required": false - }, - "CMD_DROPBOX_CLIENTSECRET": { - "description": "Dropbox API client secret", - "required": false - }, - "CMD_DROPBOX_APP_KEY": { - "description": "Dropbox app key (for import/export)", - "required": false - }, - "CMD_GOOGLE_CLIENTID": { - "description": "Google API client id", - "required": false - }, - "CMD_GOOGLE_CLIENTSECRET": { - "description": "Google API client secret", - "required": false - }, - "CMD_GOOGLE_HOSTEDDOMAIN": { - "description": "Google API hosted domain (Provided only if the user belongs to a hosted domain)", - "required": false - }, - "CMD_IMGUR_CLIENTID": { - "description": "Imgur API client id", - "required": false - } - }, - "addons": [ - "heroku-postgresql" - ] -} diff --git a/config.json.example b/config.json.example deleted file mode 100644 index b1766c5cc..000000000 --- a/config.json.example +++ /dev/null @@ -1,126 +0,0 @@ -{ - "test": { - "db": { - "dialect": "sqlite", - "storage": ":memory:" - }, - "linkifyHeaderStyle": "gfm" - }, - "development": { - "loglevel": "debug", - "hsts": { - "enable": false - }, - "db": { - "dialect": "sqlite", - "storage": "./db.codimd.sqlite" - }, - "linkifyHeaderStyle": "gfm" - }, - "production": { - "domain": "localhost", - "loglevel": "info", - "hsts": { - "enable": true, - "maxAgeSeconds": 31536000, - "includeSubdomains": true, - "preload": true - }, - "csp": { - "enable": true, - "directives": { - }, - "upgradeInsecureRequests": "auto", - "addDefaults": true, - "addDisqus": true, - "addGoogleAnalytics": true - }, - "db": { - "username": "", - "password": "", - "database": "codimd", - "host": "localhost", - "port": "5432", - "dialect": "postgres" - }, - "facebook": { - "clientID": "change this", - "clientSecret": "change this" - }, - "twitter": { - "consumerKey": "change this", - "consumerSecret": "change this" - }, - "github": { - "clientID": "change this", - "clientSecret": "change this" - }, - "gitlab": { - "baseURL": "change this", - "clientID": "change this", - "clientSecret": "change this", - "scope": "use 'read_user' scope for auth user only or remove this property if you need gitlab snippet import/export support (will result to be default scope 'api')", - "version": "use 'v4' if gitlab version > 11, 'v3' otherwise. Default to 'v4'" - }, - "dropbox": { - "clientID": "change this", - "clientSecret": "change this", - "appKey": "change this" - }, - "google": { - "clientID": "change this", - "clientSecret": "change this", - "apiKey": "change this" - }, - "ldap": { - "url": "ldap://change_this", - "bindDn": null, - "bindCredentials": null, - "searchBase": "change this", - "searchFilter": "change this", - "searchAttributes": ["change this"], - "usernameField": "change this e.g. cn", - "useridField": "change this e.g. uid", - "tlsOptions": { - "changeme": "See https://nodejs.org/api/tls.html#tls_tls_connect_options_callback" - } - }, - "saml": { - "idpSsoUrl": "change: authentication endpoint of IdP", - "idpCert": "change: certificate file path of IdP in PEM format", - "issuer": "change or delete: identity of the service provider (default: config.serverURL)", - "identifierFormat": "change or delete: name identifier format (default: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress')", - "disableRequestedAuthnContext": "change or delete: true to allow any authentication method, false restricts to password authentication method (default: false)", - "groupAttribute": "change or delete: attribute name for group list (ex: memberOf)", - "requiredGroups": [ "change or delete: group names that allowed" ], - "externalGroups": [ "change or delete: group names that not allowed" ], - "attribute": { - "id": "change or delete this: attribute map for `id` (default: NameID)", - "username": "change or delete this: attribute map for `username` (default: NameID)", - "email": "change or delete this: attribute map for `email` (default: NameID)" - } - }, - "imgur": { - "clientID": "change this" - }, - "minio": { - "accessKey": "change this", - "secretKey": "change this", - "endPoint": "change this", - "secure": true, - "port": 9000 - }, - "s3": { - "accessKeyId": "change this", - "secretAccessKey": "change this", - "region": "change this" - }, - "s3bucket": "change this", - "azure": - { - "connectionString": "change this", - "container": "change this" - }, - "linkifyHeaderStyle": "gfm" - } -} diff --git a/old_src/lib/app.ts b/old_src/lib/app.ts deleted file mode 100644 index aa67b73f2..000000000 --- a/old_src/lib/app.ts +++ /dev/null @@ -1,312 +0,0 @@ -import compression from 'compression' -import flash from 'connect-flash' -// eslint-disable-next-line @typescript-eslint/camelcase -import connect_session_sequelize from 'connect-session-sequelize' -import cookieParser from 'cookie-parser' -import ejs from 'ejs' -import express from 'express' -import session from 'express-session' -import childProcess from 'child_process' -import helmet from 'helmet' -import http from 'http' -import https from 'https' -import i18n from 'i18n' -import fs from 'fs' -import methodOverride from 'method-override' -import morgan from 'morgan' -import passport from 'passport' -import passportSocketIo from 'passport.socketio' -import path from 'path' -import SocketIO from 'socket.io' -import WebSocket from 'ws' - -import { config } from './config' -import { addNonceToLocals, computeDirectives } from './csp' -import { errors } from './errors' -import { logger } from './logger' -import { Revision, sequelize, runMigrations } from './models' -import { realtime, State } from './realtime' -import { handleTermSignals } from './utils/functions' -import { AuthRouter, BaseRouter, HistoryRouter, ImageRouter, NoteRouter, StatusRouter, UserRouter } from './web' -import { tooBusy, checkURI, redirectWithoutTrailingSlashes, codiMDVersion } from './web/middleware' - -const rootPath = path.join(__dirname, '..') - -// session store -const SequelizeStore = connect_session_sequelize(session.Store) - -const sessionStore = new SequelizeStore({ - db: sequelize -}) - -// server setup -const app = express() -let server: http.Server -if (config.useSSL) { - const ca: string[] = [] - for (const path of config.sslCAPath) { - ca.push(fs.readFileSync(path, 'utf8')) - } - - const options = { - key: fs.readFileSync(config.sslKeyPath, 'utf8'), - cert: fs.readFileSync(config.sslCertPath, 'utf8'), - ca: ca, - dhparam: fs.readFileSync(config.dhParamPath, 'utf8'), - requestCert: false, - rejectUnauthorized: false, - heartbeatInterval: config.heartbeatInterval, - heartbeatTimeout: config.heartbeatTimeout - } - server = https.createServer(options, app) -} else { - server = http.createServer(app) -} - -// if we manage to provide HTTPS domains, but don't provide TLS ourselves -// obviously a proxy is involded. In order to make sure express is aware of -// this, we provide the option to trust proxies here. -if (!config.useSSL && config.protocolUseSSL) { - app.set('trust proxy', 1) -} - -// socket io -const io = SocketIO(server, { cookie: false }) -io.engine.ws = new WebSocket.Server({ - noServer: true, - perMessageDeflate: false -}) -// assign socket io to realtime -realtime.io = io - -// socket.io secure -io.use(realtime.secure) -// socket.io auth -io.use(passportSocketIo.authorize({ - cookieParser: cookieParser, - key: config.sessionName, - secret: config.sessionSecret, - store: sessionStore, - success: realtime.onAuthorizeSuccess, - fail: realtime.onAuthorizeFail -})) -// socket.io connection -io.sockets.on('connection', realtime.connection) - -// logger -app.use(morgan('combined', { - stream: { - write: function (message): void { - logger.info(message) - } - } -})) - -// use hsts to tell https users stick to this -if (config.hsts.enable) { - app.use(helmet.hsts({ - maxAge: config.hsts.maxAgeSeconds, - includeSubdomains: config.hsts.includeSubdomains, - preload: config.hsts.preload - })) -} else if (config.useSSL) { - logger.info('Consider enabling HSTS for extra security:') - logger.info('https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security') -} - -// Generate a random nonce per request, for CSP with inline scripts -app.use(addNonceToLocals) - -// use Content-Security-Policy to limit XSS, dangerous plugins, etc. -// https://helmetjs.github.io/docs/csp/ -if (config.csp.enable) { - app.use(helmet.contentSecurityPolicy({ - directives: computeDirectives() - })) -} else { - logger.info('Content-Security-Policy is disabled. This may be a security risk.') -} - -// Add referrer policy to improve privacy -app.use( - helmet.referrerPolicy({ - policy: 'same-origin' - }) -) - -// methodOverride -app.use(methodOverride('_method')) - -// compression -app.use(compression()) - -app.use(cookieParser()) - -i18n.configure({ - locales: ['en', 'zh-CN', 'zh-TW', 'fr', 'de', 'ja', 'es', 'ca', 'el', 'pt', 'it', 'tr', 'ru', 'nl', 'hr', 'pl', 'uk', 'hi', 'sv', 'eo', 'da', 'ko', 'id', 'sr', 'vi', 'ar', 'cs', 'sk'], - cookie: 'locale', - indent: ' ', // this is the style poeditor.com exports it, this creates less churn - directory: path.resolve(rootPath, config.localesPath), - updateFiles: config.updateI18nFiles -}) - -app.use(i18n.init) - -// set generally available variables for all views -app.locals.useCDN = config.useCDN -app.locals.serverURL = config.serverURL -app.locals.sourceURL = config.sourceURL -app.locals.allowAnonymous = config.allowAnonymous -app.locals.allowAnonymousEdits = config.allowAnonymousEdits -app.locals.authProviders = { - facebook: config.isFacebookEnable, - twitter: config.isTwitterEnable, - github: config.isGitHubEnable, - gitlab: config.isGitLabEnable, - dropbox: config.isDropboxEnable, - google: config.isGoogleEnable, - ldap: config.isLDAPEnable, - ldapProviderName: config.ldap.providerName, - saml: config.isSAMLEnable, - oauth2: config.isOAuth2Enable, - oauth2ProviderName: config.oauth2.providerName, - openID: config.isOpenIDEnable, - email: config.isEmailEnable, - allowEmailRegister: config.allowEmailRegister -} - -// Export/Import menu items -app.locals.enableDropBoxSave = config.isDropboxEnable -app.locals.enableGitHubGist = config.isGitHubEnable -app.locals.enableGitlabSnippets = config.isGitlabSnippetsEnable - -// session -app.use(session({ - name: config.sessionName, - secret: config.sessionSecret, - resave: false, // don't save session if unmodified - saveUninitialized: true, // always create session to ensure the origin - rolling: true, // reset maxAge on every response - cookie: { - maxAge: config.sessionLife, - sameSite: 'lax', - secure: config.useSSL || config.protocolUseSSL || false - }, - store: sessionStore -})) - -// session resumption -const tlsSessionStore = {} -server.on('newSession', function (id, data, cb) { - tlsSessionStore[id.toString('hex')] = data - cb() -}) -server.on('resumeSession', function (id, cb) { - cb(null, tlsSessionStore[id.toString('hex')] || null) -}) - -// middleware which blocks requests when we're too busy -app.use(tooBusy) - -app.use(flash()) - -// passport -app.use(passport.initialize()) -app.use(passport.session()) - -// check uri is valid before going further -app.use(checkURI) -// redirect url without trailing slashes -app.use(redirectWithoutTrailingSlashes) -app.use(codiMDVersion) - -// routes without sessions -// static files -app.use('/', express.static(path.resolve(rootPath, config.publicPath), { maxAge: config.staticCacheTime, index: false, redirect: false })) -app.use('/docs', express.static(path.resolve(rootPath, config.docsPath), { maxAge: config.staticCacheTime, redirect: false })) -app.use('/uploads', express.static(path.resolve(rootPath, config.uploadsPath), { maxAge: config.staticCacheTime, redirect: false })) -app.use('/default.md', express.static(path.resolve(rootPath, config.defaultNotePath), { maxAge: config.staticCacheTime })) - -// routes need sessions -// template files -app.set('views', config.viewPath) -// set render engine -app.engine('ejs', ejs.renderFile) -// set view engine -app.set('view engine', 'ejs') - -app.use(BaseRouter) -app.use(StatusRouter) -app.use(AuthRouter) -app.use(HistoryRouter) -app.use(UserRouter) -app.use(ImageRouter) -app.use(NoteRouter) - -// response not found if no any route matxches -app.get('*', function (req, res) { - errors.errorNotFound(res) -}) - -// log uncaught exception -process.on('uncaughtException', function (err) { - logger.error('An uncaught exception has occured.') - logger.error(err) - logger.error('Process will exit now.') - process.exit(1) -}) - -// listen -function startListen (): void { - let address - const listenCallback = function (): void { - const schema = config.useSSL ? 'HTTPS' : 'HTTP' - logger.info('%s Server listening at %s', schema, address) - realtime.state = State.Running - } - - const unixCallback = function (): void { - const throwErr = function (err): void { if (err) throw err } - if (config.socket.owner !== undefined) { - childProcess.spawn('chown', [config.socket.owner, config.path]).on('error', throwErr) - } - if (config.socket.group !== undefined) { - childProcess.spawn('chgrp', [config.socket.group, config.path]).on('error', throwErr) - } - if (config.socket.mode !== undefined) { - fs.chmod(config.path, config.socket.mode, throwErr) - } - listenCallback() - } - // use unix domain socket if 'path' is specified - if (config.path) { - address = config.path - server.listen(config.path, unixCallback) - } else { - address = config.host + ':' + config.port - server.listen(config.port, config.host, listenCallback) - } -} - -// sync db then start listen -sequelize.authenticate().then(async function () { - await runMigrations() - sessionStore.sync() - // check if realtime is ready - if (realtime.isReady()) { - Revision.checkAllNotesRevision(function (err, notes) { - if (err) { - throw new Error(err) - } - if (!notes || notes.length <= 0) { - return startListen() - } - }) - } else { - throw new Error('server still not ready after db synced') - } -}) - -process.on('SIGINT', () => handleTermSignals(io)) -process.on('SIGTERM', () => handleTermSignals(io)) -process.on('SIGQUIT', () => handleTermSignals(io)) diff --git a/old_src/lib/config/default.ts b/old_src/lib/config/default.ts deleted file mode 100644 index 63a8249d9..000000000 --- a/old_src/lib/config/default.ts +++ /dev/null @@ -1,122 +0,0 @@ -import os from 'os' -import { Config } from './interfaces' -import { Permission } from './enum' - -export const defaultConfig: Config = { - permission: Permission, - domain: '', - urlPath: '', - host: '0.0.0.0', - port: 3000, - socket: { - group: undefined, - owner: undefined, - mode: undefined - }, - loglevel: 'info', - urlAddPort: false, - allowOrigin: ['localhost'], - useSSL: false, - hsts: { - enable: true, - maxAgeSeconds: 60 * 60 * 24 * 365, - includeSubdomains: true, - preload: true - }, - csp: { - enable: true, - directives: {}, - addDefaults: true, - addDisqus: true, - addGoogleAnalytics: true, - upgradeInsecureRequests: 'auto', - reportURI: undefined - }, - protocolUseSSL: false, - useCDN: false, - allowAnonymous: true, - allowAnonymousEdits: false, - allowFreeURL: false, - forbiddenNoteIDs: ['robots.txt', 'favicon.ico', 'api', 'build', 'css', 'docs', 'fonts', 'js', 'uploads', 'vendor', 'views'], - defaultPermission: 'editable', - dbURL: '', - db: {}, - // ssl path - sslKeyPath: '', - sslCertPath: '', - sslCAPath: [], - dhParamPath: '', - // other path - publicPath: './public', - viewPath: './public/views', - tmpPath: os.tmpdir(), - defaultNotePath: './public/default.md', - docsPath: './public/docs', - uploadsPath: './public/uploads', - localesPath: './locales', - // session - sessionName: 'connect.sid', - sessionSecret: 'secret', - sessionSecretLen: 128, - sessionLife: 14 * 24 * 60 * 60 * 1000, // 14 days - staticCacheTime: 1 * 24 * 60 * 60 * 1000, // 1 day - // socket.io - heartbeatInterval: 5000, - heartbeatTimeout: 10000, - // too busy timeout - tooBusyLag: 70, - // document - documentMaxLength: 100000, - // image upload setting, available options are imgur/s3/filesystem/azure/lutim - imageUploadType: 'filesystem', - lutim: { - url: 'https://framapic.org/' - }, - minio: { - accessKey: undefined, - secretKey: undefined, - endPoint: undefined, - secure: true, - port: 9000 - }, - gitlab: { - baseURL: undefined, - clientID: undefined, - clientSecret: undefined, - scope: undefined, - version: 'v4' - }, - saml: { - idpSsoUrl: undefined, - idpCert: undefined, - issuer: undefined, - identifierFormat: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', - disableRequestedAuthnContext: false, - groupAttribute: undefined, - externalGroups: [], - requiredGroups: [], - attribute: { - id: undefined, - username: undefined, - email: undefined - } - }, - email: true, - allowEmailRegister: true, - allowGravatar: true, - openID: false, - // linkifyHeaderStyle - How is a header text converted into a link id. - // Header Example: "3.1. Good Morning my Friend! - Do you have 5$?" - // * 'keep-case' is the legacy CodiMD value. - // Generated id: "31-Good-Morning-my-Friend---Do-you-have-5" - // * 'lower-case' is the same like legacy (see above), but converted to lower-case. - // Generated id: "#31-good-morning-my-friend---do-you-have-5" - // * 'gfm' _GitHub-Flavored Markdown_ style as described here: - // https://gist.github.com/asabaylus/3071099#gistcomment-1593627 - // It works like 'lower-case', but making sure the ID is unique. - // This is What GitHub, GitLab and (hopefully) most other tools use. - // Generated id: "31-good-morning-my-friend---do-you-have-5" - // 2nd appearance: "31-good-morning-my-friend---do-you-have-5-1" - // 3rd appearance: "31-good-morning-my-friend---do-you-have-5-2" - linkifyHeaderStyle: 'keep-case' -} diff --git a/old_src/lib/config/defaultSSL.ts b/old_src/lib/config/defaultSSL.ts deleted file mode 100644 index 79b27674f..000000000 --- a/old_src/lib/config/defaultSSL.ts +++ /dev/null @@ -1,15 +0,0 @@ -import fs from 'fs' - -function getFile (path): string { - if (fs.existsSync(path)) { - return path - } - return '' -} - -export const defaultSSL = { - sslKeyPath: getFile('/run/secrets/key.pem'), - sslCertPath: getFile('/run/secrets/cert.pem'), - sslCAPath: getFile('/run/secrets/ca.pem') !== undefined ? [getFile('/run/secrets/ca.pem')] : [], - dhParamPath: getFile('/run/secrets/dhparam.pem') -} diff --git a/old_src/lib/config/dockerSecret.ts b/old_src/lib/config/dockerSecret.ts deleted file mode 100644 index 51b232b85..000000000 --- a/old_src/lib/config/dockerSecret.ts +++ /dev/null @@ -1,57 +0,0 @@ -import fs from 'fs' -import path from 'path' - -const basePath = path.resolve('/run/secrets/') - -function getSecret (secret): string | undefined { - const filePath = path.join(basePath, secret) - if (fs.existsSync(filePath)) return fs.readFileSync(filePath, 'utf-8') - return undefined -} - -export let dockerSecret: { s3: { accessKeyId: string | undefined; secretAccessKey: string | undefined }; github: { clientID: string | undefined; clientSecret: string | undefined }; facebook: { clientID: string | undefined; clientSecret: string | undefined }; google: { clientID: string | undefined; hostedDomain: string | undefined; clientSecret: string | undefined }; sessionSecret: string | undefined; sslKeyPath: string | undefined; twitter: { consumerSecret: string | undefined; consumerKey: string | undefined }; dropbox: { clientID: string | undefined; clientSecret: string | undefined; appKey: string | undefined }; gitlab: { clientID: string | undefined; clientSecret: string | undefined }; imgur: string | undefined; sslCertPath: string | undefined; sslCAPath: (string | undefined)[]; dhParamPath: string | undefined; dbURL: string | undefined; azure: { connectionString: string | undefined } } - -if (fs.existsSync(basePath)) { - dockerSecret = { - dbURL: getSecret('dbURL'), - sessionSecret: getSecret('sessionsecret'), - sslKeyPath: getSecret('sslkeypath'), - sslCertPath: getSecret('sslcertpath'), - sslCAPath: [getSecret('sslcapath')], - dhParamPath: getSecret('dhparampath'), - s3: { - accessKeyId: getSecret('s3_acccessKeyId'), - secretAccessKey: getSecret('s3_secretAccessKey') - }, - azure: { - connectionString: getSecret('azure_connectionString') - }, - facebook: { - clientID: getSecret('facebook_clientID'), - clientSecret: getSecret('facebook_clientSecret') - }, - twitter: { - consumerKey: getSecret('twitter_consumerKey'), - consumerSecret: getSecret('twitter_consumerSecret') - }, - github: { - clientID: getSecret('github_clientID'), - clientSecret: getSecret('github_clientSecret') - }, - gitlab: { - clientID: getSecret('gitlab_clientID'), - clientSecret: getSecret('gitlab_clientSecret') - }, - dropbox: { - clientID: getSecret('dropbox_clientID'), - clientSecret: getSecret('dropbox_clientSecret'), - appKey: getSecret('dropbox_appKey') - }, - google: { - clientID: getSecret('google_clientID'), - clientSecret: getSecret('google_clientSecret'), - hostedDomain: getSecret('google_hostedDomain') - }, - imgur: getSecret('imgur_clientid') - } -} diff --git a/old_src/lib/config/enum.ts b/old_src/lib/config/enum.ts deleted file mode 100644 index 2ebb1a275..000000000 --- a/old_src/lib/config/enum.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface Environment { - development: string; - production: string; - test: string; -} - -export const Environment: Environment = { - development: 'development', - production: 'production', - test: 'test' -} - -export interface Permission { - freely: string; - editable: string; - limited: string; - locked: string; - protected: string; - private: string; -} - -export const Permission: Permission = { - freely: 'freely', - editable: 'editable', - limited: 'limited', - locked: 'locked', - protected: 'protected', - private: 'private' -} diff --git a/old_src/lib/config/environment.ts b/old_src/lib/config/environment.ts deleted file mode 100644 index c8f99a544..000000000 --- a/old_src/lib/config/environment.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { toArrayConfig, toBooleanConfig, toIntegerConfig } from './utils' - -export const environment = { - sourceURL: process.env.CMD_SOURCE_URL, - domain: process.env.CMD_DOMAIN, - urlPath: process.env.CMD_URL_PATH, - host: process.env.CMD_HOST, - port: toIntegerConfig(process.env.CMD_PORT), - path: process.env.CMD_PATH, - socket: { - group: process.env.CMD_SOCKET_GROUP, - owner: process.env.CMD_SOCKET_OWNER, - mode: process.env.CMD_SOCKET_MODE - }, - loglevel: process.env.CMD_LOGLEVEL, - urlAddPort: toBooleanConfig(process.env.CMD_URL_ADDPORT), - useSSL: toBooleanConfig(process.env.CMD_USESSL), - hsts: { - enable: toBooleanConfig(process.env.CMD_HSTS_ENABLE), - maxAgeSeconds: toIntegerConfig(process.env.CMD_HSTS_MAX_AGE), - includeSubdomains: toBooleanConfig(process.env.CMD_HSTS_INCLUDE_SUBDOMAINS), - preload: toBooleanConfig(process.env.CMD_HSTS_PRELOAD) - }, - csp: { - enable: toBooleanConfig(process.env.CMD_CSP_ENABLE), - reportURI: process.env.CMD_CSP_REPORTURI - }, - protocolUseSSL: toBooleanConfig(process.env.CMD_PROTOCOL_USESSL), - allowOrigin: toArrayConfig(process.env.CMD_ALLOW_ORIGIN), - useCDN: toBooleanConfig(process.env.CMD_USECDN), - allowAnonymous: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS), - allowAnonymousEdits: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS_EDITS), - allowFreeURL: toBooleanConfig(process.env.CMD_ALLOW_FREEURL), - forbiddenNoteIDs: toArrayConfig(process.env.CMD_FORBIDDEN_NOTE_IDS), - defaultPermission: process.env.CMD_DEFAULT_PERMISSION, - dbURL: process.env.CMD_DB_URL, - sessionSecret: process.env.CMD_SESSION_SECRET, - sessionLife: toIntegerConfig(process.env.CMD_SESSION_LIFE), - tooBusyLag: toIntegerConfig(process.env.CMD_TOOBUSY_LAG), - imageUploadType: process.env.CMD_IMAGE_UPLOAD_TYPE, - imgur: { - clientID: process.env.CMD_IMGUR_CLIENTID - }, - s3: { - accessKeyId: process.env.CMD_S3_ACCESS_KEY_ID, - secretAccessKey: process.env.CMD_S3_SECRET_ACCESS_KEY, - region: process.env.CMD_S3_REGION, - endpoint: process.env.CMD_S3_ENDPOINT - }, - minio: { - accessKey: process.env.CMD_MINIO_ACCESS_KEY, - secretKey: process.env.CMD_MINIO_SECRET_KEY, - endPoint: process.env.CMD_MINIO_ENDPOINT, - secure: toBooleanConfig(process.env.CMD_MINIO_SECURE), - port: toIntegerConfig(process.env.CMD_MINIO_PORT) - }, - lutim: { - url: process.env.CMD_LUTIM_URL - }, - s3bucket: process.env.CMD_S3_BUCKET, - azure: { - connectionString: process.env.CMD_AZURE_CONNECTION_STRING, - container: process.env.CMD_AZURE_CONTAINER - }, - facebook: { - clientID: process.env.CMD_FACEBOOK_CLIENTID, - clientSecret: process.env.CMD_FACEBOOK_CLIENTSECRET - }, - twitter: { - consumerKey: process.env.CMD_TWITTER_CONSUMERKEY, - consumerSecret: process.env.CMD_TWITTER_CONSUMERSECRET - }, - github: { - clientID: process.env.CMD_GITHUB_CLIENTID, - clientSecret: process.env.CMD_GITHUB_CLIENTSECRET - }, - gitlab: { - baseURL: process.env.CMD_GITLAB_BASEURL, - clientID: process.env.CMD_GITLAB_CLIENTID, - clientSecret: process.env.CMD_GITLAB_CLIENTSECRET, - scope: process.env.CMD_GITLAB_SCOPE - }, - oauth2: { - providerName: process.env.CMD_OAUTH2_PROVIDERNAME, - baseURL: process.env.CMD_OAUTH2_BASEURL, - userProfileURL: process.env.CMD_OAUTH2_USER_PROFILE_URL, - userProfileUsernameAttr: process.env.CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR, - userProfileDisplayNameAttr: process.env.CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR, - userProfileEmailAttr: process.env.CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR, - tokenURL: process.env.CMD_OAUTH2_TOKEN_URL, - authorizationURL: process.env.CMD_OAUTH2_AUTHORIZATION_URL, - clientID: process.env.CMD_OAUTH2_CLIENT_ID, - clientSecret: process.env.CMD_OAUTH2_CLIENT_SECRET, - scope: process.env.CMD_OAUTH2_SCOPE - }, - dropbox: { - clientID: process.env.CMD_DROPBOX_CLIENTID, - clientSecret: process.env.CMD_DROPBOX_CLIENTSECRET, - appKey: process.env.CMD_DROPBOX_APPKEY - }, - google: { - clientID: process.env.CMD_GOOGLE_CLIENTID, - clientSecret: process.env.CMD_GOOGLE_CLIENTSECRET, - hostedDomain: process.env.CMD_GOOGLE_HOSTEDDOMAIN - }, - ldap: { - providerName: process.env.CMD_LDAP_PROVIDERNAME, - url: process.env.CMD_LDAP_URL, - bindDn: process.env.CMD_LDAP_BINDDN, - bindCredentials: process.env.CMD_LDAP_BINDCREDENTIALS, - searchBase: process.env.CMD_LDAP_SEARCHBASE, - searchFilter: process.env.CMD_LDAP_SEARCHFILTER, - searchAttributes: toArrayConfig(process.env.CMD_LDAP_SEARCHATTRIBUTES), - usernameField: process.env.CMD_LDAP_USERNAMEFIELD, - useridField: process.env.CMD_LDAP_USERIDFIELD, - tlsca: process.env.CMD_LDAP_TLS_CA - }, - saml: { - idpSsoUrl: process.env.CMD_SAML_IDPSSOURL, - idpCert: process.env.CMD_SAML_IDPCERT, - issuer: process.env.CMD_SAML_ISSUER, - identifierFormat: process.env.CMD_SAML_IDENTIFIERFORMAT, - disableRequestedAuthnContext: toBooleanConfig(process.env.CMD_SAML_DISABLEREQUESTEDAUTHNCONTEXT), - groupAttribute: process.env.CMD_SAML_GROUPATTRIBUTE, - externalGroups: toArrayConfig(process.env.CMD_SAML_EXTERNALGROUPS, '|', []), - requiredGroups: toArrayConfig(process.env.CMD_SAML_REQUIREDGROUPS, '|', []), - attribute: { - id: process.env.CMD_SAML_ATTRIBUTE_ID, - username: process.env.CMD_SAML_ATTRIBUTE_USERNAME, - email: process.env.CMD_SAML_ATTRIBUTE_EMAIL - } - }, - email: toBooleanConfig(process.env.CMD_EMAIL), - allowEmailRegister: toBooleanConfig(process.env.CMD_ALLOW_EMAIL_REGISTER), - allowGravatar: toBooleanConfig(process.env.CMD_ALLOW_GRAVATAR), - openID: toBooleanConfig(process.env.CMD_OPENID), - linkifyHeaderStyle: process.env.CMD_LINKIFY_HEADER_STYLE -} diff --git a/old_src/lib/config/hackmdEnvironment.ts b/old_src/lib/config/hackmdEnvironment.ts deleted file mode 100644 index 19b390b3e..000000000 --- a/old_src/lib/config/hackmdEnvironment.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { toArrayConfig, toBooleanConfig, toIntegerConfig } from './utils' - -export const hackmdEnvironment = { - domain: process.env.HMD_DOMAIN, - urlPath: process.env.HMD_URL_PATH, - port: toIntegerConfig(process.env.HMD_PORT), - urlAddPort: toBooleanConfig(process.env.HMD_URL_ADDPORT), - useSSL: toBooleanConfig(process.env.HMD_USESSL), - hsts: { - enable: toBooleanConfig(process.env.HMD_HSTS_ENABLE), - maxAgeSeconds: toIntegerConfig(process.env.HMD_HSTS_MAX_AGE), - includeSubdomains: toBooleanConfig(process.env.HMD_HSTS_INCLUDE_SUBDOMAINS), - preload: toBooleanConfig(process.env.HMD_HSTS_PRELOAD) - }, - csp: { - enable: toBooleanConfig(process.env.HMD_CSP_ENABLE), - reportURI: process.env.HMD_CSP_REPORTURI - }, - protocolUseSSL: toBooleanConfig(process.env.HMD_PROTOCOL_USESSL), - allowOrigin: toArrayConfig(process.env.HMD_ALLOW_ORIGIN), - useCDN: toBooleanConfig(process.env.HMD_USECDN), - allowAnonymous: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS), - allowAnonymousEdits: toBooleanConfig(process.env.HMD_ALLOW_ANONYMOUS_EDITS), - allowFreeURL: toBooleanConfig(process.env.HMD_ALLOW_FREEURL), - defaultPermission: process.env.HMD_DEFAULT_PERMISSION, - dbURL: process.env.HMD_DB_URL, - sessionSecret: process.env.HMD_SESSION_SECRET, - sessionLife: toIntegerConfig(process.env.HMD_SESSION_LIFE), - imageUploadType: process.env.HMD_IMAGE_UPLOAD_TYPE, - imgur: { - clientID: process.env.HMD_IMGUR_CLIENTID - }, - s3: { - accessKeyId: process.env.HMD_S3_ACCESS_KEY_ID, - secretAccessKey: process.env.HMD_S3_SECRET_ACCESS_KEY, - region: process.env.HMD_S3_REGION - }, - minio: { - accessKey: process.env.HMD_MINIO_ACCESS_KEY, - secretKey: process.env.HMD_MINIO_SECRET_KEY, - endPoint: process.env.HMD_MINIO_ENDPOINT, - secure: toBooleanConfig(process.env.HMD_MINIO_SECURE), - port: toIntegerConfig(process.env.HMD_MINIO_PORT) - }, - s3bucket: process.env.HMD_S3_BUCKET, - azure: { - connectionString: process.env.HMD_AZURE_CONNECTION_STRING, - container: process.env.HMD_AZURE_CONTAINER - }, - facebook: { - clientID: process.env.HMD_FACEBOOK_CLIENTID, - clientSecret: process.env.HMD_FACEBOOK_CLIENTSECRET - }, - twitter: { - consumerKey: process.env.HMD_TWITTER_CONSUMERKEY, - consumerSecret: process.env.HMD_TWITTER_CONSUMERSECRET - }, - github: { - clientID: process.env.HMD_GITHUB_CLIENTID, - clientSecret: process.env.HMD_GITHUB_CLIENTSECRET - }, - gitlab: { - baseURL: process.env.HMD_GITLAB_BASEURL, - clientID: process.env.HMD_GITLAB_CLIENTID, - clientSecret: process.env.HMD_GITLAB_CLIENTSECRET, - scope: process.env.HMD_GITLAB_SCOPE - }, - oauth2: { - baseURL: process.env.HMD_OAUTH2_BASEURL, - userProfileURL: process.env.HMD_OAUTH2_USER_PROFILE_URL, - userProfileUsernameAttr: process.env.HMD_OAUTH2_USER_PROFILE_USERNAME_ATTR, - userProfileDisplayNameAttr: process.env.HMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR, - userProfileEmailAttr: process.env.HMD_OAUTH2_USER_PROFILE_EMAIL_ATTR, - tokenURL: process.env.HMD_OAUTH2_TOKEN_URL, - authorizationURL: process.env.HMD_OAUTH2_AUTHORIZATION_URL, - clientID: process.env.HMD_OAUTH2_CLIENT_ID, - clientSecret: process.env.HMD_OAUTH2_CLIENT_SECRET, - scope: process.env.HMD_OAUTH2_SCOPE - }, - dropbox: { - clientID: process.env.HMD_DROPBOX_CLIENTID, - clientSecret: process.env.HMD_DROPBOX_CLIENTSECRET, - appKey: process.env.HMD_DROPBOX_APPKEY - }, - google: { - clientID: process.env.HMD_GOOGLE_CLIENTID, - clientSecret: process.env.HMD_GOOGLE_CLIENTSECRET - }, - ldap: { - providerName: process.env.HMD_LDAP_PROVIDERNAME, - url: process.env.HMD_LDAP_URL, - bindDn: process.env.HMD_LDAP_BINDDN, - bindCredentials: process.env.HMD_LDAP_BINDCREDENTIALS, - searchBase: process.env.HMD_LDAP_SEARCHBASE, - searchFilter: process.env.HMD_LDAP_SEARCHFILTER, - searchAttributes: toArrayConfig(process.env.HMD_LDAP_SEARCHATTRIBUTES), - usernameField: process.env.HMD_LDAP_USERNAMEFIELD, - useridField: process.env.HMD_LDAP_USERIDFIELD, - tlsca: process.env.HMD_LDAP_TLS_CA - }, - saml: { - idpSsoUrl: process.env.HMD_SAML_IDPSSOURL, - idpCert: process.env.HMD_SAML_IDPCERT, - issuer: process.env.HMD_SAML_ISSUER, - identifierFormat: process.env.HMD_SAML_IDENTIFIERFORMAT, - disableRequestedAuthnContext: toBooleanConfig(process.env.HMD_SAML_DISABLEREQUESTEDAUTHNCONTEXT), - groupAttribute: process.env.HMD_SAML_GROUPATTRIBUTE, - externalGroups: toArrayConfig(process.env.HMD_SAML_EXTERNALGROUPS, '|', []), - requiredGroups: toArrayConfig(process.env.HMD_SAML_REQUIREDGROUPS, '|', []), - attribute: { - id: process.env.HMD_SAML_ATTRIBUTE_ID, - username: process.env.HMD_SAML_ATTRIBUTE_USERNAME, - email: process.env.HMD_SAML_ATTRIBUTE_EMAIL - } - }, - email: toBooleanConfig(process.env.HMD_EMAIL), - allowEmailRegister: toBooleanConfig(process.env.HMD_ALLOW_EMAIL_REGISTER) -} diff --git a/old_src/lib/config/index.ts b/old_src/lib/config/index.ts deleted file mode 100644 index beaa09d88..000000000 --- a/old_src/lib/config/index.ts +++ /dev/null @@ -1,211 +0,0 @@ -import crypto from 'crypto' -import fs from 'fs' -import path from 'path' -import { merge } from 'lodash' -import { Environment, Permission } from './enum' -import { logger } from '../logger' -import { getGitCommit, getGitHubURL } from './utils' -import { defaultConfig } from './default' -import { defaultSSL } from './defaultSSL' -import { oldDefault } from './oldDefault' -import { oldEnvironment } from './oldEnvironment' -import { hackmdEnvironment } from './hackmdEnvironment' -import { environment } from './environment' -import { dockerSecret } from './dockerSecret' -import deepFreeze = require('deep-freeze') - -const appRootPath = path.resolve(__dirname, '../../../') -const env = process.env.NODE_ENV || Environment.development -const debugConfig = { - debug: (env === Environment.development) -} - -// Get version string from package.json -// TODO: There are other ways to geht the current version -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { version, repository } = require(path.join(appRootPath, 'package.json')) - -const commitID = getGitCommit(appRootPath) -const sourceURL = getGitHubURL(repository.url, commitID || version) -const fullversion = commitID ? `${version}-${commitID}` : version - -const packageConfig = { - version: version, - minimumCompatibleVersion: '0.5.0', - fullversion: fullversion, - sourceURL: sourceURL -} - -const configFilePath = path.resolve(appRootPath, process.env.CMD_CONFIG_FILE || - 'config.json') -const fileConfig = fs.existsSync(configFilePath) ? require(configFilePath)[env] : undefined -merge(defaultConfig, defaultSSL) -merge(defaultConfig, oldDefault) -merge(defaultConfig, debugConfig) -merge(defaultConfig, packageConfig) -merge(defaultConfig, fileConfig) -merge(defaultConfig, oldEnvironment) -merge(defaultConfig, hackmdEnvironment) -merge(defaultConfig, environment) -merge(defaultConfig, dockerSecret) - -if (['debug', 'verbose', 'info', 'warn', 'error'].includes(defaultConfig.loglevel)) { - logger.level = defaultConfig.loglevel -} else { - logger.error('Selected loglevel %s doesn\'t exist, using default level \'debug\'. Available options: debug, verbose, info, warn, error', defaultConfig.loglevel) -} - -// load LDAP CA -if (defaultConfig.ldap?.tlsca) { - const ca = defaultConfig.ldap.tlsca.split(',') - const caContent: string[] = [] - for (const i of ca) { - if (fs.existsSync(i)) { - caContent.push(fs.readFileSync(i, 'utf8')) - } - } - const tlsOptions = { - ca: caContent - } - defaultConfig.ldap.tlsOptions = defaultConfig.ldap.tlsOptions ? Object.assign(defaultConfig.ldap.tlsOptions, tlsOptions) : tlsOptions -} - -// Permission -defaultConfig.permission = Permission -if (!defaultConfig.allowAnonymous && !defaultConfig.allowAnonymousEdits) { - delete defaultConfig.permission.freely -} -if (!(defaultConfig.defaultPermission in defaultConfig.permission)) { - defaultConfig.defaultPermission = defaultConfig.permission.editable -} - -// cache result, cannot change config in runtime!!! -defaultConfig.isStandardHTTPsPort = (function isStandardHTTPsPort (): boolean { - return defaultConfig.useSSL && defaultConfig.port === 443 -})() -defaultConfig.isStandardHTTPPort = (function isStandardHTTPPort (): boolean { - return !defaultConfig.useSSL && defaultConfig.port === 80 -})() - -// cache serverURL -defaultConfig.serverURL = (function getserverurl (): string { - let url = '' - if (defaultConfig.domain) { - const protocol = defaultConfig.protocolUseSSL ? 'https://' : 'http://' - url = protocol + defaultConfig.domain - if (defaultConfig.urlAddPort) { - if (!defaultConfig.isStandardHTTPPort || !defaultConfig.isStandardHTTPsPort) { - url += ':' + defaultConfig.port - } - } - } - if (defaultConfig.urlPath) { - url += '/' + defaultConfig.urlPath - } - return url -})() - -if (defaultConfig.serverURL === '') { - logger.warn('Neither \'domain\' nor \'CMD_DOMAIN\' is configured. This can cause issues with various components.\nHint: Make sure \'protocolUseSSL\' and \'urlAddPort\' or \'CMD_PROTOCOL_USESSL\' and \'CMD_URL_ADDPORT\' are configured properly.') -} - -defaultConfig.Environment = Environment - -// auth method -defaultConfig.isFacebookEnable = defaultConfig.facebook?.clientID && defaultConfig.facebook.clientSecret -defaultConfig.isGoogleEnable = defaultConfig.google?.clientID && defaultConfig.google.clientSecret -defaultConfig.isDropboxEnable = defaultConfig.dropbox?.clientID && defaultConfig.dropbox.clientSecret -defaultConfig.isTwitterEnable = defaultConfig.twitter?.consumerKey && defaultConfig.twitter.consumerSecret -defaultConfig.isEmailEnable = defaultConfig.email -defaultConfig.isOpenIDEnable = defaultConfig.openID -defaultConfig.isGitHubEnable = defaultConfig.github?.clientID && defaultConfig.github.clientSecret -defaultConfig.isGitLabEnable = defaultConfig.gitlab?.clientID && defaultConfig.gitlab.clientSecret -defaultConfig.isLDAPEnable = defaultConfig.ldap?.url -defaultConfig.isSAMLEnable = defaultConfig.saml?.idpSsoUrl -defaultConfig.isOAuth2Enable = defaultConfig.oauth2?.clientID && defaultConfig.oauth2.clientSecret - -// Check gitlab api version -if (defaultConfig.gitlab && defaultConfig.gitlab.version !== 'v4' && defaultConfig.gitlab.version !== 'v3') { - logger.warn('config.js contains wrong version (' + defaultConfig.gitlab.version + ') for gitlab api; it should be \'v3\' or \'v4\'. Defaulting to v4') - defaultConfig.gitlab.version = 'v4' -} -// If gitlab scope is api, enable snippets Export/import -defaultConfig.isGitlabSnippetsEnable = (!defaultConfig.gitlab?.scope || defaultConfig.gitlab.scope === 'api') && defaultConfig.isGitLabEnable - -// Only update i18n files in development setups -defaultConfig.updateI18nFiles = (env === Environment.development) - -// merge legacy values -const keys = Object.keys(defaultConfig) -const uppercase = /[A-Z]/ -for (let i = keys.length; i--;) { - const lowercaseKey = keys[i].toLowerCase() - // if the config contains uppercase letters - // and a lowercase version of this setting exists - // and the config with uppercase is not set - // we set the new config using the old key. - if (uppercase.test(keys[i]) && - defaultConfig[lowercaseKey] !== undefined && - fileConfig[keys[i]] === undefined) { - logger.warn('config.js contains deprecated lowercase setting for ' + keys[i] + '. Please change your config.js file to replace ' + lowercaseKey + ' with ' + keys[i]) - defaultConfig[keys[i]] = defaultConfig[lowercaseKey] - } -} - -// Notify users about the prefix change and inform them they use legacy prefix for environment variables -if (Object.keys(process.env).toString().includes('HMD_')) { - logger.warn('Using legacy HMD prefix for environment variables. Please change your variables in future. For details see: https://github.com/codimd/server#environment-variables-will-overwrite-other-server-configs') -} - -// Generate session secret if it stays on default values -if (defaultConfig.sessionSecret === 'secret') { - logger.warn('Session secret not set. Using random generated one. Please set `sessionSecret` in your config.js file. All users will be logged out.') - defaultConfig.sessionSecret = crypto.randomBytes(Math.ceil(defaultConfig.sessionSecretLen / 2)) // generate crypto graphic random number - .toString('hex') // convert to hexadecimal format - .slice(0, defaultConfig.sessionSecretLen) // return required number of characters -} - -// Validate upload upload providers -if (!['filesystem', 's3', 'minio', 'imgur', 'azure', 'lutim'].includes(defaultConfig.imageUploadType)) { - logger.error('"imageuploadtype" is not correctly set. Please use "filesystem", "s3", "minio", "azure", "lutim" or "imgur". Defaulting to "filesystem"') - defaultConfig.imageUploadType = 'filesystem' -} - -// figure out mime types for image uploads -switch (defaultConfig.imageUploadType) { - case 'imgur': - defaultConfig.allowedUploadMimeTypes = [ - 'image/jpeg', - 'image/png', - 'image/jpg', - 'image/gif' - ] - break - default: - defaultConfig.allowedUploadMimeTypes = [ - 'image/jpeg', - 'image/png', - 'image/jpg', - 'image/gif', - 'image/svg+xml' - ] -} - -// generate correct path -defaultConfig.sslCAPath.forEach(function (capath, i, array) { - array[i] = path.resolve(appRootPath, capath) -}) - -defaultConfig.sslCertPath = path.resolve(appRootPath, defaultConfig.sslCertPath) -defaultConfig.sslKeyPath = path.resolve(appRootPath, defaultConfig.sslKeyPath) -defaultConfig.dhParamPath = path.resolve(appRootPath, defaultConfig.dhParamPath) -defaultConfig.viewPath = path.resolve(appRootPath, defaultConfig.viewPath) -defaultConfig.tmpPath = path.resolve(appRootPath, defaultConfig.tmpPath) -defaultConfig.publicPath = path.resolve(appRootPath, defaultConfig.publicPath) -defaultConfig.defaultNotePath = path.resolve(appRootPath, defaultConfig.defaultNotePath) -defaultConfig.docsPath = path.resolve(appRootPath, defaultConfig.docsPath) -defaultConfig.uploadsPath = path.resolve(appRootPath, defaultConfig.uploadsPath) -defaultConfig.localesPath = path.resolve(appRootPath, defaultConfig.localesPath) - -// make config readonly -export const config = deepFreeze(defaultConfig) diff --git a/old_src/lib/config/interfaces.ts b/old_src/lib/config/interfaces.ts deleted file mode 100644 index c9593b329..000000000 --- a/old_src/lib/config/interfaces.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { Permission } from './enum' -import { IHelmetContentSecurityPolicyDirectives } from 'helmet' - -type CSPDirectives = IHelmetContentSecurityPolicyDirectives - -export interface Config { - permission: Permission; - domain: string; - urlPath: string; - host: string; - port: number; - loglevel: string; - urlAddPort: boolean; - allowOrigin: string[]; - useSSL: boolean; - hsts: { - enable: boolean; - maxAgeSeconds: number; - includeSubdomains: boolean; - preload: boolean; - }; - csp: { - enable: boolean; - directives?: CSPDirectives; - addDefaults: boolean; - addDisqus: boolean; - addGoogleAnalytics: boolean; - upgradeInsecureRequests: string | boolean; - reportURI?: string; - }; - protocolUseSSL: boolean; - useCDN: boolean; - allowAnonymous: boolean; - allowAnonymousEdits: boolean; - allowFreeURL: boolean; - forbiddenNoteIDs: string[]; - defaultPermission: string; - dbURL: string; - db; - sslKeyPath: string; - sslCertPath: string; - sslCAPath: string[]; - dhParamPath: string; - publicPath: string; - viewPath: string; - tmpPath: string; - defaultNotePath: string; - docsPath: string; - uploadsPath: string; - sessionName: string; - sessionSecret: string; - sessionSecretLen: number; - sessionLife: number; - staticCacheTime: number; - heartbeatInterval: number; - heartbeatTimeout: number; - tooBusyLag: number; - documentMaxLength: number; - imageUploadType: 'azure' | 'filesystem' | 'imgur' | 'lutim' | 'minio' | 's3'; - lutim?: { - url: string; - }; - imgur?: { - clientID: string; - }; - s3?: { - accessKeyId: string; - secretAccessKey: string; - region: string; - }; - minio?: { - accessKey?: string; - secretKey?: string; - endPoint?: string; - secure?: boolean; - port?: number; - }; - s3bucket?: string; - azure?: { - connectionString: string; - container: string; - }; - oauth2?: { - providerName: string; - authorizationURL: string; - tokenURL: string; - clientID: string; - clientSecret: string; - }; - facebook?: { - clientID: string; - clientSecret: string; - }; - twitter?: { - consumerKey: string; - consumerSecret: string; - }; - github?: { - clientID: string; - clientSecret: string; - }; - gitlab?: { - baseURL?: string; - clientID?: string; - clientSecret?: string; - scope?: string; - version?: string; - }; - dropbox?: { - clientID: string; - clientSecret: string; - appKey: string; - }; - google?: { - clientID: string; - clientSecret: string; - hostedDomain: string; - }; - ldap?: { - providerName: string; - url: string; - bindDn: string; - bindCredentials: string; - searchBase: string; - searchFilter: string; - searchAttributes: string; - usernameField: string; - useridField: string; - tlsca: string; - starttls?: boolean; - tlsOptions: { - ca: string[]; - }; - }; - saml?: { - idpSsoUrl?: string; - idpCert?: string; - issuer?: string; - identifierFormat?: string; - disableRequestedAuthnContext?: boolean; - groupAttribute?: string; - externalGroups?: string[]; - requiredGroups?: string[]; - attribute?: { - id?: string; - username?: string; - email?: string; - }; - }; - email: boolean; - allowEmailRegister: boolean; - allowGravatar: boolean; - openID: boolean; - linkifyHeaderStyle: string; - - // TODO: Remove escape hatch for dynamically added properties - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [propName: string]: any; -} diff --git a/old_src/lib/config/oldDefault.ts b/old_src/lib/config/oldDefault.ts deleted file mode 100644 index 7c350bb62..000000000 --- a/old_src/lib/config/oldDefault.ts +++ /dev/null @@ -1,39 +0,0 @@ -export const oldDefault = { - urlpath: undefined, - urladdport: undefined, - alloworigin: undefined, - usessl: undefined, - protocolusessl: undefined, - usecdn: undefined, - allowanonymous: undefined, - allowanonymousedits: undefined, - allowfreeurl: undefined, - defaultpermission: undefined, - dburl: undefined, - // ssl path - sslkeypath: undefined, - sslcertpath: undefined, - sslcapath: undefined, - dhparampath: undefined, - // other path - tmppath: undefined, - defaultnotepath: undefined, - docspath: undefined, - indexpath: undefined, - hackmdpath: undefined, - errorpath: undefined, - prettypath: undefined, - slidepath: undefined, - // session - sessionname: undefined, - sessionsecret: undefined, - sessionlife: undefined, - staticcachetime: undefined, - // socket.io - heartbeatinterval: undefined, - heartbeattimeout: undefined, - // document - documentmaxlength: undefined, - imageuploadtype: undefined, - allowemailregister: undefined -} diff --git a/old_src/lib/config/oldEnvironment.ts b/old_src/lib/config/oldEnvironment.ts deleted file mode 100644 index f68bb3183..000000000 --- a/old_src/lib/config/oldEnvironment.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { toBooleanConfig } from './utils' - -export const oldEnvironment = { - debug: toBooleanConfig(process.env.DEBUG), - dburl: process.env.DATABASE_URL, - urlpath: process.env.URL_PATH, - port: process.env.PORT -} diff --git a/old_src/lib/config/utils.ts b/old_src/lib/config/utils.ts deleted file mode 100644 index 56cb5137e..000000000 --- a/old_src/lib/config/utils.ts +++ /dev/null @@ -1,53 +0,0 @@ -import fs from 'fs' -import path from 'path' - -export function toBooleanConfig (configValue: string | boolean | undefined): boolean | undefined { - if (typeof configValue === 'string') { - return (configValue === 'true') - } - return configValue -} - -export function toArrayConfig (configValue: string | undefined, separator = ',', fallback = []): string[] { - if (configValue) { - return (configValue.split(separator).map(arrayItem => arrayItem.trim())) - } - return fallback -} - -export function toIntegerConfig (configValue): number { - if (configValue && typeof configValue === 'string') { - return parseInt(configValue) - } - return configValue -} - -export function getGitCommit (repodir): string { - if (!fs.existsSync(repodir + '/.git/HEAD')) { - return '' - } - let reference = fs.readFileSync(repodir + '/.git/HEAD', 'utf8') - if (reference.startsWith('ref: ')) { - reference = reference.substr(5).replace('\n', '') - reference = fs.readFileSync(path.resolve(repodir + '/.git', reference), 'utf8') - } - reference = reference.replace('\n', '') - return reference -} - -export function getGitHubURL (repo, reference): string { - // if it's not a github reference, we handle handle that anyway - if (!repo.startsWith('https://github.com') && !repo.startsWith('git@github.com')) { - return repo - } - if (repo.startsWith('git@github.com') || repo.startsWith('ssh://git@github.com')) { - repo = repo.replace(/^(ssh:\/\/)?git@github.com:/, 'https://github.com/') - } - - if (repo.endsWith('.git')) { - repo = repo.replace(/\.git$/, '/') - } else if (!repo.endsWith('/')) { - repo = repo + '/' - } - return repo + 'tree/' + reference -} diff --git a/old_src/lib/csp.ts b/old_src/lib/csp.ts deleted file mode 100644 index 0fac8faa4..000000000 --- a/old_src/lib/csp.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { config } from './config' -import { IHelmetContentSecurityPolicyDirectives } from 'helmet' -import uuid from 'uuid' -import { NextFunction, Request, Response } from 'express' - -type CSPDirectives = IHelmetContentSecurityPolicyDirectives - -const defaultDirectives = { - defaultSrc: ['\'self\''], - scriptSrc: ['\'self\'', 'vimeo.com', 'https://gist.github.com', 'www.slideshare.net', 'https://query.yahooapis.com', '\'unsafe-eval\''], - // ^ TODO: Remove unsafe-eval - webpack script-loader issues https://github.com/hackmdio/codimd/issues/594 - imgSrc: ['*'], - styleSrc: ['\'self\'', '\'unsafe-inline\'', 'https://github.githubassets.com'], // unsafe-inline is required for some libs, plus used in views - fontSrc: ['\'self\'', 'data:', 'https://public.slidesharecdn.com'], - objectSrc: ['*'], // Chrome PDF viewer treats PDFs as objects :/ - mediaSrc: ['*'], - childSrc: ['*'], - connectSrc: ['*'] -} - -const cdnDirectives = { - scriptSrc: ['https://cdnjs.cloudflare.com', 'https://cdn.mathjax.org'], - styleSrc: ['https://cdnjs.cloudflare.com', 'https://fonts.googleapis.com'], - fontSrc: ['https://cdnjs.cloudflare.com', 'https://fonts.gstatic.com'] -} - -const disqusDirectives = { - scriptSrc: ['https://disqus.com', 'https://*.disqus.com', 'https://*.disquscdn.com'], - styleSrc: ['https://*.disquscdn.com'], - fontSrc: ['https://*.disquscdn.com'] -} - -const googleAnalyticsDirectives = { - scriptSrc: ['https://www.google-analytics.com'] -} - -function mergeDirectives (existingDirectives: CSPDirectives, newDirectives: CSPDirectives): void { - for (const propertyName in newDirectives) { - const newDirective = newDirectives[propertyName] - if (newDirective) { - const existingDirective = existingDirectives[propertyName] || [] - existingDirectives[propertyName] = existingDirective.concat(newDirective) - } - } -} - -function mergeDirectivesIf (condition: boolean, existingDirectives: CSPDirectives, newDirectives: CSPDirectives): void { - if (condition) { - mergeDirectives(existingDirectives, newDirectives) - } -} - -function areAllInlineScriptsAllowed (directives: CSPDirectives): boolean { - if (directives.scriptSrc) { - return directives.scriptSrc.includes('\'unsafe-inline\'') - } - return false -} - -function getCspNonce (req: Request, res: Response): string { - return "'nonce-" + res.locals.nonce + "'" -} - -function addInlineScriptExceptions (directives: CSPDirectives): void { - if (!directives.scriptSrc) { - directives.scriptSrc = [] - } - directives.scriptSrc.push(getCspNonce) - // TODO: This is the SHA-256 hash of the inline script in build/reveal.js/plugins/notes/notes.html - // Any more clean solution appreciated. - directives.scriptSrc.push('\'sha256-81acLZNZISnyGYZrSuoYhpzwDTTxi7vC1YM4uNxqWaM=\'') -} - -function addUpgradeUnsafeRequestsOptionTo (directives: CSPDirectives): void { - if (config.csp.upgradeInsecureRequests === 'auto' && config.useSSL) { - directives.upgradeInsecureRequests = true - } else if (config.csp.upgradeInsecureRequests === true) { - directives.upgradeInsecureRequests = true - } -} - -function addReportURI (directives): void { - if (config.csp.reportURI) { - directives.reportUri = config.csp.reportURI - } -} - -export function addNonceToLocals (req: Request, res: Response, next: NextFunction): void { - res.locals.nonce = uuid.v4() - next() -} - -export function computeDirectives (): CSPDirectives { - const directives: CSPDirectives = {} - mergeDirectives(directives, config.csp.directives) - mergeDirectivesIf(config.csp.addDefaults, directives, defaultDirectives) - mergeDirectivesIf(config.useCDN, directives, cdnDirectives) - mergeDirectivesIf(config.csp.addDisqus, directives, disqusDirectives) - mergeDirectivesIf(config.csp.addGoogleAnalytics, directives, googleAnalyticsDirectives) - if (!areAllInlineScriptsAllowed(directives)) { - addInlineScriptExceptions(directives) - } - addUpgradeUnsafeRequestsOptionTo(directives) - addReportURI(directives) - return directives -} diff --git a/old_src/lib/errors.ts b/old_src/lib/errors.ts deleted file mode 100644 index 4adc871b9..000000000 --- a/old_src/lib/errors.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { config } from './config' - -function responseError (res, code: number, detail: string, msg: string): void { - res.status(code).render('error.ejs', { - title: code + ' ' + detail + ' ' + msg, - code: code, - detail: detail, - msg: msg, - opengraph: [] - }) -} - -function errorForbidden (res): void { - const { req } = res - if (req.user) { - responseError(res, 403, 'Forbidden', 'oh no.') - } else { - if (!req.session) req.session = {} - req.session.returnTo = req.originalUrl || config.serverUrl + '/' - req.flash('error', 'You are not allowed to access this page. Maybe try logging in?') - res.redirect(config.serverURL + '/') - } -} - -function errorNotFound (res): void { - responseError(res, 404, 'Not Found', 'oops.') -} - -function errorBadRequest (res): void { - responseError(res, 400, 'Bad Request', 'something not right.') -} - -function errorTooLong (res): void { - responseError(res, 413, 'Payload Too Large', 'Shorten your note!') -} - -function errorInternalError (res): void { - responseError(res, 500, 'Internal Error', 'wtf.') -} - -function errorServiceUnavailable (res): void { - responseError(res, 503, 'Service Unvavilable', 'I\'m busy right now, try again later.') -} - -const errors = { - errorForbidden: errorForbidden, - errorNotFound: errorNotFound, - errorBadRequest: errorBadRequest, - errorTooLong: errorTooLong, - errorInternalError: errorInternalError, - errorServiceUnavailable: errorServiceUnavailable -} - -export { errors } diff --git a/old_src/lib/history.ts b/old_src/lib/history.ts deleted file mode 100644 index 6bc8ad4fb..000000000 --- a/old_src/lib/history.ts +++ /dev/null @@ -1,208 +0,0 @@ -// history -// external modules -import LZString from 'lz-string' - -// core -import { logger } from './logger' -import { Note, User } from './models' -import { errors } from './errors' -import { LogEntry } from 'winston' - -// public - -class HistoryObject { - id: string - text: string - time: number - tags: string[] - pinned?: boolean -} - -function parseHistoryMapToArray (historyMap: Map): HistoryObject[] { - const historyArray: HistoryObject[] = [] - for (const [, value] of historyMap) { - historyArray.push(value) - } - return historyArray -} - -function parseHistoryArrayToMap (historyArray: HistoryObject[]): Map { - const historyMap = new Map() - for (let i = 0; i < historyArray.length; i++) { - const item = historyArray[i] - historyMap.set(item.id, item) - } - return historyMap -} - -function getHistory (userId, callback: (err: unknown, history: Map | null) => void): void { - User.findOne({ - where: { - id: userId - } - }).then(function (user) { - if (!user) { - return callback(null, null) - } - if (user.history) { - const history: HistoryObject[] = JSON.parse(user.history) - // migrate LZString encoded note id to base64url encoded note id - for (let i = 0, l = history.length; i < l; i++) { - // Calculate minimal string length for an UUID that is encoded - // base64 encoded and optimize comparsion by using -1 - // this should make a lot of LZ-String parsing errors obsolete - // as we can assume that a nodeId that is 48 chars or longer is a - // noteID. - const base64UuidLength = ((4 * 36) / 3) - 1 - if (!(history[i].id.length > base64UuidLength)) { - continue - } - try { - const id = LZString.decompressFromBase64(history[i].id) - if (id && Note.checkNoteIdValid(id)) { - history[i].id = Note.encodeNoteId(id) - } - } catch (err) { - // most error here comes from LZString, ignore - if (err.message === 'Cannot read property \'charAt\' of undefined') { - logger.warning('Looks like we can not decode "' + history[i].id + '" with LZString. Can be ignored.') - } else { - logger.error(err) - } - } - } - logger.debug(`read history success: ${user.id}`) - return callback(null, parseHistoryArrayToMap(history)) - } - logger.debug(`read empty history: ${user.id}`) - return callback(null, new Map()) - }).catch(function (err) { - logger.error('read history failed: ' + err) - return callback(err, null) - }) -} - -function setHistory (userId: string, history: HistoryObject[], callback: (err: LogEntry | null, count: [number, User[]] | null) => void): void { - User.update({ - history: JSON.stringify(history) - }, { - where: { - id: userId - } - }).then(function (count) { - return callback(null, count) - }).catch(function (err) { - logger.error('set history failed: ' + err) - return callback(err, null) - }) -} - -function updateHistory (userId: string, noteId: string, document, time): void { - if (userId && noteId && typeof document !== 'undefined') { - getHistory(userId, function (err, history) { - if (err || !history) return - const noteHistory = history.get(noteId) || new HistoryObject() - const noteInfo = Note.parseNoteInfo(document) - noteHistory.id = noteId - noteHistory.text = noteInfo.title - noteHistory.time = time || Date.now() - noteHistory.tags = noteInfo.tags - history.set(noteId, noteHistory) - setHistory(userId, parseHistoryMapToArray(history), function (err, _) { - if (err) { - logger.log(err) - } - }) - }) - } -} - -function historyGet (req, res): void { - if (req.isAuthenticated()) { - getHistory(req.user.id, function (err, history) { - if (err) return errors.errorInternalError(res) - if (!history) return errors.errorNotFound(res) - res.send({ - history: parseHistoryMapToArray(history) - }) - }) - } else { - return errors.errorForbidden(res) - } -} - -function historyPost (req, res): void { - if (req.isAuthenticated()) { - const noteId = req.params.noteId - if (!noteId) { - if (typeof req.body.history === 'undefined') return errors.errorBadRequest(res) - logger.debug(`SERVER received history from [${req.user.id}]: ${req.body.history}`) - let history - try { - history = JSON.parse(req.body.history) - } catch (err) { - return errors.errorBadRequest(res) - } - if (Array.isArray(history)) { - setHistory(req.user.id, history, function (err, _) { - if (err) return errors.errorInternalError(res) - res.end() - }) - } else { - return errors.errorBadRequest(res) - } - } else { - if (typeof req.body.pinned === 'undefined') return errors.errorBadRequest(res) - getHistory(req.user.id, function (err, history) { - if (err) return errors.errorInternalError(res) - if (!history) return errors.errorNotFound(res) - const noteHistory = history.get(noteId) - if (!noteHistory) return errors.errorNotFound(res) - if (req.body.pinned === 'true' || req.body.pinned === 'false') { - noteHistory.pinned = (req.body.pinned === 'true') - setHistory(req.user.id, parseHistoryMapToArray(history), function (err, _) { - if (err) return errors.errorInternalError(res) - res.end() - }) - } else { - return errors.errorBadRequest(res) - } - }) - } - } else { - return errors.errorForbidden(res) - } -} - -function historyDelete (req, res): void { - if (req.isAuthenticated()) { - const noteId = req.params.noteId - if (!noteId) { - setHistory(req.user.id, [], function (err, _) { - if (err) return errors.errorInternalError(res) - res.end() - }) - } else { - getHistory(req.user.id, function (err, history) { - if (err) return errors.errorInternalError(res) - if (!history) return errors.errorNotFound(res) - history.delete(noteId) - setHistory(req.user.id, parseHistoryMapToArray(history), function (err, _) { - if (err) return errors.errorInternalError(res) - res.end() - }) - }) - } - } else { - return errors.errorForbidden(res) - } -} - -const History = { - historyGet: historyGet, - historyPost: historyPost, - historyDelete: historyDelete, - updateHistory: updateHistory -} - -export { History, HistoryObject } diff --git a/old_src/lib/letter-avatars.ts b/old_src/lib/letter-avatars.ts deleted file mode 100644 index e476ad6bb..000000000 --- a/old_src/lib/letter-avatars.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createHash } from 'crypto' -import randomColor from 'randomcolor' -import { config } from './config' - -// core -export function generateAvatar (name: string): string { - const color = randomColor({ - seed: name, - luminosity: 'dark' - }) - const letter = name.substring(0, 1).toUpperCase() - - let svg = '' - svg += '' - svg += '' - svg += '' - svg += '' - svg += '' + letter + '' - svg += '' - svg += '' - svg += '' - - return svg -} - -export function generateAvatarURL (name: string, email = '', big = true): string { - let photo - name = encodeURIComponent(name) - - const hash = createHash('md5') - hash.update(email.toLowerCase()) - const hexDigest = hash.digest('hex') - - if (email !== '' && config.allowGravatar) { - photo = 'https://cdn.libravatar.org/avatar/' + hexDigest - if (big) { - photo += '?s=400' - } else { - photo += '?s=96' - } - } else { - photo = config.serverURL + '/user/' + (name || email.substring(0, email.lastIndexOf('@')) || hexDigest) + '/avatar.svg' - } - return photo -} diff --git a/old_src/lib/library-ext.d.ts b/old_src/lib/library-ext.d.ts deleted file mode 100644 index e06789e84..000000000 --- a/old_src/lib/library-ext.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { User } from './models' - -declare module 'express' { - export interface Request { - user?: User; - flash (type: string, msg?: string): [] | object | number; - } -} diff --git a/old_src/lib/logger.ts b/old_src/lib/logger.ts deleted file mode 100644 index 8711bbd1b..000000000 --- a/old_src/lib/logger.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createLogger, format, transports } from 'winston' - -const logger = createLogger({ - level: 'debug', - format: format.combine( - format.uncolorize(), - format.timestamp(), - format.align(), - format.splat(), - format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`) - ), - transports: [ - new transports.Console({ - handleExceptions: true - }) - ], - exitOnError: false -}) - -export { logger } diff --git a/old_src/lib/migrations/20150504155329-create-users.js b/old_src/lib/migrations/20150504155329-create-users.js deleted file mode 100644 index 56dec7097..000000000 --- a/old_src/lib/migrations/20150504155329-create-users.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.createTable('Users', { - id: { - type: Sequelize.UUID, - primaryKey: true, - defaultValue: Sequelize.UUIDV4 - }, - profileid: { - type: Sequelize.STRING, - unique: true - }, - profile: Sequelize.TEXT, - history: Sequelize.TEXT, - createdAt: Sequelize.DATE, - updatedAt: Sequelize.DATE - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.dropTable('Users') - } -} diff --git a/old_src/lib/migrations/20150508114741-create-notes.js b/old_src/lib/migrations/20150508114741-create-notes.js deleted file mode 100644 index 975919b6b..000000000 --- a/old_src/lib/migrations/20150508114741-create-notes.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.createTable('Notes', { - id: { - type: Sequelize.UUID, - primaryKey: true, - defaultValue: Sequelize.UUIDV4 - }, - ownerId: Sequelize.UUID, - content: Sequelize.TEXT, - title: Sequelize.STRING, - createdAt: Sequelize.DATE, - updatedAt: Sequelize.DATE - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.dropTable('Notes') - } -} diff --git a/old_src/lib/migrations/20150515125813-create-temp.js b/old_src/lib/migrations/20150515125813-create-temp.js deleted file mode 100644 index d1e0265c9..000000000 --- a/old_src/lib/migrations/20150515125813-create-temp.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.createTable('Temp', { - id: { - type: Sequelize.STRING, - primaryKey: true - }, - date: Sequelize.TEXT, - createdAt: Sequelize.DATE, - updatedAt: Sequelize.DATE - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.dropTable('Temp') - } -} diff --git a/old_src/lib/migrations/20150702001020-update-to-0_3_1.js b/old_src/lib/migrations/20150702001020-update-to-0_3_1.js deleted file mode 100644 index 5152c8a8d..000000000 --- a/old_src/lib/migrations/20150702001020-update-to-0_3_1.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'shortid', { - type: Sequelize.STRING, - defaultValue: '0000000000', - allowNull: false - }).then(function () { - return queryInterface.addIndex('Notes', ['shortid'], { - indicesType: 'UNIQUE' - }) - }).then(function () { - return queryInterface.addColumn('Notes', 'permission', { - type: Sequelize.STRING, - defaultValue: 'private', - allowNull: false - }) - }).then(function () { - return queryInterface.addColumn('Notes', 'viewcount', { - type: Sequelize.INTEGER, - defaultValue: 0 - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: shortid' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'shortid'" || error.message === 'column "shortid" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Notes', 'viewcount') - .then(function () { - return queryInterface.removeColumn('Notes', 'permission') - }) - .then(function () { - return queryInterface.removeIndex('Notes', ['shortid']) - }) - .then(function () { - return queryInterface.removeColumn('Notes', 'shortid') - }) - } -} diff --git a/old_src/lib/migrations/20150915153700-change-notes-title-to-text.js b/old_src/lib/migrations/20150915153700-change-notes-title-to-text.js deleted file mode 100644 index d7398b44a..000000000 --- a/old_src/lib/migrations/20150915153700-change-notes-title-to-text.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' -function isSQLite (sequelize) { - return sequelize.options.dialect === 'sqlite' -} - -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Notes', 'title', { - type: Sequelize.TEXT - }).then(function () { - if (isSQLite(queryInterface.sequelize)) { - // manual added index will be removed in sqlite - return queryInterface.addIndex('Notes', ['shortid']) - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Notes', 'title', { - type: Sequelize.STRING - }).then(function () { - if (isSQLite(queryInterface.sequelize)) { - // manual added index will be removed in sqlite - return queryInterface.addIndex('Notes', ['shortid']) - } - }) - } -} diff --git a/old_src/lib/migrations/20160112220142-note-add-lastchange.js b/old_src/lib/migrations/20160112220142-note-add-lastchange.js deleted file mode 100644 index cf67c2f04..000000000 --- a/old_src/lib/migrations/20160112220142-note-add-lastchange.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'lastchangeuserId', { - type: Sequelize.UUID - }).then(function () { - return queryInterface.addColumn('Notes', 'lastchangeAt', { - type: Sequelize.DATE - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: lastchangeuserId' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'lastchangeuserId'" || error.message === 'column "lastchangeuserId" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Notes', 'lastchangeAt') - .then(function () { - return queryInterface.removeColumn('Notes', 'lastchangeuserId') - }) - } -} diff --git a/old_src/lib/migrations/20160420180355-note-add-alias.js b/old_src/lib/migrations/20160420180355-note-add-alias.js deleted file mode 100644 index 0ed09a3ad..000000000 --- a/old_src/lib/migrations/20160420180355-note-add-alias.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'alias', { - type: Sequelize.STRING - }).then(function () { - return queryInterface.addIndex('Notes', ['alias'], { - indicesType: 'UNIQUE' - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: alias' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'alias'" || error.message === 'column "alias" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Notes', 'alias').then(function () { - return queryInterface.removeIndex('Notes', ['alias']) - }) - } -} diff --git a/old_src/lib/migrations/20160515114000-user-add-tokens.js b/old_src/lib/migrations/20160515114000-user-add-tokens.js deleted file mode 100644 index d61629631..000000000 --- a/old_src/lib/migrations/20160515114000-user-add-tokens.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Users', 'accessToken', Sequelize.STRING).then(function () { - return queryInterface.addColumn('Users', 'refreshToken', Sequelize.STRING) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: accessToken' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'accessToken'" || error.message === 'column "accessToken" of relation "Users" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Users', 'accessToken').then(function () { - return queryInterface.removeColumn('Users', 'refreshToken') - }) - } -} diff --git a/old_src/lib/migrations/20160607060246-support-revision.js b/old_src/lib/migrations/20160607060246-support-revision.js deleted file mode 100644 index 5ec3e52e4..000000000 --- a/old_src/lib/migrations/20160607060246-support-revision.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'savedAt', Sequelize.DATE).then(function () { - return queryInterface.createTable('Revisions', { - id: { - type: Sequelize.UUID, - primaryKey: true - }, - noteId: Sequelize.UUID, - patch: Sequelize.TEXT, - lastContent: Sequelize.TEXT, - content: Sequelize.TEXT, - length: Sequelize.INTEGER, - createdAt: Sequelize.DATE, - updatedAt: Sequelize.DATE - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: savedAt' | error.message === "ER_DUP_FIELDNAME: Duplicate column name 'savedAt'" || error.message === 'column "savedAt" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.dropTable('Revisions').then(function () { - return queryInterface.removeColumn('Notes', 'savedAt') - }) - } -} diff --git a/old_src/lib/migrations/20160703062241-support-authorship.js b/old_src/lib/migrations/20160703062241-support-authorship.js deleted file mode 100644 index bc16d2fdd..000000000 --- a/old_src/lib/migrations/20160703062241-support-authorship.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'authorship', Sequelize.TEXT).then(function () { - return queryInterface.addColumn('Revisions', 'authorship', Sequelize.TEXT) - }).then(function () { - return queryInterface.createTable('Authors', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true - }, - color: Sequelize.STRING, - noteId: Sequelize.UUID, - userId: Sequelize.UUID, - createdAt: Sequelize.DATE, - updatedAt: Sequelize.DATE - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: authorship' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'authorship'" || error.message === 'column "authorship" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.dropTable('Authors').then(function () { - return queryInterface.removeColumn('Revisions', 'authorship') - }).then(function () { - return queryInterface.removeColumn('Notes', 'authorship') - }) - } -} diff --git a/old_src/lib/migrations/20161009040430-support-delete-note.js b/old_src/lib/migrations/20161009040430-support-delete-note.js deleted file mode 100644 index c15e407de..000000000 --- a/old_src/lib/migrations/20161009040430-support-delete-note.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Notes', 'deletedAt', Sequelize.DATE).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: deletedAt' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'deletedAt'" || error.message === 'column "deletedAt" of relation "Notes" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Notes', 'deletedAt') - } -} diff --git a/old_src/lib/migrations/20161201050312-support-email-signin.js b/old_src/lib/migrations/20161201050312-support-email-signin.js deleted file mode 100644 index 0b52d1e76..000000000 --- a/old_src/lib/migrations/20161201050312-support-email-signin.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Users', 'email', Sequelize.TEXT).then(function () { - return queryInterface.addColumn('Users', 'password', Sequelize.TEXT).catch(function (error) { - if (error.message === "ER_DUP_FIELDNAME: Duplicate column name 'password'" || error.message === 'column "password" of relation "Users" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }).catch(function (error) { - if (error.message === 'SQLITE_ERROR: duplicate column name: email' || error.message === "ER_DUP_FIELDNAME: Duplicate column name 'email'" || error.message === 'column "email" of relation "Users" already exists') { - // eslint-disable-next-line no-console - console.log('Migration has already run… ignoring.') - } else { - throw error - } - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Users', 'email').then(function () { - return queryInterface.removeColumn('Users', 'password') - }) - } -} diff --git a/old_src/lib/migrations/20171009121200-longtext-for-mysql.js b/old_src/lib/migrations/20171009121200-longtext-for-mysql.js deleted file mode 100644 index 96bf7e876..000000000 --- a/old_src/lib/migrations/20171009121200-longtext-for-mysql.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - await queryInterface.changeColumn('Notes', 'content', { type: Sequelize.TEXT('long') }) - await queryInterface.changeColumn('Revisions', 'patch', { type: Sequelize.TEXT('long') }) - await queryInterface.changeColumn('Revisions', 'content', { type: Sequelize.TEXT('long') }) - await queryInterface.changeColumn('Revisions', 'lastContent', { type: Sequelize.TEXT('long') }) - }, - - down: async function (queryInterface, Sequelize) { - await queryInterface.changeColumn('Notes', 'content', { type: Sequelize.TEXT }) - await queryInterface.changeColumn('Revisions', 'patch', { type: Sequelize.TEXT }) - await queryInterface.changeColumn('Revisions', 'content', { type: Sequelize.TEXT }) - await queryInterface.changeColumn('Revisions', 'lastContent', { type: Sequelize.TEXT }) - } -} diff --git a/old_src/lib/migrations/20180209120907-longtext-of-authorship.js b/old_src/lib/migrations/20180209120907-longtext-of-authorship.js deleted file mode 100644 index 04810009e..000000000 --- a/old_src/lib/migrations/20180209120907-longtext-of-authorship.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = { - up: async function (queryInterface, Sequelize) { - await queryInterface.changeColumn('Notes', 'authorship', { type: Sequelize.TEXT('long') }) - await queryInterface.changeColumn('Revisions', 'authorship', { type: Sequelize.TEXT('long') }) - }, - - down: async function (queryInterface, Sequelize) { - await queryInterface.changeColumn('Notes', 'authorship', { type: Sequelize.TEXT }) - await queryInterface.changeColumn('Revisions', 'authorship', { type: Sequelize.TEXT }) - } -} diff --git a/old_src/lib/migrations/20180306150303-fix-enum.js b/old_src/lib/migrations/20180306150303-fix-enum.js deleted file mode 100644 index 59a36f21f..000000000 --- a/old_src/lib/migrations/20180306150303-fix-enum.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Notes', 'permission', { type: Sequelize.ENUM('freely', 'editable', 'limited', 'locked', 'protected', 'private') }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Notes', 'permission', { type: Sequelize.ENUM('freely', 'editable', 'locked', 'private') }) - } -} diff --git a/old_src/lib/migrations/20180326103000-use-text-in-tokens.js b/old_src/lib/migrations/20180326103000-use-text-in-tokens.js deleted file mode 100644 index 5793cf0e0..000000000 --- a/old_src/lib/migrations/20180326103000-use-text-in-tokens.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict' - -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Users', 'accessToken', { - type: Sequelize.TEXT - }).then(function () { - return queryInterface.changeColumn('Users', 'refreshToken', { - type: Sequelize.TEXT - }) - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.changeColumn('Users', 'accessToken', { - type: Sequelize.STRING - }).then(function () { - return queryInterface.changeColumn('Users', 'refreshToken', { - type: Sequelize.STRING - }) - }) - } -} diff --git a/old_src/lib/migrations/20180525153000-user-add-delete-token.js b/old_src/lib/migrations/20180525153000-user-add-delete-token.js deleted file mode 100644 index d4287de14..000000000 --- a/old_src/lib/migrations/20180525153000-user-add-delete-token.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' -module.exports = { - up: async function (queryInterface, Sequelize) { - return queryInterface.addColumn('Users', 'deleteToken', { - type: Sequelize.UUID, - defaultValue: Sequelize.UUIDV4 - }) - }, - - down: async function (queryInterface, Sequelize) { - return queryInterface.removeColumn('Users', 'deleteToken') - } -} diff --git a/old_src/lib/models/author.ts b/old_src/lib/models/author.ts deleted file mode 100644 index d4d092f83..000000000 --- a/old_src/lib/models/author.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - AutoIncrement, - BelongsTo, - Column, - createIndexDecorator, - DataType, - ForeignKey, - Model, - PrimaryKey, - Table -} from 'sequelize-typescript' -import { Note, User } from './index' - -const NoteUserIndex = createIndexDecorator({ unique: true }) - -@Table -export class Author extends Model { - @PrimaryKey - @AutoIncrement - @Column(DataType.INTEGER) - id: number - - @Column(DataType.STRING) - color: string - - @ForeignKey(() => Note) - @NoteUserIndex - @Column(DataType.UUID) - noteId: string - - @BelongsTo(() => Note, { foreignKey: 'noteId', onDelete: 'CASCADE', constraints: false, hooks: true }) - note: Note - - @ForeignKey(() => User) - @NoteUserIndex - @Column(DataType.UUID) - userId: string - - @BelongsTo(() => User, { foreignKey: 'userId', onDelete: 'CASCADE', constraints: false, hooks: true }) - user: User -} diff --git a/old_src/lib/models/index.ts b/old_src/lib/models/index.ts deleted file mode 100644 index d96e570fe..000000000 --- a/old_src/lib/models/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Sequelize } from 'sequelize-typescript' -import { cloneDeep } from 'lodash' -import * as path from 'path' -import { Author } from './author' -import { Note } from './note' -import { Revision } from './revision' -import { Temp } from './temp' -import { User } from './user' -import { logger } from '../logger' -import { config } from '../config' -import Umzug from 'umzug' -import SequelizeTypes from 'sequelize' - -const dbconfig = cloneDeep(config.db) -dbconfig.logging = config.debug ? (data): void => { - logger.info(data) -} : false - -export let sequelize: Sequelize - -// Heroku specific -if (config.dbURL) { - sequelize = new Sequelize(config.dbURL, dbconfig) -} else { - sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password, dbconfig) -} - -const umzug = new Umzug({ - migrations: { - path: path.resolve(__dirname, '..', 'migrations'), - params: [ - sequelize.getQueryInterface(), - SequelizeTypes - ] - }, - // Required wrapper function required to prevent winstion issue - // https://github.com/winstonjs/winston/issues/1577 - logging: (message): void => { - logger.info(message) - }, - storage: 'sequelize', - storageOptions: { - sequelize: sequelize - } -}) - -export async function runMigrations (): Promise { - // checks migrations and run them if they are not already applied - // exit in case of unsuccessful migrations - await umzug.up().catch(error => { - logger.error(error) - logger.error('Database migration failed. Exiting…') - process.exit(1) - }) - logger.info('All migrations performed successfully') -} - -sequelize.addModels([Author, Note, Revision, Temp, User]) - -export { Author, Note, Revision, Temp, User } diff --git a/old_src/lib/models/note.ts b/old_src/lib/models/note.ts deleted file mode 100644 index ecd85a06b..000000000 --- a/old_src/lib/models/note.ts +++ /dev/null @@ -1,672 +0,0 @@ -import async from 'async' -import base64url from 'base64url' -import cheerio from 'cheerio' -// eslint-disable-next-line @typescript-eslint/camelcase -import { diff_match_patch, patch_obj } from 'diff-match-patch' -import fs from 'fs' -import LZString from 'lz-string' -import markdownIt from 'markdown-it' -import metaMarked from 'meta-marked' -import moment from 'moment' -import path from 'path' -import Sequelize from 'sequelize' -import { - AfterCreate, - AllowNull, - BeforeCreate, - BelongsTo, - Column, - DataType, - Default, - ForeignKey, - HasMany, - Model, - PrimaryKey, - Table, - Unique -} from 'sequelize-typescript' - -import { generate as shortIdGenerate, isValid as shortIdIsValid } from 'shortid' -import S from 'string' -import { config } from '../config' -import { logger } from '../logger' -import ot from '../ot/index' -import { processData, stripNullByte } from '../utils/functions' -import { Author, Revision, User } from './index' - -const md = markdownIt() -// eslint-disable-next-line new-cap -const dmp = new diff_match_patch() - -// permission types -enum PermissionEnum { - freely = 'freely', - editable = 'editable', - limited = 'limited', - locked = 'locked', - protected = 'protected', - private = 'private' -} - -export class OpengraphMetadata { - title: string | number - description: string | number - type: string -} - -export class NoteMetadata { - title: string - description: string - robots: string - GA: string - disqus: string - slideOptions - opengraph: OpengraphMetadata -} - -export type NoteAuthorship = [string, number, number, number, number] - -@Table({ paranoid: false }) -export class Note extends Model { - @PrimaryKey - @Default(Sequelize.UUIDV4) - @Column(DataType.UUID) - id: string - - @AllowNull(false) - @Default(shortIdGenerate) - @Unique - @Column(DataType.STRING) - shortid: string - - @Unique - @Column(DataType.STRING) - alias: string - - @Column(DataType.ENUM({ values: Object.keys(PermissionEnum).map(k => PermissionEnum[k]) })) - permission: PermissionEnum - - @AllowNull(false) - @Default(0) - @Column(DataType.INTEGER) - viewcount: number - - // ToDo: use @UpdatedAt instead? (https://www.npmjs.com/package/sequelize-typescript#createdat--updatedat--deletedat) - @Column(DataType.DATE) - lastchangeAt: Date - - // ToDo: use @UpdatedAt instead? (https://www.npmjs.com/package/sequelize-typescript#createdat--updatedat--deletedat) - @Column(DataType.DATE) - savedAt: Date - - @ForeignKey(() => User) - @Column - ownerId: string - - @BelongsTo(() => User, { foreignKey: 'ownerId', constraints: false, onDelete: 'CASCADE', hooks: true }) - owner: User - - @ForeignKey(() => User) - @Column - lastchangeuserId: string - - @BelongsTo(() => User, { foreignKey: 'lastchangeuserId', constraints: false }) - lastchangeuser: User - - @HasMany(() => Revision, { foreignKey: 'noteId', constraints: false }) - revisions: Revision[] - - @HasMany(() => Author, { foreignKey: 'noteId', constraints: false }) - authors: Author[] - - @Column(DataType.TEXT) - get title (): string { - return this.getDataValue('title') ?? '' - } - - set title (value: string) { - this.setDataValue('title', stripNullByte(value)) - } - - @Column(DataType.TEXT({ length: 'long' })) - get content (): string { - return this.getDataValue('content') ?? '' - } - - set content (value: string) { - this.setDataValue('content', stripNullByte(value)) - } - - @Column(DataType.TEXT({ length: 'long' })) - get authorship (): NoteAuthorship[] { - return processData(this.getDataValue('authorship'), [], JSON.parse) - } - - set authorship (value: NoteAuthorship[]) { - // Evil hack for TypeScript to accept saving a string in a NoteAuthorship DB-field - this.setDataValue('authorship', JSON.stringify(value) as unknown as NoteAuthorship[]) - } - - @BeforeCreate - static async defaultContentAndPermissions (note: Note): Promise { - return await new Promise(function (resolve) { - // if no content specified then use default note - if (!note.content) { - let filePath: string - if (!note.alias) { - filePath = config.defaultNotePath - } else { - filePath = path.join(config.docsPath, note.alias + '.md') - } - if (Note.checkFileExist(filePath)) { - const fsCreatedTime = moment(fs.statSync(filePath).ctime) - const body = fs.readFileSync(filePath, 'utf8') - note.title = Note.parseNoteTitle(body) - note.content = body - if (filePath !== config.defaultNotePath) { - note.createdAt = fsCreatedTime - } - } - } - // if no permission specified and have owner then give default permission in config, else default permission is freely - if (!note.permission) { - if (note.ownerId) { - // TODO: Might explode if the user-defined permission does not exist - note.permission = PermissionEnum[config.defaultPermission] - } else { - note.permission = PermissionEnum.freely - } - } - return resolve(note) - }) - } - - @AfterCreate - static saveRevision (note): Promise { - return new Promise(function (resolve, reject) { - Revision.saveNoteRevision(note, function (err, _) { - if (err) { - return reject(err) - } - return resolve(note) - }) - }) - } - - static checkFileExist (filePath): boolean { - try { - return fs.statSync(filePath).isFile() - } catch (err) { - return false - } - } - - static encodeNoteId (id): string { - // remove dashes in UUID and encode in url-safe base64 - const str = id.replace(/-/g, '') - const hexStr = Buffer.from(str, 'hex') - return base64url.encode(hexStr) - } - - static decodeNoteId (encodedId): string { - // decode from url-safe base64 - const id: string = base64url.toBuffer(encodedId).toString('hex') - // add dashes between the UUID string parts - const idParts: string[] = [] - idParts.push(id.substr(0, 8)) - idParts.push(id.substr(8, 4)) - idParts.push(id.substr(12, 4)) - idParts.push(id.substr(16, 4)) - idParts.push(id.substr(20, 12)) - return idParts.join('-') - } - - static checkNoteIdValid (id): boolean { - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i - const result = id.match(uuidRegex) - return !!(result && result.length === 1) - } - - static parseNoteId (noteId, callback): void { - async.series({ - parseNoteIdByAlias: function (_callback) { - // try to parse note id by alias (e.g. doc) - Note.findOne({ - where: { - alias: noteId - } - }).then(function (note) { - if (note) { - const filePath = path.join(config.docsPath, noteId + '.md') - if (Note.checkFileExist(filePath)) { - // if doc in filesystem have newer modified time than last change time - // then will update the doc in db - const fsModifiedTime = moment(fs.statSync(filePath).mtime) - const dbModifiedTime = moment(note.lastchangeAt || note.createdAt) - const body = fs.readFileSync(filePath, 'utf8') - const contentLength = body.length - const title = Note.parseNoteTitle(body) - if (fsModifiedTime.isAfter(dbModifiedTime) && note.content !== body) { - note.update({ - title: title, - content: body, - lastchangeAt: fsModifiedTime - }).then(function (note) { - Revision.saveNoteRevision(note, function (err, revision) { - if (err) return _callback(err, null) - // update authorship on after making revision of docs - const patch = dmp.patch_fromText(revision.patch) - const operations = Note.transformPatchToOperations(patch, contentLength) - let authorship = note.authorship - for (let i = 0; i < operations.length; i++) { - authorship = Note.updateAuthorshipByOperation(operations[i], null, authorship) - } - note.update({ - authorship: authorship - }).then(function (note) { - return callback(null, note.id) - }).catch(function (err) { - return _callback(err, null) - }) - }) - }).catch(function (err) { - return _callback(err, null) - }) - } else { - return callback(null, note.id) - } - } else { - return callback(null, note.id) - } - } else { - const filePath = path.join(config.docsPath, noteId + '.md') - if (Note.checkFileExist(filePath)) { - Note.create({ - alias: noteId, - owner: null, - permission: 'locked' - }).then(function (note) { - return callback(null, note.id) - }).catch(function (err) { - return _callback(err, null) - }) - } else { - return _callback(null, null) - } - } - }).catch(function (err) { - return _callback(err, null) - }) - }, - // parse note id by LZString is deprecated, here for compability - parseNoteIdByLZString: function (_callback) { - // Calculate minimal string length for an UUID that is encoded - // base64 encoded and optimize comparsion by using -1 - // this should make a lot of LZ-String parsing errors obsolete - // as we can assume that a nodeId that is 48 chars or longer is a - // noteID. - const base64UuidLength = ((4 * 36) / 3) - 1 - if (!(noteId.length > base64UuidLength)) { - return _callback(null, null) - } - // try to parse note id by LZString Base64 - try { - const id = LZString.decompressFromBase64(noteId) - if (id && Note.checkNoteIdValid(id)) { - return callback(null, id) - } else { - return _callback(null, null) - } - } catch (err) { - if (err.message === 'Cannot read property \'charAt\' of undefined') { - logger.warning('Looks like we can not decode "' + noteId + '" with LZString. Can be ignored.') - } else { - logger.error(err) - } - return _callback(null, null) - } - }, - parseNoteIdByBase64Url: function (_callback) { - // try to parse note id by base64url - try { - const id = Note.decodeNoteId(noteId) - if (id && Note.checkNoteIdValid(id)) { - return callback(null, id) - } else { - return _callback(null, null) - } - } catch (err) { - logger.error(err) - return _callback(null, null) - } - }, - parseNoteIdByShortId: function (_callback) { - // try to parse note id by shortId - try { - if (shortIdIsValid(noteId)) { - Note.findOne({ - where: { - shortid: noteId - } - }).then(function (note) { - if (!note) return _callback(null, null) - return callback(null, note.id) - }).catch(function (err) { - return _callback(err, null) - }) - } else { - return _callback(null, null) - } - } catch (err) { - return _callback(err, null) - } - } - }, function (err, _) { - if (err) { - logger.error(err) - return callback(err, null) - } - return callback(null, null) - }) - } - - static parseNoteTitle (body): string { - const parsed = Note.extractMeta(body) - const $ = cheerio.load(md.render(parsed.markdown)) - return Note.extractNoteTitle(parsed.meta, $) - } - - static extractNoteTitle (meta, $): string { - let title = '' - if (meta.title && (typeof meta.title === 'string' || typeof meta.title === 'number')) { - title = meta.title - } else { - const h1s = $('h1') - if (h1s.length > 0 && h1s.first().text().split('\n').length === 1) { - title = S(h1s.first().text()).stripTags().s - } - } - if (!title) title = 'Untitled' - return title - } - - static generateDescription (markdown): string { - return markdown.substr(0, 100).replace(/(?:\r\n|\r|\n)/g, ' ') - } - - static decodeTitle (title): string { - return title || 'Untitled' - } - - static generateWebTitle (title): string { - title = !title || title === 'Untitled' ? 'CodiMD - Collaborative markdown notes' : title + ' - CodiMD' - return title - } - - static extractNoteTags (meta, $): string[] { - const tags: string[] = [] - const rawtags: string[] = [] - if (meta.tags && (typeof meta.tags === 'string' || typeof meta.tags === 'number')) { - const metaTags = ('' + meta.tags).split(',') - for (let i = 0; i < metaTags.length; i++) { - const text: string = metaTags[i].trim() - if (text) rawtags.push(text) - } - } else { - const h6s = $('h6') - h6s.each(function (key, value) { - if (/^tags/gmi.test($(value).text())) { - const codes = $(value).find('code') - for (let i = 0; i < codes.length; i++) { - const text = S($(codes[i]).text().trim()).stripTags().s - if (text) rawtags.push(text) - } - } - }) - } - for (let i = 0; i < rawtags.length; i++) { - let found = false - for (let j = 0; j < tags.length; j++) { - if (tags[j] === rawtags[i]) { - found = true - break - } - } - if (!found) { - tags.push(rawtags[i]) - } - } - return tags - } - - static extractMeta (content): { markdown: string; meta: {} } { - try { - const obj = metaMarked(content) - if (!obj.markdown) obj.markdown = '' - if (!obj.meta) obj.meta = {} - return obj - } catch (err) { - return { - markdown: content, - meta: {} - } - } - } - - static parseMeta (meta): NoteMetadata { - const _meta = new NoteMetadata() - if (meta) { - if (meta.title && (typeof meta.title === 'string' || typeof meta.title === 'number')) { - _meta.title = meta.title - } - if (meta.description && (typeof meta.description === 'string' || typeof meta.description === 'number')) { - _meta.description = meta.description - } - if (meta.robots && (typeof meta.robots === 'string' || typeof meta.robots === 'number')) { - _meta.robots = meta.robots - } - if (meta.GA && (typeof meta.GA === 'string' || typeof meta.GA === 'number')) { - _meta.GA = meta.GA - } - if (meta.disqus && (typeof meta.disqus === 'string' || typeof meta.disqus === 'number')) { - _meta.disqus = meta.disqus - } - if (meta.slideOptions && (typeof meta.slideOptions === 'object')) { - _meta.slideOptions = meta.slideOptions - } - if (meta.opengraph && (typeof meta.opengraph === 'object')) { - _meta.opengraph = meta.opengraph - } - } - return _meta - } - - static parseOpengraph (meta, title: string): OpengraphMetadata { - let _ogdata = new OpengraphMetadata() - if (meta.opengraph) { - _ogdata = meta.opengraph - } - if (!(_ogdata.title && (typeof _ogdata.title === 'string' || typeof _ogdata.title === 'number'))) { - _ogdata.title = title - } - if (!(_ogdata.description && (typeof _ogdata.description === 'string' || typeof _ogdata.description === 'number'))) { - _ogdata.description = meta.description || '' - } - if (!(_ogdata.type && (typeof _ogdata.type === 'string'))) { - _ogdata.type = 'website' - } - return _ogdata - } - - static updateAuthorshipByOperation (operation, userId: string | null, authorships): NoteAuthorship[] { - let index = 0 - const timestamp = Date.now() - for (let i = 0; i < operation.length; i++) { - const op = operation[i] - if (ot.TextOperation.isRetain(op)) { - index += op - } else if (ot.TextOperation.isInsert(op)) { - const opStart = index - const opEnd = index + op.length - let inserted = false - // authorship format: [userId, startPos, endPos, createdAt, updatedAt] - if (authorships.length <= 0) authorships.push([userId, opStart, opEnd, timestamp, timestamp]) - else { - for (let j = 0; j < authorships.length; j++) { - const authorship = authorships[j] - if (!inserted) { - const nextAuthorship = authorships[j + 1] || -1 - if ((nextAuthorship !== -1 && nextAuthorship[1] >= opEnd) || j >= authorships.length - 1) { - if (authorship[1] < opStart && authorship[2] > opStart) { - // divide - const postLength = authorship[2] - opStart - authorship[2] = opStart - authorship[4] = timestamp - authorships.splice(j + 1, 0, [userId, opStart, opEnd, timestamp, timestamp]) - authorships.splice(j + 2, 0, [authorship[0], opEnd, opEnd + postLength, authorship[3], timestamp]) - j += 2 - inserted = true - } else if (authorship[1] >= opStart) { - authorships.splice(j, 0, [userId, opStart, opEnd, timestamp, timestamp]) - j += 1 - inserted = true - } else if (authorship[2] <= opStart) { - authorships.splice(j + 1, 0, [userId, opStart, opEnd, timestamp, timestamp]) - j += 1 - inserted = true - } - } - } - if (authorship[1] >= opStart) { - authorship[1] += op.length - authorship[2] += op.length - } - } - } - index += op.length - } else if (ot.TextOperation.isDelete(op)) { - const opStart = index - const opEnd = index - op - if (operation.length === 1) { - authorships = [] - } else if (authorships.length > 0) { - for (let j = 0; j < authorships.length; j++) { - const authorship = authorships[j] - if (authorship[1] >= opStart && authorship[1] <= opEnd && authorship[2] >= opStart && authorship[2] <= opEnd) { - authorships.splice(j, 1) - j -= 1 - } else if (authorship[1] < opStart && authorship[1] < opEnd && authorship[2] > opStart && authorship[2] > opEnd) { - authorship[2] += op - authorship[4] = timestamp - } else if (authorship[2] >= opStart && authorship[2] <= opEnd) { - authorship[2] = opStart - authorship[4] = timestamp - } else if (authorship[1] >= opStart && authorship[1] <= opEnd) { - authorship[1] = opEnd - authorship[4] = timestamp - } - if (authorship[1] >= opEnd) { - authorship[1] += op - authorship[2] += op - } - } - } - index += op - } - } - // merge - for (let j = 0; j < authorships.length; j++) { - const authorship = authorships[j] - for (let k = j + 1; k < authorships.length; k++) { - const nextAuthorship = authorships[k] - if (nextAuthorship && authorship[0] === nextAuthorship[0] && authorship[2] === nextAuthorship[1]) { - const minTimestamp = Math.min(authorship[3], nextAuthorship[3]) - const maxTimestamp = Math.max(authorship[3], nextAuthorship[3]) - authorships.splice(j, 1, [authorship[0], authorship[1], nextAuthorship[2], minTimestamp, maxTimestamp]) - authorships.splice(k, 1) - j -= 1 - break - } - } - } - // clear - for (let j = 0; j < authorships.length; j++) { - const authorship = authorships[j] - if (!authorship[0]) { - authorships.splice(j, 1) - j -= 1 - } - } - return authorships - } - - // eslint-disable-next-line @typescript-eslint/camelcase - static transformPatchToOperations (patch: patch_obj[], contentLength): number[][] { - const operations: number[][] = [] - if (patch.length > 0) { - // calculate original content length - for (let j = patch.length - 1; j >= 0; j--) { - const p = patch[j] - for (let i = 0; i < p.diffs.length; i++) { - const diff = p.diffs[i] - switch (diff[0]) { - case 1: // insert - contentLength -= diff[1].length - break - case -1: // delete - contentLength += diff[1].length - break - } - } - } - // generate operations - let bias = 0 - let lengthBias = 0 - for (let j = 0; j < patch.length; j++) { - const operation: number[] = [] - const p = patch[j] - let currIndex = p.start1 || 0 - const currLength = contentLength - bias - for (let i = 0; i < p.diffs.length; i++) { - const diff = p.diffs[i] - switch (diff[0]) { - case 0: // retain - if (i === 0) { - // first - operation.push(currIndex + diff[1].length) - } else if (i !== p.diffs.length - 1) { - // mid - operation.push(diff[1].length) - } else { - // last - operation.push(currLength + lengthBias - currIndex) - } - currIndex += diff[1].length - break - case 1: // insert - operation.push(diff[1].length) - lengthBias += diff[1].length - currIndex += diff[1].length - break - case -1: // delete - operation.push(-diff[1].length) - bias += diff[1].length - currIndex += diff[1].length - break - } - } - operations.push(operation) - } - } - return operations - } - - static parseNoteInfo (body): { title: string; tags: string[] } { - const parsed = Note.extractMeta(body) - const $ = cheerio.load(md.render(parsed.markdown)) - return { - title: Note.extractNoteTitle(parsed.meta, $), - tags: Note.extractNoteTags(parsed.meta, $) - } - } -} diff --git a/old_src/lib/models/revision.ts b/old_src/lib/models/revision.ts deleted file mode 100644 index 9bc12c8da..000000000 --- a/old_src/lib/models/revision.ts +++ /dev/null @@ -1,347 +0,0 @@ -import { ChildProcess } from 'child_process' - -import Sequelize from 'sequelize' -import { BelongsTo, Column, DataType, Default, ForeignKey, Model, PrimaryKey, Table } from 'sequelize-typescript' -// core -import { logger } from '../logger' -import { processData, stripNullByte } from '../utils/functions' -import { Note } from './note' -import async = require('async') -import childProcess = require('child_process') -import moment = require('moment') -import path = require('path') -import shortId = require('shortid') - -const Op = Sequelize.Op - -const dmpCallbackCache = {} - -class Data { - msg - cacheKey - error - result - level -} - -function createDmpWorker (): ChildProcess { - const worker = childProcess.fork(path.resolve(__dirname, '../workers/dmpWorker'), ['ignore']) - logger.debug('dmp worker process started') - worker.on('message', function (data: Data) { - if (!data || !data.msg || !data.cacheKey) { - logger.error('dmp worker error: not enough data on message') - return - } - const cacheKey = data.cacheKey - switch (data.msg) { - case 'log': - logger.log(data.level, data.result[0], ...data.result[1]) - // The cacheKey is a dummy value and we want to skip the delete line. - return - case 'error': - dmpCallbackCache[cacheKey](data.error, null) - break - case 'check': - dmpCallbackCache[cacheKey](null, data.result) - break - } - delete dmpCallbackCache[cacheKey] - }) - worker.on('close', function (code) { - logger.debug(`dmp worker process exited with code ${code}`) - }) - return worker -} - -let dmpWorker: ChildProcess = createDmpWorker() - -function sendDmpWorker (data, callback): void { - if (!dmpWorker) { - dmpWorker = createDmpWorker() - } - const cacheKey = Date.now() + '_' + shortId.generate() - dmpCallbackCache[cacheKey] = callback - data = Object.assign(data, { - cacheKey: cacheKey - }) - dmpWorker.send(data) -} - -@Table -export class Revision extends Model { - @Default(Sequelize.UUIDV4) - @PrimaryKey - @Column(DataType.UUID) - id: string - - @Column(DataType.INTEGER) - length: number - - @ForeignKey(() => Note) - @Column(DataType.UUID) - noteId: string - - @BelongsTo(() => Note, { foreignKey: 'noteId', constraints: false, onDelete: 'CASCADE', hooks: true }) - note: Note - - @Column(DataType.TEXT({ length: 'long' })) - get patch (): string { - return this.getDataValue('patch') ?? '' - } - - set patch (value: string) { - this.setDataValue('patch', stripNullByte(value)) - } - - @Column(DataType.TEXT({ length: 'long' })) - get lastContent (): string { - return this.getDataValue('lastContent') ?? '' - } - - set lastContent (value: string) { - this.setDataValue('lastContent', stripNullByte(value)) - } - - @Column(DataType.TEXT({ length: 'long' })) - get content (): string { - return this.getDataValue('content') ?? '' - } - - set content (value: string) { - this.setDataValue('content', stripNullByte(value)) - } - - @Column(DataType.TEXT({ length: 'long' })) - get authorship (): string { - return processData(this.getDataValue('authorship'), [], JSON.parse) - } - - set authorship (value: string) { - this.setDataValue('authorship', value ? JSON.stringify(value) : value) - } - - static getNoteRevisions (note: Note, callback): void { - Revision.findAll({ - where: { - noteId: note.id - }, - order: [['createdAt', 'DESC']] - }).then(function (revisions: Revision[]) { - class RevisionDataActions { // TODO: Fix Type in actions.ts - time - - length - } - - const data: RevisionDataActions[] = [] - revisions.forEach(function (revision: Revision) { - data.push({ - time: moment(revision.createdAt).valueOf(), - length: revision.length - }) - }) - callback(null, data) - }).catch(function (err) { - callback(err, null) - }) - } - - static getPatchedNoteRevisionByTime (note: Note, time, errorCallback): void { - // find all revisions to prepare for all possible calculation - Revision.findAll({ - where: { - noteId: note.id - }, - order: [['createdAt', 'DESC']] - }).then(function (revisions: Revision[]) { - if (revisions.length <= 0) { - errorCallback(null, null) - return - } - // measure target revision position - Revision.count({ - where: { - noteId: note.id, - createdAt: { - [Op.gte]: time - } - } - }).then(function (count: number) { - if (count <= 0) { - errorCallback(null, null) - return - } - sendDmpWorker({ - msg: 'get revision', - revisions: revisions, - count: count - }, errorCallback) - }).catch(function (err) { - errorCallback(err, null) - }) - }).catch(function (err) { - errorCallback(err, null) - }) - } - - static checkAllNotesRevision (callback): void { - Revision.saveAllNotesRevision(function (err, notes: Note[]) { - if (err) { - callback(err, null) - return - } - if (!notes || notes.length <= 0) { - callback(null, notes) - } else { - Revision.checkAllNotesRevision(callback) - } - }) - } - - static saveAllNotesRevision (callback): void { - Note.findAll({ - // query all notes that need to save for revision - where: { - [Op.and]: [ - { - lastchangeAt: { - [Op.or]: { - [Op.eq]: null, - [Op.and]: { - [Op.ne]: null, - [Op.gt]: Sequelize.col('createdAt') - } - } - } - }, - { - savedAt: { - [Op.or]: { - [Op.eq]: null, - [Op.lt]: Sequelize.col('lastchangeAt') - } - } - } - ] - } - }).then(function (notes: Note[]) { - if (notes.length <= 0) { - callback(null, notes) - return - } - const savedNotes: Note[] = [] - async.each(notes, function (note: Note, _callback) { - // revision saving policy: note not been modified for 5 mins or not save for 10 mins - if (note.lastchangeAt && note.savedAt) { - const lastchangeAt = moment(note.lastchangeAt) - const savedAt = moment(note.savedAt) - if (moment().isAfter(lastchangeAt.add(5, 'minutes'))) { - savedNotes.push(note) - Revision.saveNoteRevision(note, _callback) - } else if (lastchangeAt.isAfter(savedAt.add(10, 'minutes'))) { - savedNotes.push(note) - Revision.saveNoteRevision(note, _callback) - } else { - _callback(null, null) - } - } else { - savedNotes.push(note) - Revision.saveNoteRevision(note, _callback) - } - }, function (err) { - if (err) { - callback(err, null) - return - } - // return null when no notes need saving at this moment but have delayed tasks to be done - const result = ((savedNotes.length === 0) && (notes.length > 0)) ? null : savedNotes - callback(null, result) - }) - }).catch(function (err) { - callback(err, null) - }) - } - - static saveNoteRevision (note: Note, callback): void { - Revision.findAll({ - where: { - noteId: note.id - }, - order: [['createdAt', 'DESC']] - }).then(function (revisions: Revision[]) { - if (revisions.length <= 0) { - // if no revision available - let noteContent = note.content - if (noteContent.length === 0) { - noteContent = '' - } - Revision.create({ - noteId: note.id, - lastContent: noteContent, - length: noteContent.length, - authorship: note.authorship - }).then(function (revision: Revision) { - Revision.finishSaveNoteRevision(note, revision, callback) - }).catch(function (err) { - callback(err, null) - }) - } else { - const latestRevision = revisions[0] - const lastContent = latestRevision.content || latestRevision.lastContent - const content = note.content - sendDmpWorker({ - msg: 'create patch', - lastDoc: lastContent, - currDoc: content - }, function (err, patch) { - if (err) { - logger.error('save note revision error', err) - return - } - if (!patch) { - // if patch is empty (means no difference) then just update the latest revision updated time - latestRevision.changed('updatedAt', true) - latestRevision.update({ - updatedAt: Date.now() - }).then(function (revision: Revision) { - Revision.finishSaveNoteRevision(note, revision, callback) - }).catch(function (err) { - callback(err, null) - }) - } else { - Revision.create({ - noteId: note.id, - patch: patch, - content: note.content, - length: note.content.length, - authorship: note.authorship - }).then(function (revision: Revision) { - // clear last revision content to reduce db size - latestRevision.update({ - content: null - }).then(function () { - Revision.finishSaveNoteRevision(note, revision, callback) - }).catch(function (err) { - callback(err, null) - }) - }).catch(function (err) { - callback(err, null) - }) - } - }) - } - }).catch(function (err) { - callback(err, null) - }) - } - - static finishSaveNoteRevision (note: Note, revision: Revision, callback): void { - note.update({ - savedAt: revision.updatedAt - }).then(function () { - callback(null, revision) - }).catch(function (err) { - callback(err, null) - }) - } -} diff --git a/old_src/lib/models/temp.ts b/old_src/lib/models/temp.ts deleted file mode 100644 index c6a64ebc8..000000000 --- a/old_src/lib/models/temp.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DataType, Model, Table, PrimaryKey, Column, Default } from 'sequelize-typescript' -import { generate as shortIdGenerate } from 'shortid' - -@Table -export class Temp extends Model { - @Default(shortIdGenerate) - @PrimaryKey - @Column(DataType.STRING) - id: string; - - @Column(DataType.TEXT) - data: string -} diff --git a/old_src/lib/models/user.ts b/old_src/lib/models/user.ts deleted file mode 100644 index aecfbb740..000000000 --- a/old_src/lib/models/user.ts +++ /dev/null @@ -1,74 +0,0 @@ -import scrypt from 'scrypt-kdf' -import { UUIDV4 } from 'sequelize' -import { - BeforeCreate, - BeforeUpdate, - Column, - DataType, - Default, - HasMany, - IsEmail, - Model, - PrimaryKey, - Table, - Unique -} from 'sequelize-typescript' -import { Note } from './note' - -@Table -export class User extends Model { - @PrimaryKey - @Default(UUIDV4) - @Column(DataType.UUID) - id: string - - @Unique - @Column(DataType.STRING) - profileid: string - - @Column(DataType.TEXT) - profile: string - - @Column(DataType.TEXT) - history: string - - @Column(DataType.TEXT) - accessToken: string - - @Column(DataType.TEXT) - refreshToken: string - - @Column(DataType.UUID) - deleteToken: string - - @IsEmail - @Column(DataType.TEXT) - email: string - - @Column(DataType.TEXT) - password: string - - @HasMany(() => Note, { foreignKey: 'lastchangeuserId', constraints: false }) - @HasMany(() => Note, { foreignKey: 'ownerId', constraints: false }) - - @BeforeUpdate - @BeforeCreate - static async updatePasswordHashHook (user: User): Promise { - // suggested way to hash passwords to be able to do this asynchronously: - // @see https://github.com/sequelize/sequelize/issues/1821#issuecomment-44265819 - - if (!user.changed('password')) { - return Promise.resolve() - } - - return scrypt - .kdf(user.getDataValue('password'), { logN: 15, r: 8, p: 1 }) - .then(keyBuf => { - user.setDataValue('password', keyBuf.toString('hex')) - }) - } - - verifyPassword (attempt: string): Promise { - return scrypt.verify(Buffer.from(this.password, 'hex'), attempt) - } -} diff --git a/old_src/lib/ot/client.js b/old_src/lib/ot/client.js deleted file mode 100755 index 7ee19fdc2..000000000 --- a/old_src/lib/ot/client.js +++ /dev/null @@ -1,312 +0,0 @@ -// translation of https://github.com/djspiewak/cccp/blob/master/agent/src/main/scala/com/codecommit/cccp/agent/state.scala - -if (typeof ot === 'undefined') { - var ot = {}; -} - -ot.Client = (function (global) { - 'use strict'; - - // Client constructor - function Client (revision) { - this.revision = revision; // the next expected revision number - this.setState(synchronized_); // start state - } - - Client.prototype.setState = function (state) { - this.state = state; - }; - - // Call this method when the user changes the document. - Client.prototype.applyClient = function (operation) { - this.setState(this.state.applyClient(this, operation)); - }; - - // Call this method with a new operation from the server - Client.prototype.applyServer = function (revision, operation) { - this.setState(this.state.applyServer(this, revision, operation)); - }; - - Client.prototype.applyOperations = function (head, operations) { - this.setState(this.state.applyOperations(this, head, operations)); - }; - - Client.prototype.serverAck = function (revision) { - this.setState(this.state.serverAck(this, revision)); - }; - - Client.prototype.serverReconnect = function () { - if (typeof this.state.resend === 'function') { this.state.resend(this); } - }; - - // Transforms a selection from the latest known server state to the current - // client state. For example, if we get from the server the information that - // another user's cursor is at position 3, but the server hasn't yet received - // our newest operation, an insertion of 5 characters at the beginning of the - // document, the correct position of the other user's cursor in our current - // document is 8. - Client.prototype.transformSelection = function (selection) { - return this.state.transformSelection(selection); - }; - - // Override this method. - Client.prototype.sendOperation = function (revision, operation) { - throw new Error("sendOperation must be defined in child class"); - }; - - // Override this method. - Client.prototype.applyOperation = function (operation) { - throw new Error("applyOperation must be defined in child class"); - }; - - - // In the 'Synchronized' state, there is no pending operation that the client - // has sent to the server. - function Synchronized () {} - Client.Synchronized = Synchronized; - - Synchronized.prototype.applyClient = function (client, operation) { - // When the user makes an edit, send the operation to the server and - // switch to the 'AwaitingConfirm' state - client.sendOperation(client.revision, operation); - return new AwaitingConfirm(operation); - }; - - Synchronized.prototype.applyServer = function (client, revision, operation) { - if (revision - client.revision > 1) { - throw new Error("Invalid revision."); - } - client.revision = revision; - // When we receive a new operation from the server, the operation can be - // simply applied to the current document - client.applyOperation(operation); - return this; - }; - - Synchronized.prototype.serverAck = function (client, revision) { - throw new Error("There is no pending operation."); - }; - - // Nothing to do because the latest server state and client state are the same. - Synchronized.prototype.transformSelection = function (x) { return x; }; - - // Singleton - var synchronized_ = new Synchronized(); - - - // In the 'AwaitingConfirm' state, there's one operation the client has sent - // to the server and is still waiting for an acknowledgement. - function AwaitingConfirm (outstanding) { - // Save the pending operation - this.outstanding = outstanding; - } - Client.AwaitingConfirm = AwaitingConfirm; - - AwaitingConfirm.prototype.applyClient = function (client, operation) { - // When the user makes an edit, don't send the operation immediately, - // instead switch to 'AwaitingWithBuffer' state - return new AwaitingWithBuffer(this.outstanding, operation); - }; - - AwaitingConfirm.prototype.applyServer = function (client, revision, operation) { - if (revision - client.revision > 1) { - throw new Error("Invalid revision."); - } - client.revision = revision; - // This is another client's operation. Visualization: - // - // /\ - // this.outstanding / \ operation - // / \ - // \ / - // pair[1] \ / pair[0] (new outstanding) - // (can be applied \/ - // to the client's - // current document) - var pair = operation.constructor.transform(this.outstanding, operation); - client.applyOperation(pair[1]); - return new AwaitingConfirm(pair[0]); - }; - - AwaitingConfirm.prototype.serverAck = function (client, revision) { - if (revision - client.revision > 1) { - return new Stale(this.outstanding, client, revision).getOperations(); - } - client.revision = revision; - // The client's operation has been acknowledged - // => switch to synchronized state - return synchronized_; - }; - - AwaitingConfirm.prototype.transformSelection = function (selection) { - return selection.transform(this.outstanding); - }; - - AwaitingConfirm.prototype.resend = function (client) { - // The confirm didn't come because the client was disconnected. - // Now that it has reconnected, we resend the outstanding operation. - client.sendOperation(client.revision, this.outstanding); - }; - - - // In the 'AwaitingWithBuffer' state, the client is waiting for an operation - // to be acknowledged by the server while buffering the edits the user makes - function AwaitingWithBuffer (outstanding, buffer) { - // Save the pending operation and the user's edits since then - this.outstanding = outstanding; - this.buffer = buffer; - } - Client.AwaitingWithBuffer = AwaitingWithBuffer; - - AwaitingWithBuffer.prototype.applyClient = function (client, operation) { - // Compose the user's changes onto the buffer - var newBuffer = this.buffer.compose(operation); - return new AwaitingWithBuffer(this.outstanding, newBuffer); - }; - - AwaitingWithBuffer.prototype.applyServer = function (client, revision, operation) { - if (revision - client.revision > 1) { - throw new Error("Invalid revision."); - } - client.revision = revision; - // Operation comes from another client - // - // /\ - // this.outstanding / \ operation - // / \ - // /\ / - // this.buffer / \* / pair1[0] (new outstanding) - // / \/ - // \ / - // pair2[1] \ / pair2[0] (new buffer) - // the transformed \/ - // operation -- can - // be applied to the - // client's current - // document - // - // * pair1[1] - var transform = operation.constructor.transform; - var pair1 = transform(this.outstanding, operation); - var pair2 = transform(this.buffer, pair1[1]); - client.applyOperation(pair2[1]); - return new AwaitingWithBuffer(pair1[0], pair2[0]); - }; - - AwaitingWithBuffer.prototype.serverAck = function (client, revision) { - if (revision - client.revision > 1) { - return new StaleWithBuffer(this.outstanding, this.buffer, client, revision).getOperations(); - } - client.revision = revision; - // The pending operation has been acknowledged - // => send buffer - client.sendOperation(client.revision, this.buffer); - return new AwaitingConfirm(this.buffer); - }; - - AwaitingWithBuffer.prototype.transformSelection = function (selection) { - return selection.transform(this.outstanding).transform(this.buffer); - }; - - AwaitingWithBuffer.prototype.resend = function (client) { - // The confirm didn't come because the client was disconnected. - // Now that it has reconnected, we resend the outstanding operation. - client.sendOperation(client.revision, this.outstanding); - }; - - - function Stale(acknowlaged, client, revision) { - this.acknowlaged = acknowlaged; - this.client = client; - this.revision = revision; - } - Client.Stale = Stale; - - Stale.prototype.applyClient = function (client, operation) { - return new StaleWithBuffer(this.acknowlaged, operation, client, this.revision); - }; - - Stale.prototype.applyServer = function (client, revision, operation) { - throw new Error("Ignored server-side change."); - }; - - Stale.prototype.applyOperations = function (client, head, operations) { - var transform = this.acknowlaged.constructor.transform; - for (var i = 0; i < operations.length; i++) { - var op = ot.TextOperation.fromJSON(operations[i]); - var pair = transform(this.acknowlaged, op); - client.applyOperation(pair[1]); - this.acknowlaged = pair[0]; - } - client.revision = this.revision; - return synchronized_; - }; - - Stale.prototype.serverAck = function (client, revision) { - throw new Error("There is no pending operation."); - }; - - Stale.prototype.transformSelection = function (selection) { - return selection; - }; - - Stale.prototype.getOperations = function () { - this.client.getOperations(this.client.revision, this.revision - 1); // acknowlaged is the one at revision - return this; - }; - - - function StaleWithBuffer(acknowlaged, buffer, client, revision) { - this.acknowlaged = acknowlaged; - this.buffer = buffer; - this.client = client; - this.revision = revision; - } - Client.StaleWithBuffer = StaleWithBuffer; - - StaleWithBuffer.prototype.applyClient = function (client, operation) { - var buffer = this.buffer.compose(operation); - return new StaleWithBuffer(this.acknowlaged, buffer, client, this.revision); - }; - - StaleWithBuffer.prototype.applyServer = function (client, revision, operation) { - throw new Error("Ignored server-side change."); - }; - - StaleWithBuffer.prototype.applyOperations = function (client, head, operations) { - var transform = this.acknowlaged.constructor.transform; - for (var i = 0; i < operations.length; i++) { - var op = ot.TextOperation.fromJSON(operations[i]); - var pair1 = transform(this.acknowlaged, op); - var pair2 = transform(this.buffer, pair1[1]); - client.applyOperation(pair2[1]); - this.acknowlaged = pair1[0]; - this.buffer = pair2[0]; - } - client.revision = this.revision; - client.sendOperation(client.revision, this.buffer); - return new AwaitingConfirm(this.buffer); - }; - - StaleWithBuffer.prototype.serverAck = function (client, revision) { - throw new Error("There is no pending operation."); - }; - - StaleWithBuffer.prototype.transformSelection = function (selection) { - return selection; - }; - - StaleWithBuffer.prototype.getOperations = function () { - this.client.getOperations(this.client.revision, this.revision - 1); // acknowlaged is the one at revision - return this; - }; - - - return Client; - -}(this)); - -if (typeof module === 'object') { - module.exports = ot.Client; -} - diff --git a/old_src/lib/ot/editor-socketio-server.ts b/old_src/lib/ot/editor-socketio-server.ts deleted file mode 100755 index 5cf7d27b0..000000000 --- a/old_src/lib/ot/editor-socketio-server.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { EventEmitter } from 'events' -import { logger } from '../logger' -import { SocketWithNoteId } from '../realtime' -import Selection from './selection' -import Server from './server' -import TextOperation from './text-operation' -import WrappedOperation from './wrapped-operation' - -export class EditorSocketIOServer extends Server { - private readonly users: {} - private readonly docId: any - private mayWrite: (socket: SocketWithNoteId, originIsOperation: boolean, callback: (mayEdit: boolean) => void) => void - - constructor (document, operations, docId, mayWrite, operationCallback) { - super(document, operations) - // Whatever that does? - EventEmitter.call(this) - this.users = {} - this.docId = docId - this.mayWrite = mayWrite || function (_, originIsOperation, cb) { - cb(true) - } - this.operationCallback = operationCallback - } - - addClient (socket) { - const self = this - socket.join(this.docId) - const docOut = { - str: this.document, - revision: this.operations.length, - clients: this.users - } - socket.emit('doc', docOut) - socket.on('operation', function (revision, operation, selection) { - self.mayWrite(socket, true, function (mayWrite) { - if (!mayWrite) { - logger.info("User doesn't have the right to edit.") - return - } - try { - self.onOperation(socket, revision, operation, selection) - if (typeof self.operationCallback === 'function') - self.operationCallback(socket, operation) - } catch (err) { - setTimeout(function () { - const docOut = { - str: self.document, - revision: self.operations.length, - clients: self.users, - force: true - } - socket.emit('doc', docOut) - }, 100) - } - }) - }) - socket.on('get_operations', function (base, head) { - self.onGetOperations(socket, base, head) - }) - socket.on('selection', function (obj) { - self.mayWrite(socket, false, function (mayWrite) { - if (!mayWrite) { - logger.info("User doesn't have the right to edit.") - return - } - self.updateSelection(socket, obj && Selection.fromJSON(obj)) - }) - }) - socket.on('disconnect', function () { - logger.debug("Disconnect") - socket.leave(self.docId) - self.onDisconnect(socket) - /* - if (socket.manager && socket.manager.sockets.clients(self.docId).length === 0) { - self.emit('empty-room'); - } - */ - }) - }; - - onOperation (socket, revision, operation, selection) { - let wrapped - try { - wrapped = new WrappedOperation( - TextOperation.fromJSON(operation), - selection && Selection.fromJSON(selection) - ) - } catch (exc) { - logger.error("Invalid operation received: ") - logger.error(exc) - throw new Error(exc) - } - - try { - const clientId = socket.id - const wrappedPrime = this.receiveOperation(revision, wrapped) - if (!wrappedPrime) return - logger.debug("new operation: " + JSON.stringify(wrapped)) - this.getClient(clientId).selection = wrappedPrime.meta - revision = this.operations.length - socket.emit('ack', revision) - socket.broadcast.in(this.docId).emit( - 'operation', clientId, revision, - wrappedPrime.wrapped.toJSON(), wrappedPrime.meta - ) - //set document is dirty - this.isDirty = true - } catch (exc) { - logger.error(exc) - throw new Error(exc) - } - }; - - onGetOperations (socket, base, head) { - const operations = this.operations.slice(base, head).map(function (op) { - return op.wrapped.toJSON() - }) - socket.emit('operations', head, operations) - }; - - updateSelection (socket, selection) { - const clientId = socket.id - if (selection) { - this.getClient(clientId).selection = selection - } else { - delete this.getClient(clientId).selection - } - socket.broadcast.to(this.docId).emit('selection', clientId, selection) - }; - - setName (socket, name) { - const clientId = socket.id - this.getClient(clientId).name = name - socket.broadcast.to(this.docId).emit('set_name', clientId, name) - }; - - setColor (socket, color) { - const clientId = socket.id - this.getClient(clientId).color = color - socket.broadcast.to(this.docId).emit('set_color', clientId, color) - }; - - getClient (clientId) { - return this.users[clientId] || (this.users[clientId] = {}) - }; - - onDisconnect (socket) { - const clientId = socket.id - delete this.users[clientId] - socket.broadcast.to(this.docId).emit('client_left', clientId) - }; -} - diff --git a/old_src/lib/ot/index.js b/old_src/lib/ot/index.js deleted file mode 100644 index fcc94c11b..000000000 --- a/old_src/lib/ot/index.js +++ /dev/null @@ -1,8 +0,0 @@ -exports.version = '0.0.15'; - -exports.TextOperation = require('./text-operation'); -exports.SimpleTextOperation = require('./simple-text-operation'); -exports.Client = require('./client'); -exports.Server = require('./server'); -exports.Selection = require('./selection'); -exports.EditorSocketIOServer = require('./editor-socketio-server'); diff --git a/old_src/lib/ot/selection.js b/old_src/lib/ot/selection.js deleted file mode 100644 index 72bf8bd65..000000000 --- a/old_src/lib/ot/selection.js +++ /dev/null @@ -1,117 +0,0 @@ -if (typeof ot === 'undefined') { - // Export for browsers - var ot = {}; -} - -ot.Selection = (function (global) { - 'use strict'; - - var TextOperation = global.ot ? global.ot.TextOperation : require('./text-operation'); - - // Range has `anchor` and `head` properties, which are zero-based indices into - // the document. The `anchor` is the side of the selection that stays fixed, - // `head` is the side of the selection where the cursor is. When both are - // equal, the range represents a cursor. - function Range (anchor, head) { - this.anchor = anchor; - this.head = head; - } - - Range.fromJSON = function (obj) { - return new Range(obj.anchor, obj.head); - }; - - Range.prototype.equals = function (other) { - return this.anchor === other.anchor && this.head === other.head; - }; - - Range.prototype.isEmpty = function () { - return this.anchor === this.head; - }; - - Range.prototype.transform = function (other) { - function transformIndex (index) { - var newIndex = index; - var ops = other.ops; - for (var i = 0, l = other.ops.length; i < l; i++) { - if (TextOperation.isRetain(ops[i])) { - index -= ops[i]; - } else if (TextOperation.isInsert(ops[i])) { - newIndex += ops[i].length; - } else { - newIndex -= Math.min(index, -ops[i]); - index += ops[i]; - } - if (index < 0) { break; } - } - return newIndex; - } - - var newAnchor = transformIndex(this.anchor); - if (this.anchor === this.head) { - return new Range(newAnchor, newAnchor); - } - return new Range(newAnchor, transformIndex(this.head)); - }; - - // A selection is basically an array of ranges. Every range represents a real - // selection or a cursor in the document (when the start position equals the - // end position of the range). The array must not be empty. - function Selection (ranges) { - this.ranges = ranges || []; - } - - Selection.Range = Range; - - // Convenience method for creating selections only containing a single cursor - // and no real selection range. - Selection.createCursor = function (position) { - return new Selection([new Range(position, position)]); - }; - - Selection.fromJSON = function (obj) { - var objRanges = obj.ranges || obj; - for (var i = 0, ranges = []; i < objRanges.length; i++) { - ranges[i] = Range.fromJSON(objRanges[i]); - } - return new Selection(ranges); - }; - - Selection.prototype.equals = function (other) { - if (this.position !== other.position) { return false; } - if (this.ranges.length !== other.ranges.length) { return false; } - // FIXME: Sort ranges before comparing them? - for (var i = 0; i < this.ranges.length; i++) { - if (!this.ranges[i].equals(other.ranges[i])) { return false; } - } - return true; - }; - - Selection.prototype.somethingSelected = function () { - for (var i = 0; i < this.ranges.length; i++) { - if (!this.ranges[i].isEmpty()) { return true; } - } - return false; - }; - - // Return the more current selection information. - Selection.prototype.compose = function (other) { - return other; - }; - - // Update the selection with respect to an operation. - Selection.prototype.transform = function (other) { - for (var i = 0, newRanges = []; i < this.ranges.length; i++) { - newRanges[i] = this.ranges[i].transform(other); - } - return new Selection(newRanges); - }; - - return Selection; - -}(this)); - -// Export for CommonJS -if (typeof module === 'object') { - module.exports = ot.Selection; -} diff --git a/old_src/lib/ot/server.js b/old_src/lib/ot/server.js deleted file mode 100644 index 30ebeac96..000000000 --- a/old_src/lib/ot/server.js +++ /dev/null @@ -1,52 +0,0 @@ -var config = require('../config'); - -if (typeof ot === 'undefined') { - var ot = {}; -} - -ot.Server = (function (global) { - 'use strict'; - - // Constructor. Takes the current document as a string and optionally the array - // of all operations. - function Server (document, operations) { - this.document = document; - this.operations = operations || []; - } - - // Call this method whenever you receive an operation from a client. - Server.prototype.receiveOperation = function (revision, operation) { - if (revision < 0 || this.operations.length < revision) { - throw new Error("operation revision not in history"); - } - // Find all operations that the client didn't know of when it sent the - // operation ... - var concurrentOperations = this.operations.slice(revision); - - // ... and transform the operation against all these operations ... - var transform = operation.constructor.transform; - for (var i = 0; i < concurrentOperations.length; i++) { - operation = transform(operation, concurrentOperations[i])[0]; - } - - // ... and apply that on the document. - var newDocument = operation.apply(this.document); - // ignore if exceed the max length of document - if(newDocument.length > config.documentMaxLength && newDocument.length > this.document.length) - return; - this.document = newDocument; - // Store operation in history. - this.operations.push(operation); - - // It's the caller's responsibility to send the operation to all connected - // clients and an acknowledgement to the creator. - return operation; - }; - - return Server; - -}(this)); - -if (typeof module === 'object') { - module.exports = ot.Server; -} \ No newline at end of file diff --git a/old_src/lib/ot/simple-text-operation.js b/old_src/lib/ot/simple-text-operation.js deleted file mode 100644 index 6db296e02..000000000 --- a/old_src/lib/ot/simple-text-operation.js +++ /dev/null @@ -1,188 +0,0 @@ -if (typeof ot === 'undefined') { - // Export for browsers - var ot = {}; -} - -ot.SimpleTextOperation = (function (global) { - - var TextOperation = global.ot ? global.ot.TextOperation : require('./text-operation'); - - function SimpleTextOperation () {} - - - // Insert the string `str` at the zero-based `position` in the document. - function Insert (str, position) { - if (!this || this.constructor !== SimpleTextOperation) { - // => function was called without 'new' - return new Insert(str, position); - } - this.str = str; - this.position = position; - } - - Insert.prototype = new SimpleTextOperation(); - SimpleTextOperation.Insert = Insert; - - Insert.prototype.toString = function () { - return 'Insert(' + JSON.stringify(this.str) + ', ' + this.position + ')'; - }; - - Insert.prototype.equals = function (other) { - return other instanceof Insert && - this.str === other.str && - this.position === other.position; - }; - - Insert.prototype.apply = function (doc) { - return doc.slice(0, this.position) + this.str + doc.slice(this.position); - }; - - - // Delete `count` many characters at the zero-based `position` in the document. - function Delete (count, position) { - if (!this || this.constructor !== SimpleTextOperation) { - return new Delete(count, position); - } - this.count = count; - this.position = position; - } - - Delete.prototype = new SimpleTextOperation(); - SimpleTextOperation.Delete = Delete; - - Delete.prototype.toString = function () { - return 'Delete(' + this.count + ', ' + this.position + ')'; - }; - - Delete.prototype.equals = function (other) { - return other instanceof Delete && - this.count === other.count && - this.position === other.position; - }; - - Delete.prototype.apply = function (doc) { - return doc.slice(0, this.position) + doc.slice(this.position + this.count); - }; - - - // An operation that does nothing. This is needed for the result of the - // transformation of two deletions of the same character. - function Noop () { - if (!this || this.constructor !== SimpleTextOperation) { return new Noop(); } - } - - Noop.prototype = new SimpleTextOperation(); - SimpleTextOperation.Noop = Noop; - - Noop.prototype.toString = function () { - return 'Noop()'; - }; - - Noop.prototype.equals = function (other) { return other instanceof Noop; }; - - Noop.prototype.apply = function (doc) { return doc; }; - - var noop = new Noop(); - - - SimpleTextOperation.transform = function (a, b) { - if (a instanceof Noop || b instanceof Noop) { return [a, b]; } - - if (a instanceof Insert && b instanceof Insert) { - if (a.position < b.position || (a.position === b.position && a.str < b.str)) { - return [a, new Insert(b.str, b.position + a.str.length)]; - } - if (a.position > b.position || (a.position === b.position && a.str > b.str)) { - return [new Insert(a.str, a.position + b.str.length), b]; - } - return [noop, noop]; - } - - if (a instanceof Insert && b instanceof Delete) { - if (a.position <= b.position) { - return [a, new Delete(b.count, b.position + a.str.length)]; - } - if (a.position >= b.position + b.count) { - return [new Insert(a.str, a.position - b.count), b]; - } - // Here, we have to delete the inserted string of operation a. - // That doesn't preserve the intention of operation a, but it's the only - // thing we can do to get a valid transform function. - return [noop, new Delete(b.count + a.str.length, b.position)]; - } - - if (a instanceof Delete && b instanceof Insert) { - if (a.position >= b.position) { - return [new Delete(a.count, a.position + b.str.length), b]; - } - if (a.position + a.count <= b.position) { - return [a, new Insert(b.str, b.position - a.count)]; - } - // Same problem as above. We have to delete the string that was inserted - // in operation b. - return [new Delete(a.count + b.str.length, a.position), noop]; - } - - if (a instanceof Delete && b instanceof Delete) { - if (a.position === b.position) { - if (a.count === b.count) { - return [noop, noop]; - } else if (a.count < b.count) { - return [noop, new Delete(b.count - a.count, b.position)]; - } - return [new Delete(a.count - b.count, a.position), noop]; - } - if (a.position < b.position) { - if (a.position + a.count <= b.position) { - return [a, new Delete(b.count, b.position - a.count)]; - } - if (a.position + a.count >= b.position + b.count) { - return [new Delete(a.count - b.count, a.position), noop]; - } - return [ - new Delete(b.position - a.position, a.position), - new Delete(b.position + b.count - (a.position + a.count), a.position) - ]; - } - if (a.position > b.position) { - if (a.position >= b.position + b.count) { - return [new Delete(a.count, a.position - b.count), b]; - } - if (a.position + a.count <= b.position + b.count) { - return [noop, new Delete(b.count - a.count, b.position)]; - } - return [ - new Delete(a.position + a.count - (b.position + b.count), b.position), - new Delete(a.position - b.position, b.position) - ]; - } - } - }; - - // Convert a normal, composable `TextOperation` into an array of - // `SimpleTextOperation`s. - SimpleTextOperation.fromTextOperation = function (operation) { - var simpleOperations = []; - var index = 0; - for (var i = 0; i < operation.ops.length; i++) { - var op = operation.ops[i]; - if (TextOperation.isRetain(op)) { - index += op; - } else if (TextOperation.isInsert(op)) { - simpleOperations.push(new Insert(op, index)); - index += op.length; - } else { - simpleOperations.push(new Delete(Math.abs(op), index)); - } - } - return simpleOperations; - }; - - - return SimpleTextOperation; -})(this); - -// Export for CommonJS -if (typeof module === 'object') { - module.exports = ot.SimpleTextOperation; -} \ No newline at end of file diff --git a/old_src/lib/ot/text-operation.js b/old_src/lib/ot/text-operation.js deleted file mode 100644 index d5468497e..000000000 --- a/old_src/lib/ot/text-operation.js +++ /dev/null @@ -1,530 +0,0 @@ -if (typeof ot === 'undefined') { - // Export for browsers - var ot = {}; -} - -ot.TextOperation = (function () { - 'use strict'; - - // Constructor for new operations. - function TextOperation () { - if (!this || this.constructor !== TextOperation) { - // => function was called without 'new' - return new TextOperation(); - } - - // When an operation is applied to an input string, you can think of this as - // if an imaginary cursor runs over the entire string and skips over some - // parts, deletes some parts and inserts characters at some positions. These - // actions (skip/delete/insert) are stored as an array in the "ops" property. - this.ops = []; - // An operation's baseLength is the length of every string the operation - // can be applied to. - this.baseLength = 0; - // The targetLength is the length of every string that results from applying - // the operation on a valid input string. - this.targetLength = 0; - } - - TextOperation.prototype.equals = function (other) { - if (this.baseLength !== other.baseLength) { return false; } - if (this.targetLength !== other.targetLength) { return false; } - if (this.ops.length !== other.ops.length) { return false; } - for (var i = 0; i < this.ops.length; i++) { - if (this.ops[i] !== other.ops[i]) { return false; } - } - return true; - }; - - // Operation are essentially lists of ops. There are three types of ops: - // - // * Retain ops: Advance the cursor position by a given number of characters. - // Represented by positive ints. - // * Insert ops: Insert a given string at the current cursor position. - // Represented by strings. - // * Delete ops: Delete the next n characters. Represented by negative ints. - - var isRetain = TextOperation.isRetain = function (op) { - return typeof op === 'number' && op > 0; - }; - - var isInsert = TextOperation.isInsert = function (op) { - return typeof op === 'string'; - }; - - var isDelete = TextOperation.isDelete = function (op) { - return typeof op === 'number' && op < 0; - }; - - - // After an operation is constructed, the user of the library can specify the - // actions of an operation (skip/insert/delete) with these three builder - // methods. They all return the operation for convenient chaining. - - // Skip over a given number of characters. - TextOperation.prototype.retain = function (n) { - if (typeof n !== 'number') { - throw new Error("retain expects an integer"); - } - if (n === 0) { return this; } - this.baseLength += n; - this.targetLength += n; - if (isRetain(this.ops[this.ops.length-1])) { - // The last op is a retain op => we can merge them into one op. - this.ops[this.ops.length-1] += n; - } else { - // Create a new op. - this.ops.push(n); - } - return this; - }; - - // Insert a string at the current position. - TextOperation.prototype.insert = function (str) { - if (typeof str !== 'string') { - throw new Error("insert expects a string"); - } - if (str === '') { return this; } - this.targetLength += str.length; - var ops = this.ops; - if (isInsert(ops[ops.length-1])) { - // Merge insert op. - ops[ops.length-1] += str; - } else if (isDelete(ops[ops.length-1])) { - // It doesn't matter when an operation is applied whether the operation - // is delete(3), insert("something") or insert("something"), delete(3). - // Here we enforce that in this case, the insert op always comes first. - // This makes all operations that have the same effect when applied to - // a document of the right length equal in respect to the `equals` method. - if (isInsert(ops[ops.length-2])) { - ops[ops.length-2] += str; - } else { - ops[ops.length] = ops[ops.length-1]; - ops[ops.length-2] = str; - } - } else { - ops.push(str); - } - return this; - }; - - // Delete a string at the current position. - TextOperation.prototype['delete'] = function (n) { - if (typeof n === 'string') { n = n.length; } - if (typeof n !== 'number') { - throw new Error("delete expects an integer or a string"); - } - if (n === 0) { return this; } - if (n > 0) { n = -n; } - this.baseLength -= n; - if (isDelete(this.ops[this.ops.length-1])) { - this.ops[this.ops.length-1] += n; - } else { - this.ops.push(n); - } - return this; - }; - - // Tests whether this operation has no effect. - TextOperation.prototype.isNoop = function () { - return this.ops.length === 0 || (this.ops.length === 1 && isRetain(this.ops[0])); - }; - - // Pretty printing. - TextOperation.prototype.toString = function () { - // map: build a new array by applying a function to every element in an old - // array. - var map = Array.prototype.map || function (fn) { - var arr = this; - var newArr = []; - for (var i = 0, l = arr.length; i < l; i++) { - newArr[i] = fn(arr[i]); - } - return newArr; - }; - return map.call(this.ops, function (op) { - if (isRetain(op)) { - return "retain " + op; - } else if (isInsert(op)) { - return "insert '" + op + "'"; - } else { - return "delete " + (-op); - } - }).join(', '); - }; - - // Converts operation into a JSON value. - TextOperation.prototype.toJSON = function () { - return this.ops; - }; - - // Converts a plain JS object into an operation and validates it. - TextOperation.fromJSON = function (ops) { - var o = new TextOperation(); - for (var i = 0, l = ops.length; i < l; i++) { - var op = ops[i]; - if (isRetain(op)) { - o.retain(op); - } else if (isInsert(op)) { - o.insert(op); - } else if (isDelete(op)) { - o['delete'](op); - } else { - throw new Error("unknown operation: " + JSON.stringify(op)); - } - } - return o; - }; - - // Apply an operation to a string, returning a new string. Throws an error if - // there's a mismatch between the input string and the operation. - TextOperation.prototype.apply = function (str) { - var operation = this; - if (str.length !== operation.baseLength) { - throw new Error("The operation's base length must be equal to the string's length."); - } - var newStr = [], j = 0; - var strIndex = 0; - var ops = this.ops; - for (var i = 0, l = ops.length; i < l; i++) { - var op = ops[i]; - if (isRetain(op)) { - if (strIndex + op > str.length) { - throw new Error("Operation can't retain more characters than are left in the string."); - } - // Copy skipped part of the old string. - newStr[j++] = str.slice(strIndex, strIndex + op); - strIndex += op; - } else if (isInsert(op)) { - // Insert string. - newStr[j++] = op; - } else { // delete op - strIndex -= op; - } - } - if (strIndex !== str.length) { - throw new Error("The operation didn't operate on the whole string."); - } - return newStr.join(''); - }; - - // Computes the inverse of an operation. The inverse of an operation is the - // operation that reverts the effects of the operation, e.g. when you have an - // operation 'insert("hello "); skip(6);' then the inverse is 'delete("hello "); - // skip(6);'. The inverse should be used for implementing undo. - TextOperation.prototype.invert = function (str) { - var strIndex = 0; - var inverse = new TextOperation(); - var ops = this.ops; - for (var i = 0, l = ops.length; i < l; i++) { - var op = ops[i]; - if (isRetain(op)) { - inverse.retain(op); - strIndex += op; - } else if (isInsert(op)) { - inverse['delete'](op.length); - } else { // delete op - inverse.insert(str.slice(strIndex, strIndex - op)); - strIndex -= op; - } - } - return inverse; - }; - - // Compose merges two consecutive operations into one operation, that - // preserves the changes of both. Or, in other words, for each input string S - // and a pair of consecutive operations A and B, - // apply(apply(S, A), B) = apply(S, compose(A, B)) must hold. - TextOperation.prototype.compose = function (operation2) { - var operation1 = this; - if (operation1.targetLength !== operation2.baseLength) { - throw new Error("The base length of the second operation has to be the target length of the first operation"); - } - - var operation = new TextOperation(); // the combined operation - var ops1 = operation1.ops, ops2 = operation2.ops; // for fast access - var i1 = 0, i2 = 0; // current index into ops1 respectively ops2 - var op1 = ops1[i1++], op2 = ops2[i2++]; // current ops - while (true) { - // Dispatch on the type of op1 and op2 - if (typeof op1 === 'undefined' && typeof op2 === 'undefined') { - // end condition: both ops1 and ops2 have been processed - break; - } - - if (isDelete(op1)) { - operation['delete'](op1); - op1 = ops1[i1++]; - continue; - } - if (isInsert(op2)) { - operation.insert(op2); - op2 = ops2[i2++]; - continue; - } - - if (typeof op1 === 'undefined') { - throw new Error("Cannot compose operations: first operation is too short."); - } - if (typeof op2 === 'undefined') { - throw new Error("Cannot compose operations: first operation is too long."); - } - - if (isRetain(op1) && isRetain(op2)) { - if (op1 > op2) { - operation.retain(op2); - op1 = op1 - op2; - op2 = ops2[i2++]; - } else if (op1 === op2) { - operation.retain(op1); - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - operation.retain(op1); - op2 = op2 - op1; - op1 = ops1[i1++]; - } - } else if (isInsert(op1) && isDelete(op2)) { - if (op1.length > -op2) { - op1 = op1.slice(-op2); - op2 = ops2[i2++]; - } else if (op1.length === -op2) { - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - op2 = op2 + op1.length; - op1 = ops1[i1++]; - } - } else if (isInsert(op1) && isRetain(op2)) { - if (op1.length > op2) { - operation.insert(op1.slice(0, op2)); - op1 = op1.slice(op2); - op2 = ops2[i2++]; - } else if (op1.length === op2) { - operation.insert(op1); - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - operation.insert(op1); - op2 = op2 - op1.length; - op1 = ops1[i1++]; - } - } else if (isRetain(op1) && isDelete(op2)) { - if (op1 > -op2) { - operation['delete'](op2); - op1 = op1 + op2; - op2 = ops2[i2++]; - } else if (op1 === -op2) { - operation['delete'](op2); - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - operation['delete'](op1); - op2 = op2 + op1; - op1 = ops1[i1++]; - } - } else { - throw new Error( - "This shouldn't happen: op1: " + - JSON.stringify(op1) + ", op2: " + - JSON.stringify(op2) - ); - } - } - return operation; - }; - - function getSimpleOp (operation, fn) { - var ops = operation.ops; - var isRetain = TextOperation.isRetain; - switch (ops.length) { - case 1: - return ops[0]; - case 2: - return isRetain(ops[0]) ? ops[1] : (isRetain(ops[1]) ? ops[0] : null); - case 3: - if (isRetain(ops[0]) && isRetain(ops[2])) { return ops[1]; } - } - return null; - } - - function getStartIndex (operation) { - if (isRetain(operation.ops[0])) { return operation.ops[0]; } - return 0; - } - - // When you use ctrl-z to undo your latest changes, you expect the program not - // to undo every single keystroke but to undo your last sentence you wrote at - // a stretch or the deletion you did by holding the backspace key down. This - // This can be implemented by composing operations on the undo stack. This - // method can help decide whether two operations should be composed. It - // returns true if the operations are consecutive insert operations or both - // operations delete text at the same position. You may want to include other - // factors like the time since the last change in your decision. - TextOperation.prototype.shouldBeComposedWith = function (other) { - if (this.isNoop() || other.isNoop()) { return true; } - - var startA = getStartIndex(this), startB = getStartIndex(other); - var simpleA = getSimpleOp(this), simpleB = getSimpleOp(other); - if (!simpleA || !simpleB) { return false; } - - if (isInsert(simpleA) && isInsert(simpleB)) { - return startA + simpleA.length === startB; - } - - if (isDelete(simpleA) && isDelete(simpleB)) { - // there are two possibilities to delete: with backspace and with the - // delete key. - return (startB - simpleB === startA) || startA === startB; - } - - return false; - }; - - // Decides whether two operations should be composed with each other - // if they were inverted, that is - // `shouldBeComposedWith(a, b) = shouldBeComposedWithInverted(b^{-1}, a^{-1})`. - TextOperation.prototype.shouldBeComposedWithInverted = function (other) { - if (this.isNoop() || other.isNoop()) { return true; } - - var startA = getStartIndex(this), startB = getStartIndex(other); - var simpleA = getSimpleOp(this), simpleB = getSimpleOp(other); - if (!simpleA || !simpleB) { return false; } - - if (isInsert(simpleA) && isInsert(simpleB)) { - return startA + simpleA.length === startB || startA === startB; - } - - if (isDelete(simpleA) && isDelete(simpleB)) { - return startB - simpleB === startA; - } - - return false; - }; - - // Transform takes two operations A and B that happened concurrently and - // produces two operations A' and B' (in an array) such that - // `apply(apply(S, A), B') = apply(apply(S, B), A')`. This function is the - // heart of OT. - TextOperation.transform = function (operation1, operation2) { - if (operation1.baseLength !== operation2.baseLength) { - throw new Error("Both operations have to have the same base length"); - } - - var operation1prime = new TextOperation(); - var operation2prime = new TextOperation(); - var ops1 = operation1.ops, ops2 = operation2.ops; - var i1 = 0, i2 = 0; - var op1 = ops1[i1++], op2 = ops2[i2++]; - while (true) { - // At every iteration of the loop, the imaginary cursor that both - // operation1 and operation2 have that operates on the input string must - // have the same position in the input string. - - if (typeof op1 === 'undefined' && typeof op2 === 'undefined') { - // end condition: both ops1 and ops2 have been processed - break; - } - - // next two cases: one or both ops are insert ops - // => insert the string in the corresponding prime operation, skip it in - // the other one. If both op1 and op2 are insert ops, prefer op1. - if (isInsert(op1)) { - operation1prime.insert(op1); - operation2prime.retain(op1.length); - op1 = ops1[i1++]; - continue; - } - if (isInsert(op2)) { - operation1prime.retain(op2.length); - operation2prime.insert(op2); - op2 = ops2[i2++]; - continue; - } - - if (typeof op1 === 'undefined') { - throw new Error("Cannot compose operations: first operation is too short."); - } - if (typeof op2 === 'undefined') { - throw new Error("Cannot compose operations: first operation is too long."); - } - - var minl; - if (isRetain(op1) && isRetain(op2)) { - // Simple case: retain/retain - if (op1 > op2) { - minl = op2; - op1 = op1 - op2; - op2 = ops2[i2++]; - } else if (op1 === op2) { - minl = op2; - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - minl = op1; - op2 = op2 - op1; - op1 = ops1[i1++]; - } - operation1prime.retain(minl); - operation2prime.retain(minl); - } else if (isDelete(op1) && isDelete(op2)) { - // Both operations delete the same string at the same position. We don't - // need to produce any operations, we just skip over the delete ops and - // handle the case that one operation deletes more than the other. - if (-op1 > -op2) { - op1 = op1 - op2; - op2 = ops2[i2++]; - } else if (op1 === op2) { - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - op2 = op2 - op1; - op1 = ops1[i1++]; - } - // next two cases: delete/retain and retain/delete - } else if (isDelete(op1) && isRetain(op2)) { - if (-op1 > op2) { - minl = op2; - op1 = op1 + op2; - op2 = ops2[i2++]; - } else if (-op1 === op2) { - minl = op2; - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - minl = -op1; - op2 = op2 + op1; - op1 = ops1[i1++]; - } - operation1prime['delete'](minl); - } else if (isRetain(op1) && isDelete(op2)) { - if (op1 > -op2) { - minl = -op2; - op1 = op1 + op2; - op2 = ops2[i2++]; - } else if (op1 === -op2) { - minl = op1; - op1 = ops1[i1++]; - op2 = ops2[i2++]; - } else { - minl = op1; - op2 = op2 + op1; - op1 = ops1[i1++]; - } - operation2prime['delete'](minl); - } else { - throw new Error("The two operations aren't compatible"); - } - } - - return [operation1prime, operation2prime]; - }; - - return TextOperation; - -}()); - -// Export for CommonJS -if (typeof module === 'object') { - module.exports = ot.TextOperation; -} \ No newline at end of file diff --git a/old_src/lib/ot/wrapped-operation.js b/old_src/lib/ot/wrapped-operation.js deleted file mode 100644 index 91050f4ed..000000000 --- a/old_src/lib/ot/wrapped-operation.js +++ /dev/null @@ -1,80 +0,0 @@ -if (typeof ot === 'undefined') { - // Export for browsers - var ot = {}; -} - -ot.WrappedOperation = (function (global) { - 'use strict'; - - // A WrappedOperation contains an operation and corresponing metadata. - function WrappedOperation (operation, meta) { - this.wrapped = operation; - this.meta = meta; - } - - WrappedOperation.prototype.apply = function () { - return this.wrapped.apply.apply(this.wrapped, arguments); - }; - - WrappedOperation.prototype.invert = function () { - var meta = this.meta; - return new WrappedOperation( - this.wrapped.invert.apply(this.wrapped, arguments), - meta && typeof meta === 'object' && typeof meta.invert === 'function' ? - meta.invert.apply(meta, arguments) : meta - ); - }; - - // Copy all properties from source to target. - function copy (source, target) { - for (var key in source) { - if (source.hasOwnProperty(key)) { - target[key] = source[key]; - } - } - } - - function composeMeta (a, b) { - if (a && typeof a === 'object') { - if (typeof a.compose === 'function') { return a.compose(b); } - var meta = {}; - copy(a, meta); - copy(b, meta); - return meta; - } - return b; - } - - WrappedOperation.prototype.compose = function (other) { - return new WrappedOperation( - this.wrapped.compose(other.wrapped), - composeMeta(this.meta, other.meta) - ); - }; - - function transformMeta (meta, operation) { - if (meta && typeof meta === 'object') { - if (typeof meta.transform === 'function') { - return meta.transform(operation); - } - } - return meta; - } - - WrappedOperation.transform = function (a, b) { - var transform = a.wrapped.constructor.transform; - var pair = transform(a.wrapped, b.wrapped); - return [ - new WrappedOperation(pair[0], transformMeta(a.meta, b.wrapped)), - new WrappedOperation(pair[1], transformMeta(b.meta, a.wrapped)) - ]; - }; - - return WrappedOperation; - -}(this)); - -// Export for CommonJS -if (typeof module === 'object') { - module.exports = ot.WrappedOperation; -} \ No newline at end of file diff --git a/old_src/lib/realtime.ts b/old_src/lib/realtime.ts deleted file mode 100644 index 98d83257f..000000000 --- a/old_src/lib/realtime.ts +++ /dev/null @@ -1,991 +0,0 @@ -import Chance from 'chance' -import CodeMirror from 'codemirror' -import cookie from 'cookie' -import cookieParser from 'cookie-parser' -import moment from 'moment' -import randomcolor from 'randomcolor' -import SocketIO, { Socket } from 'socket.io' -import { config } from './config' - -import { History } from './history' -import { logger } from './logger' -import { Author, Note, Revision, User } from './models' -import { NoteAuthorship } from './models/note' -import { PhotoProfile } from './utils/PhotoProfile' -import { EditorSocketIOServer } from './ot/editor-socketio-server' -import { mapToObject } from './utils/functions' -import { getPermission, Permission } from './web/note/util' - -export type SocketWithNoteId = Socket & { noteId: string } - -const chance = new Chance() - -export enum State { - Starting, - Running, - Stopping -} -/* eslint-disable @typescript-eslint/no-use-before-define */ -const realtime: { - onAuthorizeSuccess: (data, accept) => void; - onAuthorizeFail: (data, message, error, accept) => void; - io: SocketIO.Server; isReady: () => boolean; - connection: (socket: SocketWithNoteId) => void; - secure: (socket: SocketIO.Socket, next: (err?: Error) => void) => void; - getStatus: (callback) => void; state: State; -} = { - io: SocketIO(), - onAuthorizeSuccess: onAuthorizeSuccess, - onAuthorizeFail: onAuthorizeFail, - secure: secure, - connection: connection, - getStatus: getStatus, - isReady: isReady, - state: State.Starting -} -/* eslint-enable @typescript-eslint/no-use-before-define */ - -const disconnectSocketQueue: SocketWithNoteId[] = [] - -function onAuthorizeSuccess (data, accept): void { - accept() -} - -function onAuthorizeFail (data, message, error, accept): void { - accept() // accept whether authorize or not to allow anonymous usage -} - -// secure the origin by the cookie -function secure (socket: Socket, next: (err?: Error) => void): void { - try { - const handshakeData = socket.request - if (handshakeData.headers.cookie) { - handshakeData.cookie = cookie.parse(handshakeData.headers.cookie) - handshakeData.sessionID = cookieParser.signedCookie(handshakeData.cookie[config.sessionName], config.sessionSecret) - if (handshakeData.sessionID && - handshakeData.cookie[config.sessionName] && - handshakeData.cookie[config.sessionName] !== handshakeData.sessionID) { - logger.debug(`AUTH success cookie: ${handshakeData.sessionID}`) - return next() - } else { - next(new Error('AUTH failed: Cookie is invalid.')) - } - } else { - next(new Error('AUTH failed: No cookie transmitted.')) - } - } catch (ex) { - next(new Error('AUTH failed:' + JSON.stringify(ex))) - } -} - -function emitCheck (note: NoteSession): void { - const out = { - title: note.title, - updatetime: note.updatetime, - lastchangeuser: note.lastchangeuser, - lastchangeuserprofile: note.lastchangeuserprofile, - authors: mapToObject(note.authors), - authorship: note.authorship - } - realtime.io.to(note.id).emit('check', out) -} - -class UserSession { - id?: string - address?: string - login?: boolean - userid: string | null - 'user-agent'? - photo: string - color: string - cursor?: CodeMirror.Position - name: string | null - idle?: boolean - type?: string -} - -class NoteSession { - id: string - alias: string - title: string - ownerId: string - ownerprofile: PhotoProfile | null - permission: string - lastchangeuser: string | null - lastchangeuserprofile: PhotoProfile | null - socks: SocketWithNoteId[] - users: Map - tempUsers: Map // time value - createtime: number - updatetime: number - server: EditorSocketIOServer - authors: Map - authorship: NoteAuthorship[] -} - -// actions -const users: Map = new Map() -const notes: Map = new Map() - -let saverSleep = false - -function finishUpdateNote (note: NoteSession, _note: Note, callback: (err: Error | null, note: Note | null) => void): void { - if (!note || !note.server) return callback(null, null) - const body = note.server.document - const title = note.title = Note.parseNoteTitle(body) - const values = { - title: title, - content: body, - authorship: note.authorship, - lastchangeuserId: note.lastchangeuser, - lastchangeAt: Date.now() - } - _note.update(values).then(function (_note) { - saverSleep = false - return callback(null, _note) - }).catch(function (err) { - logger.error(err) - return callback(err, null) - }) -} - -function updateHistory (userId, note: NoteSession, time?): void { - const noteId = note.alias ? note.alias : Note.encodeNoteId(note.id) - if (note.server) History.updateHistory(userId, noteId, note.server.document, time) -} - -function updateNote (note: NoteSession, callback: (err, note) => void): void { - Note.findOne({ - where: { - id: note.id - } - }).then(function (_note) { - if (!_note) return callback(null, null) - // update user note history - const tempUsers = new Map(note.tempUsers) - note.tempUsers = new Map() - for (const [key, time] of tempUsers) { - updateHistory(key, note, time) - } - if (note.lastchangeuser) { - if (_note.lastchangeuserId !== note.lastchangeuser) { - User.findOne({ - where: { - id: note.lastchangeuser - } - }).then(function (user) { - if (!user) return callback(null, null) - note.lastchangeuserprofile = PhotoProfile.fromUser(user) - return finishUpdateNote(note, _note, callback) - }).catch(function (err) { - logger.error(err) - return callback(err, null) - }) - } else { - return finishUpdateNote(note, _note, callback) - } - } else { - note.lastchangeuserprofile = null - return finishUpdateNote(note, _note, callback) - } - }).catch(function (err) { - logger.error(err) - return callback(err, null) - }) -} - -// update when the note is dirty -setInterval(function () { - for (const [key, note] of notes) { - if (note.server.isDirty) { - logger.debug(`updater found dirty note: ${key}`) - note.server.isDirty = false - updateNote(note, function (err, _note) { - // handle when note already been clean up - if (!note || !note.server) return - if (!_note) { - realtime.io.to(note.id).emit('info', { - code: 404 - }) - logger.error('note not found: ', note.id) - } - if (err || !_note) { - for (const sock of note.socks) { - if (sock) { - setTimeout(function () { - sock.disconnect() - }, 0) - } - } - return logger.error('updater error', err) - } - note.updatetime = moment(_note.lastchangeAt).valueOf() - emitCheck(note) - }) - } else { - return - } - } -}, 1000) - -// save note revision in interval -setInterval(function () { - if (saverSleep) return - Revision.saveAllNotesRevision(function (err, notes) { - if (err) return logger.error('revision saver failed: ' + err) - if (notes && notes.length <= 0) { - saverSleep = true - } - }) -}, 60000 * 5) - -let isConnectionBusy: boolean -let isDisconnectBusy: boolean - -const connectionSocketQueue: SocketWithNoteId[] = [] - -function getStatus (callback): void { - Note.count().then(function (notecount) { - const distinctaddresses: string[] = [] - const regaddresses: string[] = [] - const distinctregaddresses: string[] = [] - for (const user of users.values()) { - if (!user) return - let found = false - for (const distinctaddress of distinctaddresses) { - if (user.address === distinctaddress) { - found = true - break - } - } - if (!found) { - if (user.address != null) { - distinctaddresses.push(user.address) - } - } - if (user.login) { - if (user.address != null) { - regaddresses.push(user.address) - } - let found = false - for (let i = 0; i < distinctregaddresses.length; i++) { - if (user.address === distinctregaddresses[i]) { - found = true - break - } - } - if (!found) { - if (user.address != null) { - distinctregaddresses.push(user.address) - } - } - } - } - User.count().then(function (regcount) { - // eslint-disable-next-line standard/no-callback-literal - return callback ? callback({ - onlineNotes: Object.keys(notes).length, - onlineUsers: Object.keys(users).length, - distinctOnlineUsers: distinctaddresses.length, - notesCount: notecount, - registeredUsers: regcount, - onlineRegisteredUsers: regaddresses.length, - distinctOnlineRegisteredUsers: distinctregaddresses.length, - isConnectionBusy: isConnectionBusy, - connectionSocketQueueLength: connectionSocketQueue.length, - isDisconnectBusy: isDisconnectBusy, - disconnectSocketQueueLength: disconnectSocketQueue.length - }) : null - }).catch(function (err) { - return logger.error('count user failed: ' + err) - }) - }).catch(function (err) { - return logger.error('count note failed: ' + err) - }) -} - -function isReady (): boolean { - return realtime.io && - Object.keys(notes).length === 0 && Object.keys(users).length === 0 && - connectionSocketQueue.length === 0 && !isConnectionBusy && - disconnectSocketQueue.length === 0 && !isDisconnectBusy -} - -function extractNoteIdFromSocket (socket: Socket): string | boolean { - if (!socket || !socket.handshake) { - return false - } - if (socket.handshake.query && socket.handshake.query.noteId) { - return socket.handshake.query.noteId - } else { - return false - } -} - -function parseNoteIdFromSocket (socket: Socket, callback: (err: string | null, noteId: string | null) => void): void { - const noteId = extractNoteIdFromSocket(socket) - if (!noteId) { - return callback(null, null) - } - Note.parseNoteId(noteId, function (err, id) { - if (err || !id) return callback(err, id) - return callback(null, id) - }) -} - -function buildUserOutData (user): UserSession { - return { - id: user.id, - login: user.login, - userid: user.userid, - photo: user.photo, - color: user.color, - cursor: user.cursor, - name: user.name, - idle: user.idle, - type: user.type - } -} - -function emitOnlineUsers (socket: SocketWithNoteId): void { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const users: UserSession[] = [] - for (const user of note.users.values()) { - if (user) { - users.push(buildUserOutData(user)) - } - } - const out = { - users: users - } - realtime.io.to(noteId).emit('online users', out) -} - -function emitUserStatus (socket: SocketWithNoteId): void { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const user = users.get(socket.id) - if (!user) return - const out = buildUserOutData(user) - socket.broadcast.to(noteId).emit('user status', out) -} - -function emitRefresh (socket: SocketWithNoteId): void { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const out = { - title: note.title, - docmaxlength: config.documentMaxLength, - owner: note.ownerId, - ownerprofile: note.ownerprofile, - lastchangeuser: note.lastchangeuser, - lastchangeuserprofile: note.lastchangeuserprofile, - authors: mapToObject(note.authors), - authorship: note.authorship, - permission: note.permission, - createtime: note.createtime, - updatetime: note.updatetime - } - socket.emit('refresh', out) -} - -function isDuplicatedInSocketQueue (queue: Socket[], socket: Socket): boolean { - for (const sock of queue) { - if (sock && sock.id === socket.id) { - return true - } - } - return false -} - -function clearSocketQueue (queue: Socket[], socket: Socket): void { - for (let i = 0; i < queue.length; i++) { - if (!queue[i] || queue[i].id === socket.id) { - queue.splice(i, 1) - i-- - } - } -} - -function connectNextSocket (): void { - setTimeout(function () { - isConnectionBusy = false - if (connectionSocketQueue.length > 0) { - // Otherwise we get a loop startConnection - failConnection - connectNextSocket - // eslint-disable-next-line @typescript-eslint/no-use-before-define - startConnection(connectionSocketQueue[0]) - } - }, 1) -} - -function failConnection (errorCode: number, errorMessage: string, socket: Socket): void { - logger.error(errorMessage) - // clear error socket in queue - clearSocketQueue(connectionSocketQueue, socket) - connectNextSocket() - // emit error info - socket.emit('info', { - code: errorCode - }) - socket.disconnect(true) -} - -function interruptConnection (socket: Socket, noteId: string, socketId): void { - notes.delete(noteId) - users.delete(socketId) - if (socket) { - clearSocketQueue(connectionSocketQueue, socket) - } else { - connectionSocketQueue.shift() - } - connectNextSocket() -} - -function finishConnection (socket: SocketWithNoteId, noteId: string, socketId: string): void { - // if no valid info provided will drop the client - if (!socket || !notes.get(noteId) || !users.get(socketId)) { - return interruptConnection(socket, noteId, socketId) - } - // check view permission - const note = notes.get(noteId) - if (!note) return - if (getPermission(socket.request.user, note) === Permission.None) { - interruptConnection(socket, noteId, socketId) - return failConnection(403, 'connection forbidden', socket) - } - const user = users.get(socketId) - if (!user) { - logger.warn('Could not find user for socketId ' + socketId) - return - } - if (user.userid) { - // update user color to author color - const author = note.authors.get(user.userid) - if (author) { - const socketIdUser = users.get(socket.id) - if (!socketIdUser) return - user.color = author.color - socketIdUser.color = author.color - users.set(socket.id, user) - } - } - note.users.set(socket.id, user) - note.socks.push(socket) - note.server.addClient(socket) - note.server.setName(socket, user.name) - note.server.setColor(socket, user.color) - - // update user note history - updateHistory(user.userid, note) - - emitOnlineUsers(socket) - emitRefresh(socket) - - // clear finished socket in queue - clearSocketQueue(connectionSocketQueue, socket) - // seek for next socket - connectNextSocket() - - if (config.debug) { - const noteId = socket.noteId - logger.debug(`SERVER connected a client to [${noteId}]:`) - logger.debug(JSON.stringify(user)) - logger.debug(notes) - getStatus(function (data) { - logger.debug(JSON.stringify(data)) - }) - } -} - -function ifMayEdit (socket: SocketWithNoteId, originIsOperation: boolean, callback: (mayEdit: boolean) => void): void { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const mayEdit = (getPermission(socket.request.user, note) >= Permission.Write) - // if user may edit and this is a text operation - if (originIsOperation && mayEdit) { - // save for the last change user id - if (socket.request.user && socket.request.user.logged_in) { - note.lastchangeuser = socket.request.user.id - } else { - note.lastchangeuser = null - } - } - return callback(mayEdit) -} - -function operationCallback (socket: SocketWithNoteId, operation): void { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - let userId: string | null = null - // save authors - if (socket.request.user && socket.request.user.logged_in) { - const user = users.get(socket.id) - if (!user) return - userId = socket.request.user.id - if (!userId) return - const author = note.authors.get(userId) - if (!author) { - Author.findOrCreate({ - where: { - noteId: noteId, - userId: userId - }, - defaults: { - noteId: noteId, - userId: userId, - color: user.color - } - }).then(function ([author, _]) { - if (author) { - note.authors.set(author.userId, { - userid: author.userId, - color: author.color, - photo: user.photo, - name: user.name - }) - } - }).catch(function (err) { - logger.error('operation callback failed: ' + err) - }) - } - if (userId) note.tempUsers.set(userId, Date.now()) - } - // save authorship - use timer here because it's an O(n) complexity algorithm - setImmediate(function () { - note.authorship = Note.updateAuthorshipByOperation(operation, userId, note.authorship) - }) -} - -function startConnection (socket: SocketWithNoteId): void { - if (isConnectionBusy) return - isConnectionBusy = true - - const noteId: string = socket.noteId - if (!noteId) { - return failConnection(404, 'note id not found', socket) - } - - if (!notes.get(noteId)) { - const include = [{ - model: User, - as: 'owner' - }, { - model: User, - as: 'lastchangeuser' - }, { - model: Author, - as: 'authors', - include: [{ - model: User, - as: 'user' - }] - }] - - Note.findOne({ - where: { - id: noteId - }, - include: include - }).then(function (note) { - if (!note) { - return failConnection(404, 'note not found', socket) - } - const ownerId = note.ownerId - const ownerprofile = note.owner ? PhotoProfile.fromUser(note.owner) : null - - const lastchangeuser = note.lastchangeuserId - const lastchangeuserprofile = note.lastchangeuser ? PhotoProfile.fromUser(note.lastchangeuser) : null - - const body = note.content - const createtime = note.createdAt - const updatetime = note.lastchangeAt - const server = new EditorSocketIOServer(body, [], noteId, ifMayEdit, operationCallback) - - const authors = new Map() - for (const author of note.authors) { - const profile = PhotoProfile.fromUser(author.user) - if (profile) { - authors.set(author.userId, { - userid: author.userId, - color: author.color, - photo: profile.photo, - name: profile.name - }) - } - } - - notes.set(noteId, { - id: noteId, - alias: note.alias, - title: note.title, - ownerId: ownerId, - ownerprofile: ownerprofile, - permission: note.permission, - lastchangeuser: lastchangeuser, - lastchangeuserprofile: lastchangeuserprofile, - socks: [], - users: new Map(), - tempUsers: new Map(), - createtime: moment(createtime).valueOf(), - updatetime: moment(updatetime).valueOf(), - server: server, - authors: authors, - authorship: note.authorship - }) - - return finishConnection(socket, noteId, socket.id) - }).catch(function (err) { - return failConnection(500, err, socket) - }) - } else { - return finishConnection(socket, noteId, socket.id) - } -} - -isConnectionBusy = false -isDisconnectBusy = false - -function disconnect (socket: SocketWithNoteId): void { - if (isDisconnectBusy) return - isDisconnectBusy = true - - logger.debug('SERVER disconnected a client') - logger.debug(JSON.stringify(users.get(socket.id))) - - if (users.get(socket.id)) { - users.delete(socket.id) - } - const noteId = socket.noteId - const note = notes.get(noteId) - if (note) { - // delete user in users - if (note.users.get(socket.id)) { - note.users.delete(socket.id) - } - // remove sockets in the note socks - let index - do { - index = note.socks.indexOf(socket) - if (index !== -1) { - note.socks.splice(index, 1) - } - } while (index !== -1) - // remove note in notes if no user inside - if (note.users.size <= 0) { - if (note.server.isDirty) { - updateNote(note, function (err, _) { - if (err) return logger.error('disconnect note failed: ' + err) - // clear server before delete to avoid memory leaks - note.server.document = '' - note.server.operations = [] - delete note.server - notes.delete(noteId) - if (config.debug) { - logger.debug(notes) - getStatus(function (data) { - logger.debug(JSON.stringify(data)) - }) - } - }) - } else { - delete note.server - notes.delete(noteId) - } - } - } - emitOnlineUsers(socket) - - // clear finished socket in queue - clearSocketQueue(disconnectSocketQueue, socket) - // seek for next socket - isDisconnectBusy = false - if (disconnectSocketQueue.length > 0) { - disconnect(disconnectSocketQueue[0]) - } - - if (config.debug) { - logger.debug(notes) - getStatus(function (data) { - logger.debug(JSON.stringify(data)) - }) - } -} - -// clean when user not in any rooms or user not in connected list -setInterval(function () { - for (const [key, user] of users) { - let socket = realtime.io.sockets.connected[key] as SocketWithNoteId - if ((!socket && user) || - (socket && (!socket.rooms || Object.keys(socket.rooms).length <= 0))) { - logger.debug(`cleaner found redundant user: ${key}`) - if (!socket) { - socket = { - id: key - } as SocketWithNoteId - } - disconnectSocketQueue.push(socket) - disconnect(socket) - } - } -}, 60000) - -function updateUserData (socket: Socket, user): void { - // retrieve user data from passport - if (socket.request.user && socket.request.user.logged_in) { - const profile = PhotoProfile.fromUser(socket.request.user) - user.photo = profile?.photo - user.name = profile?.name - user.userid = socket.request.user.id - user.login = true - } else { - user.userid = null - user.name = 'Guest ' + chance.last() - user.login = false - } -} - -function connection (socket: SocketWithNoteId): void { - if (realtime.state !== State.Running) return - parseNoteIdFromSocket(socket, function (err, noteId) { - if (err) { - return failConnection(500, err, socket) - } - if (!noteId) { - return failConnection(404, 'note id not found', socket) - } - - if (isDuplicatedInSocketQueue(connectionSocketQueue, socket)) return - - // store noteId in this socket session - socket.noteId = noteId - - // initialize user data - // random color - let color = randomcolor() - // make sure color not duplicated or reach max random count - const note = notes.get(noteId) - if (note) { - let randomcount = 0 - const maxrandomcount = 10 - let found = false - do { - for (const user of note.users.values()) { - if (user.color === color) { - found = true - } - } - if (found) { - color = randomcolor() - randomcount++ - } - } while (found && randomcount < maxrandomcount) - } - // create user data - users.set(socket.id, { - id: socket.id, - address: socket.handshake.headers['x-forwarded-for'] || socket.handshake.address, - 'user-agent': socket.handshake.headers['user-agent'], - color: color, - cursor: undefined, - login: false, - userid: null, - name: null, - idle: false, - type: '', - photo: '' - }) - updateUserData(socket, users.get(socket.id)) - - // start connection - connectionSocketQueue.push(socket) - startConnection(socket) - }) - - // received client refresh request - socket.on('refresh', function () { - emitRefresh(socket) - }) - - // received user status - socket.on('user status', function (data) { - const noteId = socket.noteId - const user = users.get(socket.id) - if (!noteId || !notes.get(noteId) || !user) return - logger.debug(`SERVER received [${noteId}] user status from [${socket.id}]: ${JSON.stringify(data)}`) - if (data) { - user.idle = data.idle - user.type = data.type - } - emitUserStatus(socket) - }) - - // received note permission change request - socket.on('permission', function (permission) { - // need login to do more actions - if (socket.request.user && socket.request.user.logged_in) { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - // Only owner can change permission - if (getPermission(socket.request.user, note) === Permission.Owner) { - if (permission === 'freely' && !config.allowAnonymous && !config.allowAnonymousEdits) return - note.permission = permission - Note.update({ - permission: permission - }, { - where: { - id: noteId - } - }).then(function (count) { - if (!count) { - return - } - const out = { - permission: permission - } - realtime.io.to(note.id).emit('permission', out) - for (let i = 0, l = note.socks.length; i < l; i++) { - const sock = note.socks[i] - if (typeof sock !== 'undefined' && sock) { - // check view permission - if (getPermission(sock.request.user, note) === Permission.None) { - sock.emit('info', { - code: 403 - }) - setTimeout(function () { - sock.disconnect(true) - }, 0) - } - } - } - }).catch(function (err) { - return logger.error('update note permission failed: ' + err) - }) - } - } - }) - - // delete a note - socket.on('delete', function () { - // need login to do more actions - if (socket.request.user && socket.request.user.logged_in) { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - // Only owner can delete note - if (getPermission(socket.request.user, note) === Permission.Owner) { - Note.destroy({ - where: { - id: noteId - } - }).then(function (count) { - if (!count) return - for (let i = 0, l = note.socks.length; i < l; i++) { - const sock = note.socks[i] - if (typeof sock !== 'undefined' && sock) { - sock.emit('delete') - setTimeout(function () { - sock.disconnect(true) - }, 0) - } - } - }).catch(function (err) { - return logger.error('delete note failed: ' + err) - }) - } - } - }) - - // reveiced when user logout or changed - socket.on('user changed', function () { - logger.info('user changed') - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const user = note.users.get(socket.id) - if (!user) return - updateUserData(socket, user) - emitOnlineUsers(socket) - }) - - // received sync of online users request - socket.on('online users', function () { - const noteId = socket.noteId - if (!noteId) return - const note = notes.get(noteId) - if (!note) return - const users: UserSession[] = [] - for (const user of note.users.values()) { - if (user) { - users.push(buildUserOutData(user)) - } - } - const out = { - users: users - } - socket.emit('online users', out) - }) - - // check version - socket.on('version', function () { - socket.emit('version', { - version: config.fullversion, - minimumCompatibleVersion: config.minimumCompatibleVersion - }) - }) - - // received cursor focus - socket.on('cursor focus', function (data) { - const noteId = socket.noteId - const user = users.get(socket.id) - if (!noteId || !notes.get(noteId) || !user) return - user.cursor = data - const out = buildUserOutData(user) - socket.broadcast.to(noteId).emit('cursor focus', out) - }) - - // received cursor activity - socket.on('cursor activity', function (data: CodeMirror.Position) { - const noteId = socket.noteId - const user = users.get(socket.id) - if (!noteId || !notes.get(noteId) || !user) return - user.cursor = data - const out = buildUserOutData(user) - socket.broadcast.to(noteId).emit('cursor activity', out) - }) - - // received cursor blur - socket.on('cursor blur', function () { - const noteId = socket.noteId - const user = users.get(socket.id) - if (!noteId || !notes.get(noteId) || !user) return - user.cursor = undefined - const out = { - id: socket.id - } - socket.broadcast.to(noteId).emit('cursor blur', out) - }) - - // when a new client disconnect - socket.on('disconnect', function () { - if (isDuplicatedInSocketQueue(disconnectSocketQueue, socket)) return - disconnectSocketQueue.push(socket) - disconnect(socket) - }) -} - -export { realtime } diff --git a/old_src/lib/response.ts b/old_src/lib/response.ts deleted file mode 100644 index f01d576ec..000000000 --- a/old_src/lib/response.ts +++ /dev/null @@ -1,184 +0,0 @@ -'use strict' -import { config } from './config' -import { Note, User } from './models' - -import fs from 'fs' - -import { logger } from './logger' - -import * as NoteUtils from './web/note/util' - -import { errors } from './errors' - -import path from 'path' - -import request from 'request' - -function showIndex (req, res, _): void { - const authStatus = req.isAuthenticated() - const deleteToken = '' - - const data = { - signin: authStatus, - infoMessage: req.flash('info'), - errorMessage: req.flash('error'), - imprint: fs.existsSync(path.join(config.docsPath, 'imprint.md')), - privacyStatement: fs.existsSync(path.join(config.docsPath, 'privacy.md')), - termsOfUse: fs.existsSync(path.join(config.docsPath, 'terms-of-use.md')), - deleteToken: deleteToken - } - - if (authStatus) { - User.findOne({ - where: { - id: req.user.id - } - }).then(function (user: User | null) { - if (user) { - data.deleteToken = user.deleteToken - res.render('index.ejs', data) - } - }) - } else { - res.render('index.ejs', data) - } -} - -function githubActionGist (req, res, note: Note): void { - const code = req.query.code - const state = req.query.state - if (!code || !state) { - return errors.errorForbidden(res) - } else { - // This is the way the github api works, therefore we can't change it to camelcase - const data = { - // eslint-disable-next-line @typescript-eslint/camelcase - client_id: config.github.clientID, - // eslint-disable-next-line @typescript-eslint/camelcase - client_secret: config.github.clientSecret, - code: code, - state: state - } - const authUrl = 'https://github.com/login/oauth/access_token' - request({ - url: authUrl, - method: 'POST', - json: data - }, function (error, httpResponse, body) { - if (!error && httpResponse.statusCode === 200) { - const accessToken = body.access_token - if (accessToken) { - const content = note.content - const title = Note.decodeTitle(note.title) - const filename = title.replace('/', ' ') + '.md' - const gist = { - files: {} - } - gist.files[filename] = { - content: content - } - const gistUrl = 'https://api.github.com/gists' - request({ - url: gistUrl, - headers: { - 'User-Agent': 'CodiMD', - Authorization: 'token ' + accessToken - }, - method: 'POST', - json: gist - }, function (error, httpResponse, body) { - if (!error && httpResponse.statusCode === 201) { - res.setHeader('referer', '') - res.redirect(body.html_url) - } else { - errors.errorForbidden(res) - } - }) - } else { - errors.errorForbidden(res) - } - } else { - errors.errorForbidden(res) - } - }) - } -} - -function githubActions (req, res, _): void { - const noteId = req.params.noteId - NoteUtils.findNoteOrCreate(req, res, function (note: Note) { - const action = req.params.action - switch (action) { - case 'gist': - githubActionGist(req, res, note) - break - default: - res.redirect(config.serverURL + '/' + noteId) - break - } - }) -} - -function gitlabActionProjects (req, res, _): void { - if (req.isAuthenticated()) { - User.findOne({ - where: { - id: req.user.id - } - }).then(function (user) { - if (!user) { - errors.errorNotFound(res) - return - } - class GitlabReturn { - baseURL; - version; - accesstoken; - profileid; - projects; - } - const ret: GitlabReturn = new GitlabReturn() - ret.baseURL = config.gitlab.baseURL - ret.version = config.gitlab.version - ret.accesstoken = user.accessToken - ret.profileid = user.profileid - request( - config.gitlab.baseURL + '/api/' + config.gitlab.version + '/projects?membership=yes&per_page=100&access_token=' + user.accessToken, - function (error, httpResponse, body) { - if (!error && httpResponse.statusCode === 200) { - ret.projects = JSON.parse(body) - return res.send(ret) - } else { - return res.send(ret) - } - } - ) - }).catch(function (err) { - logger.error('gitlab action projects failed: ' + err) - errors.errorInternalError(res) - }) - } else { - errors.errorForbidden(res) - } -} - -function gitlabActions (req, res, _): void { - const noteId = req.params.noteId - NoteUtils.findNoteOrCreate(req, res, function (note) { - const action = req.params.action - switch (action) { - case 'projects': - gitlabActionProjects(req, res, note) - break - default: - res.redirect(config.serverURL + '/' + noteId) - break - } - }) -} - -export const response = { - showIndex: showIndex, - githubActions: githubActions, - gitlabActions: gitlabActions -} diff --git a/old_src/lib/utils/PhotoProfile.ts b/old_src/lib/utils/PhotoProfile.ts deleted file mode 100644 index 85c534dc8..000000000 --- a/old_src/lib/utils/PhotoProfile.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { generateAvatarURL } from '../letter-avatars' -import { logger } from '../logger' -import { PassportProfile, ProviderEnum } from '../web/auth/utils' -import { User } from '../models' - -export class PhotoProfile { - name: string - photo: string - biggerphoto: string - - static fromUser (user: User): PhotoProfile | null { - if (!user) return null - if (user.profile) return PhotoProfile.fromJSON(user.profile) - if (user.email) return PhotoProfile.fromEmail(user.email) - return null - } - - private static fromJSON (jsonProfile: string): PhotoProfile | null { - try { - const parsedProfile: PassportProfile = JSON.parse(jsonProfile) - return { - name: parsedProfile.displayName || parsedProfile.username, - photo: PhotoProfile.generatePhotoURL(parsedProfile, false), - biggerphoto: PhotoProfile.generatePhotoURL(parsedProfile, true) - } - } catch (err) { - logger.error(err) - return null - } - } - - private static fromEmail (email: string): PhotoProfile { - return { - name: email.substring(0, email.lastIndexOf('@')), - photo: generateAvatarURL('', email, false), - biggerphoto: generateAvatarURL('', email, true) - } - } - - private static generatePhotoURL (profile: PassportProfile, bigger: boolean): string { - let photo: string - switch (profile.provider) { - case ProviderEnum.facebook: - photo = 'https://graph.facebook.com/' + profile.id + '/picture' - if (bigger) { - photo += '?width=400' - } else { - photo += '?width=96' - } - break - case ProviderEnum.twitter: - photo = 'https://twitter.com/' + profile.username + '/profile_image' - if (bigger) { - photo += '?size=original' - } else { - photo += '?size=bigger' - } - break - case ProviderEnum.github: - photo = 'https://avatars.githubusercontent.com/u/' + profile.id - if (bigger) { - photo += '?s=400' - } else { - photo += '?s=96' - } - break - case ProviderEnum.gitlab: - photo = profile.avatarUrl - if (photo) { - if (bigger) { - photo = photo.replace(/(\?s=)\d*$/i, '$1400') - } else { - photo = photo.replace(/(\?s=)\d*$/i, '$196') - } - } else { - photo = generateAvatarURL(profile.username) - } - break - case ProviderEnum.dropbox: - photo = generateAvatarURL('', profile.emails[0], bigger) - break - case ProviderEnum.google: - photo = profile.photos[0].value - if (bigger) { - photo = photo.replace(/(\?sz=)\d*$/i, '$1400') - } else { - photo = photo.replace(/(\?sz=)\d*$/i, '$196') - } - break - case ProviderEnum.ldap: - photo = generateAvatarURL(profile.username, profile.emails[0], bigger) - break - case ProviderEnum.saml: - photo = generateAvatarURL(profile.username, profile.emails[0], bigger) - break - default: - photo = generateAvatarURL(profile.username) - break - } - return photo - } -} diff --git a/old_src/lib/utils/functions.ts b/old_src/lib/utils/functions.ts deleted file mode 100644 index 1ddac94e3..000000000 --- a/old_src/lib/utils/functions.ts +++ /dev/null @@ -1,96 +0,0 @@ -import fs from 'fs' -import { config } from '../config' -import { logger } from '../logger' -import { Revision } from '../models' -import { realtime, State } from '../realtime' - -/* -Converts a map from string to something into a plain JS object for transmitting via a websocket - */ -export function mapToObject (map: Map): object { - return Array.from(map).reduce((obj, [key, value]) => { - obj[key] = value - return obj - }, {}) -} - -export function getImageMimeType (imagePath: string): string | undefined { - const fileExtension = /[^.]+$/.exec(imagePath) - switch (fileExtension?.[0]) { - case 'bmp': - return 'image/bmp' - case 'gif': - return 'image/gif' - case 'jpg': - case 'jpeg': - return 'image/jpeg' - case 'png': - return 'image/png' - case 'tiff': - return 'image/tiff' - case 'svg': - return 'image/svg+xml' - default: - return undefined - } -} - -// [Postgres] Handling NULL bytes -// https://github.com/sequelize/sequelize/issues/6485 -export function stripNullByte (value: string): string { - value = '' + value - // eslint-disable-next-line no-control-regex - return value ? value.replace(/\u0000/g, '') : value -} - -export function processData (data: T, _default: T, process?: (T) => T): T | undefined { - if (data === undefined) return undefined - else if (data === null) return _default - else if (process) return process(data) - else return data -} - -export function handleTermSignals (io): void { - if (realtime.state === State.Starting) { - process.exit(0) - } - if (realtime.state === State.Stopping) { - // The function is already running. Do nothing - return - } - logger.info('CodiMD has been killed by signal, try to exit gracefully...') - realtime.state = State.Stopping - // disconnect all socket.io clients - Object.keys(io.sockets.sockets).forEach(function (key) { - const socket = io.sockets.sockets[key] - // notify client server going into maintenance status - socket.emit('maintenance') - setTimeout(function () { - socket.disconnect(true) - }, 0) - }) - if (config.path) { - // ToDo: add a proper error handler - // eslint-disable-next-line @typescript-eslint/no-empty-function - fs.unlink(config.path, (_) => { - }) - } - const checkCleanTimer = setInterval(function () { - if (realtime.isReady()) { - Revision.checkAllNotesRevision(function (err, notes) { - if (err) { - return logger.error('Error while writing changes to database. We will abort after trying for 30 seconds.\n' + err) - } - if (!notes || notes.length <= 0) { - clearInterval(checkCleanTimer) - return process.exit(0) - } - }) - } - }, 500) - setTimeout(function () { - logger.error('Failed to write changes to database. Aborting') - clearInterval(checkCleanTimer) - process.exit(1) - }, 30000) -} diff --git a/old_src/lib/web/auth/dropbox/index.ts b/old_src/lib/web/auth/dropbox/index.ts deleted file mode 100644 index a6f4d750e..000000000 --- a/old_src/lib/web/auth/dropbox/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { NextFunction, Request, Response, Router } from 'express' -import passport from 'passport' -import { Strategy as DropboxStrategy } from 'passport-dropbox-oauth2' -import { config } from '../../../config' -import { User } from '../../../models' -import { AuthMiddleware } from '../interface' -import { passportGeneralCallback } from '../utils' - -export const dropboxAuth = Router() - -export const DropboxMiddleware: AuthMiddleware = { - getMiddleware (): Router { - passport.use(new DropboxStrategy({ - apiVersion: '2', - clientID: config.dropbox.clientID, - clientSecret: config.dropbox.clientSecret, - callbackURL: config.serverURL + '/auth/dropbox/callback' - }, ( - accessToken: string, - refreshToken: string, - profile, - done: (err?: Error | null, user?: User) => void - ): void => { - // the Dropbox plugin wraps the email addresses in an object - // see https://github.com/florianheinemann/passport-dropbox-oauth2/blob/master/lib/passport-dropbox-oauth2/strategy.js#L146 - profile.emails = profile.emails.map(element => element.value) - passportGeneralCallback(accessToken, refreshToken, profile, done) - })) - - dropboxAuth.get('/auth/dropbox', function (req: Request, res: Response, next: NextFunction) { - passport.authenticate('dropbox-oauth2')(req, res, next) - }) - dropboxAuth.get('/auth/dropbox/callback', - passport.authenticate('dropbox-oauth2', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - return dropboxAuth - } -} diff --git a/old_src/lib/web/auth/email/index.ts b/old_src/lib/web/auth/email/index.ts deleted file mode 100644 index e153c9fc4..000000000 --- a/old_src/lib/web/auth/email/index.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { NextFunction, Request, Response, Router } from 'express' -import passport from 'passport' -import { Strategy as LocalStrategy } from 'passport-local' -import validator from 'validator' -import { config } from '../../../config' -import { errors } from '../../../errors' -import { logger } from '../../../logger' -import { User } from '../../../models' -import { urlencodedParser } from '../../utils' -import { AuthMiddleware } from '../interface' - -const emailAuth = Router() - -export const EmailMiddleware: AuthMiddleware = { - getMiddleware (): Router { - passport.use(new LocalStrategy({ - usernameField: 'email' - }, function (email: string, password: string, done) { - if (!validator.isEmail(email)) return done(null, false) - User.findOne({ - where: { - email: email - } - }).then(function (user: User) { - if (!user) return done(null, false) - user.verifyPassword(password).then(verified => { - if (verified) { - return done(null, user) - } else { - logger.warn('invalid password given for %s', user.email) - return done(null, false) - } - }) - }).catch(function (err: Error) { - logger.error(err) - return done(err) - }) - })) - - if (config.allowEmailRegister) { - emailAuth.post('/register', urlencodedParser, function (req: Request, res: Response, _: NextFunction) { - if (!req.body.email || !req.body.password) { - errors.errorBadRequest(res) - return - } - if (!validator.isEmail(req.body.email)) { - errors.errorBadRequest(res) - return - } - User.findOrCreate({ - where: { - email: req.body.email - }, - defaults: { - password: req.body.password - } - }).then(function ([user, created]: [User, boolean]) { - if (user) { - if (created) { - logger.debug('user registered: ' + user.id) - req.flash('info', "You've successfully registered, please signin.") - return res.redirect(config.serverURL + '/') - } else { - logger.debug('user found: ' + user.id) - req.flash('error', 'This email has been used, please try another one.') - return res.redirect(config.serverURL + '/') - } - } - req.flash('error', 'Failed to register your account, please try again.') - return res.redirect(config.serverURL + '/') - }).catch(function (err) { - logger.error('auth callback failed: ' + err) - errors.errorInternalError(res) - }) - }) - } - - emailAuth.post('/login', urlencodedParser, function (req: Request, res: Response, next: NextFunction) { - if (!req.body.email || !req.body.password) { - errors.errorBadRequest(res) - return - } - if (!validator.isEmail(req.body.email)) { - errors.errorBadRequest(res) - return - } - passport.authenticate('local', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/', - failureFlash: 'Invalid email or password.' - })(req, res, next) - }) - return emailAuth - } -} diff --git a/old_src/lib/web/auth/facebook/index.ts b/old_src/lib/web/auth/facebook/index.ts deleted file mode 100644 index a516a32e8..000000000 --- a/old_src/lib/web/auth/facebook/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import passport from 'passport' -import { config } from '../../../config' -import { AuthMiddleware } from '../interface' -import { Router } from 'express' -import { passportGeneralCallback } from '../utils' -import { Strategy as FacebookStrategy } from 'passport-facebook' - -export const FacebookMiddleware: AuthMiddleware = { - getMiddleware (): Router { - const facebookAuth = Router() - passport.use(new FacebookStrategy({ - clientID: config.facebook.clientID, - clientSecret: config.facebook.clientSecret, - callbackURL: config.serverURL + '/auth/facebook/callback' - }, passportGeneralCallback - )) - - facebookAuth.get('/auth/facebook', function (req, res, next) { - passport.authenticate('facebook')(req, res, next) - }) - - // facebook auth callback - facebookAuth.get('/auth/facebook/callback', - passport.authenticate('facebook', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - return facebookAuth - } -} diff --git a/old_src/lib/web/auth/github/index.ts b/old_src/lib/web/auth/github/index.ts deleted file mode 100644 index 15d2b67aa..000000000 --- a/old_src/lib/web/auth/github/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import { Strategy as GithubStrategy } from 'passport-github' -import { config } from '../../../config' -import { response } from '../../../response' -import { AuthMiddleware } from '../interface' -import { passportGeneralCallback } from '../utils' - -export const GithubMiddleware: AuthMiddleware = { - getMiddleware (): Router { - const githubAuth = Router() - - passport.use(new GithubStrategy({ - clientID: config.github.clientID, - clientSecret: config.github.clientSecret, - callbackURL: config.serverURL + '/auth/github/callback' - }, passportGeneralCallback)) - - githubAuth.get('/auth/github', function (req, res, next) { - passport.authenticate('github')(req, res, next) - }) - - // github auth callback - githubAuth.get('/auth/github/callback', - passport.authenticate('github', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - // github callback actions - githubAuth.get('/auth/github/callback/:noteId/:action', response.githubActions) - - return githubAuth - } -} diff --git a/old_src/lib/web/auth/gitlab/index.ts b/old_src/lib/web/auth/gitlab/index.ts deleted file mode 100644 index adeec8ebe..000000000 --- a/old_src/lib/web/auth/gitlab/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import { Strategy as GitlabStrategy } from 'passport-gitlab2' -import { config } from '../../../config' -import { response } from '../../../response' -import { AuthMiddleware } from '../interface' -import { passportGeneralCallback } from '../utils' - -export const GitlabMiddleware: AuthMiddleware = - { - getMiddleware (): Router { - const gitlabAuth = module.exports = Router() - - passport.use(new GitlabStrategy({ - baseURL: config.gitlab.baseURL, - clientID: config.gitlab.clientID, - clientSecret: config.gitlab.clientSecret, - scope: config.gitlab.scope, - callbackURL: config.serverURL + '/auth/gitlab/callback' - }, passportGeneralCallback)) - - gitlabAuth.get('/auth/gitlab', function (req, res, next) { - passport.authenticate('gitlab')(req, res, next) - }) - - // gitlab auth callback - gitlabAuth.get('/auth/gitlab/callback', - passport.authenticate('gitlab', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - if (!config.gitlab.scope || config.gitlab.scope === 'api' - ) { - // gitlab callback actions - gitlabAuth.get('/auth/gitlab/callback/:noteId/:action', response.gitlabActions) - } - return gitlabAuth - } - } diff --git a/old_src/lib/web/auth/google/index.ts b/old_src/lib/web/auth/google/index.ts deleted file mode 100644 index 165d1f7e5..000000000 --- a/old_src/lib/web/auth/google/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import * as Google from 'passport-google-oauth20' -import { config } from '../../../config' -import { AuthMiddleware } from '../interface' -import { passportGeneralCallback } from '../utils' - -const googleAuth = Router() - -export const GoogleMiddleware: AuthMiddleware = { - getMiddleware: function (): Router { - passport.use(new Google.Strategy({ - clientID: config.google.clientID, - clientSecret: config.google.clientSecret, - callbackURL: config.serverURL + '/auth/google/callback', - userProfileURL: 'https://www.googleapis.com/oauth2/v3/userinfo' - }, ( - accessToken: string, - refreshToken: string, - profile, - done) => { - /* - This ugly hack is neccessary, because the Google Strategy wants a done-callback with an err as Error | null | undefined - but the passportGeneralCallback (and every other PassportStrategy) want a done-callback with err as string | Error | undefined - Note the absence of null. The lambda converts all `null` to `undefined`. - */ - passportGeneralCallback(accessToken, refreshToken, profile, (err?, user?) => { - done(err === null ? undefined : err, user) - }) - })) - - googleAuth.get('/auth/google', function (req, res, next) { - const authOpts = { scope: ['profile'], hostedDomain: config.google.hostedDomain } - passport.authenticate('google', authOpts)(req, res, next) - }) - googleAuth.get('/auth/google/callback', - passport.authenticate('google', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - return googleAuth - } -} diff --git a/old_src/lib/web/auth/index.ts b/old_src/lib/web/auth/index.ts deleted file mode 100644 index f79e99eda..000000000 --- a/old_src/lib/web/auth/index.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Request, Response, Router } from 'express' -import passport from 'passport' -import { config } from '../../config' -import { logger } from '../../logger' -import { User } from '../../models' -import { FacebookMiddleware } from './facebook' -import { TwitterMiddleware } from './twitter' -import { GithubMiddleware } from './github' -import { GitlabMiddleware } from './gitlab' -import { DropboxMiddleware } from './dropbox' -import { GoogleMiddleware } from './google' -import { LdapMiddleware } from './ldap' -import { SamlMiddleware } from './saml' -import { OAuth2Middleware } from './oauth2' -import { EmailMiddleware } from './email' -import { OPenIDMiddleware } from './openid' - -const AuthRouter = Router() - -// serialize and deserialize -passport.serializeUser(function (user: User, done) { - logger.info('serializeUser: ' + user.id) - return done(null, user.id) -}) - -passport.deserializeUser(function (id: string, done) { - User.findOne({ - where: { - id: id - } - }).then(function (user) { - // Don't die on non-existent user - if (user == null) { - // The extra object with message doesn't exits in @types/passport - return done(null, false) // , { message: 'Invalid UserID' }) - } - - logger.info('deserializeUser: ' + user.id) - return done(null, user) - }).catch(function (err) { - logger.error(err) - return done(err, null) - }) -}) - -if (config.isFacebookEnable) AuthRouter.use(FacebookMiddleware.getMiddleware()) -if (config.isTwitterEnable) AuthRouter.use(TwitterMiddleware.getMiddleware()) -if (config.isGitHubEnable) AuthRouter.use(GithubMiddleware.getMiddleware()) -if (config.isGitLabEnable) AuthRouter.use(GitlabMiddleware.getMiddleware()) -if (config.isDropboxEnable) AuthRouter.use(DropboxMiddleware.getMiddleware()) -if (config.isGoogleEnable) AuthRouter.use(GoogleMiddleware.getMiddleware()) -if (config.isLDAPEnable) AuthRouter.use(LdapMiddleware.getMiddleware()) -if (config.isSAMLEnable) AuthRouter.use(SamlMiddleware.getMiddleware()) -if (config.isOAuth2Enable) AuthRouter.use(OAuth2Middleware.getMiddleware()) -if (config.isEmailEnable) AuthRouter.use(EmailMiddleware.getMiddleware()) -if (config.isOpenIDEnable) AuthRouter.use(OPenIDMiddleware.getMiddleware()) - -// logout -AuthRouter.get('/logout', function (req: Request, res: Response) { - if (config.debug && req.isAuthenticated()) { - if (req.user !== undefined) { - logger.debug('user logout: ' + req.user.id) - } - } - req.logout() - res.redirect(config.serverURL + '/') -}) - -export { AuthRouter } diff --git a/old_src/lib/web/auth/interface.ts b/old_src/lib/web/auth/interface.ts deleted file mode 100644 index d6a7fade5..000000000 --- a/old_src/lib/web/auth/interface.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Router } from 'express' - -export interface AuthMiddleware { - getMiddleware (): Router; -} diff --git a/old_src/lib/web/auth/ldap/index.ts b/old_src/lib/web/auth/ldap/index.ts deleted file mode 100644 index 66b885ebf..000000000 --- a/old_src/lib/web/auth/ldap/index.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import LDAPStrategy from 'passport-ldapauth' - -import { config } from '../../../config' -import { errors } from '../../../errors' -import { logger } from '../../../logger' -import { User } from '../../../models' -import { urlencodedParser } from '../../utils' -import { AuthMiddleware } from '../interface' - -export const LdapMiddleware: AuthMiddleware = { - getMiddleware (): Router { - const LdapAuth = Router() - - passport.use(new LDAPStrategy({ - server: { - url: config.ldap.url || null, - bindDN: config.ldap.bindDn || null, - bindCredentials: config.ldap.bindCredentials || null, - searchBase: config.ldap.searchBase || null, - searchFilter: config.ldap.searchFilter || null, - searchAttributes: config.ldap.searchAttributes || null, - tlsOptions: config.ldap.tlsOptions || null, - starttls: config.ldap.starttls || null - } - }, function (user, done) { - let uuid = user.uidNumber || user.uid || user.sAMAccountName || undefined - if (config.ldap.useridField && user[config.ldap.useridField]) { - uuid = user[config.ldap.useridField] - } - - if (typeof uuid === 'undefined') { - throw new Error('Could not determine UUID for LDAP user. Check that ' + - 'either uidNumber, uid or sAMAccountName is set in your LDAP directory ' + - 'or use another unique attribute and configure it using the ' + - '"useridField" option in ldap settings.') - } - - let username = uuid - if (config.ldap.usernameField && user[config.ldap.usernameField]) { - username = user[config.ldap.usernameField] - } - - const profile = { - id: 'LDAP-' + uuid, - username: username, - displayName: user.displayName, - emails: user.mail ? Array.isArray(user.mail) ? user.mail : [user.mail] : [], - avatarUrl: null, - profileUrl: null, - provider: 'ldap' - } - const stringifiedProfile = JSON.stringify(profile) - User.findOrCreate({ - where: { - profileid: profile.id.toString() - }, - defaults: { - profile: stringifiedProfile - } - }).then(function ([user, _]) { - if (user) { - let needSave = false - if (user.profile !== stringifiedProfile) { - user.profile = stringifiedProfile - needSave = true - } - if (needSave) { - user.save().then(function () { - logger.debug(`user login: ${user.id}`) - return done(null, user) - }) - } else { - logger.debug(`user login: ${user.id}`) - return done(null, user) - } - } - }).catch(function (err) { - logger.error('ldap auth failed: ' + err) - return done(err, null) - }) - })) - - LdapAuth.post('/auth/ldap', urlencodedParser, function (req, res, next) { - if (!req.body.username || !req.body.password) return errors.errorBadRequest(res) - passport.authenticate('ldapauth', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/', - failureFlash: true - })(req, res, next) - }) - - return LdapAuth - } -} diff --git a/old_src/lib/web/auth/oauth2/index.ts b/old_src/lib/web/auth/oauth2/index.ts deleted file mode 100644 index 8aa1d8f8d..000000000 --- a/old_src/lib/web/auth/oauth2/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' - -import { OAuth2CustomStrategy } from './oauth2-custom-strategy' -import { config } from '../../../config' -import { passportGeneralCallback } from '../utils' -import { AuthMiddleware } from '../interface' - -export const OAuth2Middleware: AuthMiddleware = { - getMiddleware (): Router { - const OAuth2Auth = Router() - - passport.use(new OAuth2CustomStrategy({ - authorizationURL: config.oauth2.authorizationURL, - tokenURL: config.oauth2.tokenURL, - clientID: config.oauth2.clientID, - clientSecret: config.oauth2.clientSecret, - callbackURL: config.serverURL + '/auth/oauth2/callback', - userProfileURL: config.oauth2.userProfileURL, - scope: config.oauth2.scope, - state: true - }, passportGeneralCallback)) - - OAuth2Auth.get('/auth/oauth2', passport.authenticate('oauth2')) - - // github auth callback - OAuth2Auth.get('/auth/oauth2/callback', - passport.authenticate('oauth2', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - return OAuth2Auth - } -} diff --git a/old_src/lib/web/auth/oauth2/oauth2-custom-strategy.ts b/old_src/lib/web/auth/oauth2/oauth2-custom-strategy.ts deleted file mode 100644 index 28b3c244c..000000000 --- a/old_src/lib/web/auth/oauth2/oauth2-custom-strategy.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { InternalOAuthError, Strategy as OAuth2Strategy } from 'passport-oauth2' -import { config } from '../../../config' -import { PassportProfile, ProviderEnum } from '../utils' -import { logger } from '../../../logger' - -function extractProfileAttribute (data, path: string): string { - // can handle stuff like `attrs[0].name` - const pathArray = path.split('.') - for (const segment of pathArray) { - const regex = /([\d\w]+)\[(.*)\]/ - const m = regex.exec(segment) - data = m ? data[m[1]][m[2]] : data[segment] - } - return data -} - -function parseProfile (data): Partial { - const username = extractProfileAttribute(data, config.oauth2.userProfileUsernameAttr) - let displayName: string | undefined - try { - // This may fail if the config.oauth2.userProfileDisplayNameAttr is undefined, - // or it is foo.bar and data["foo"] is undefined. - displayName = extractProfileAttribute(data, config.oauth2.userProfileDisplayNameAttr) - } catch (e) { - displayName = undefined - logger.debug('\'id_token[%s]\' is undefined. Setting \'displayName\' to \'undefined\'.\n%s', config.oauth2.userProfileDisplayNameAttr, e.message) - } - - const emails: string[] = [] - try { - const email = extractProfileAttribute(data, config.oauth2.userProfileEmailAttr) - if (email !== undefined) { - emails.push(email) - } else { - logger.debug('\'id_token[%s]\' is undefined. Setting \'emails\' to [].', config.oauth2.userProfileEmailAttr) - } - } catch (e) { - logger.debug('\'id_token[%s]\' is undefined. Setting \'emails\' to [].\n%s', config.oauth2.userProfileEmailAttr, e.message) - } - - return { - id: username, - username: username, - displayName: displayName, - emails: emails - } -} - -class OAuth2CustomStrategy extends OAuth2Strategy { - private readonly _userProfileURL: string; - - constructor (options, verify) { - options.customHeaders = options.customHeaders || {} - super(options, verify) - this.name = 'oauth2' - this._userProfileURL = options.userProfileURL - this._oauth2.useAuthorizationHeaderforGET(true) - } - - userProfile (accessToken, done): void { - this._oauth2.get(this._userProfileURL, accessToken, function (err, body, _) { - let json - - if (err) { - return done(new InternalOAuthError('Failed to fetch user profile', err)) - } - - try { - if (body !== undefined) { - json = JSON.parse(body.toString()) - } - } catch (ex) { - return done(new Error('Failed to parse user profile')) - } - - const profile = parseProfile(json) - profile.provider = ProviderEnum.oauth2 - - done(null, profile) - }) - } -} - -export { OAuth2CustomStrategy } diff --git a/old_src/lib/web/auth/openid/index.ts b/old_src/lib/web/auth/openid/index.ts deleted file mode 100644 index ebf7a5b70..000000000 --- a/old_src/lib/web/auth/openid/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import * as OpenID from '@passport-next/passport-openid' -import { config } from '../../../config' -import { User } from '../../../models' -import { logger } from '../../../logger' -import { urlencodedParser } from '../../utils' -import { AuthMiddleware } from '../interface' - -const openIDAuth = Router() -export const OPenIDMiddleware: AuthMiddleware = { - getMiddleware (): Router { - passport.use(new OpenID.Strategy({ - returnURL: config.serverURL + '/auth/openid/callback', - realm: config.serverURL, - profile: true - }, function (openid, profile, done) { - const stringifiedProfile = JSON.stringify(profile) - User.findOrCreate({ - where: { - profileid: openid - }, - defaults: { - profile: stringifiedProfile - } - }).then(function ([user, _]) { - if (user) { - let needSave = false - if (user.profile !== stringifiedProfile) { - user.profile = stringifiedProfile - needSave = true - } - if (needSave) { - user.save().then(function () { - logger.debug(`user login: ${user.id}`) - return done(null, user) - }) - } else { - logger.debug(`user login: ${user.id}`) - return done(null, user) - } - } - }).catch(function (err) { - logger.error('auth callback failed: ' + err) - return done(err, null) - }) - })) - openIDAuth.post('/auth/openid', urlencodedParser, function (req, res, next) { - passport.authenticate('openid')(req, res, next) - }) - openIDAuth.get('/auth/openid/callback', - passport.authenticate('openid', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - return openIDAuth - } -} diff --git a/old_src/lib/web/auth/saml/index.ts b/old_src/lib/web/auth/saml/index.ts deleted file mode 100644 index 9e11e8ff5..000000000 --- a/old_src/lib/web/auth/saml/index.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import { Strategy as SamlStrategy } from 'passport-saml' -import fs from 'fs' - -import { config } from '../../../config' -import { User } from '../../../models' -import { logger } from '../../../logger' -import { urlencodedParser } from '../../utils' -import { AuthMiddleware } from '../interface' - -function intersection (array1: T[], array2: T[]): T[] { - return array1.filter((n) => array2.includes(n)) -} - -export const SamlMiddleware: AuthMiddleware = { - getMiddleware (): Router { - const SamlAuth = Router() - - const samlStrategy = new SamlStrategy({ - callbackUrl: config.serverURL + '/auth/saml/callback', - entryPoint: config.saml.idpSsoUrl, - issuer: config.saml.issuer || config.serverURL, - cert: fs.readFileSync(config.saml.idpCert, 'utf-8'), - identifierFormat: config.saml.identifierFormat, - disableRequestedAuthnContext: config.saml.disableRequestedAuthnContext - }, function (user, done) { - // check authorization if needed - if (config.saml.externalGroups && config.saml.groupAttribute) { - const externalGroups: string[] = intersection(config.saml.externalGroups, user[config.saml.groupAttribute]) - if (externalGroups.length > 0) { - logger.error('saml permission denied: ' + externalGroups.join(', ')) - return done('Permission denied', null) - } - } - if (config.saml.requiredGroups && config.saml.groupAttribute) { - if (intersection(config.saml.requiredGroups, user[config.saml.groupAttribute]).length === 0) { - logger.error('saml permission denied') - return done('Permission denied', null) - } - } - // user creation - const uuid = user[config.saml.attribute.id] || user.nameID - const profile = { - provider: 'saml', - id: 'SAML-' + uuid, - username: user[config.saml.attribute.username] || user.nameID, - emails: user[config.saml.attribute.email] ? [user[config.saml.attribute.email]] : [] - } - if (profile.emails.length === 0 && config.saml.identifierFormat === 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress') { - profile.emails.push(user.nameID) - } - const stringifiedProfile = JSON.stringify(profile) - User.findOrCreate({ - where: { - profileid: profile.id.toString() - }, - defaults: { - profile: stringifiedProfile - } - }).then(function ([user, _]) { - if (user) { - let needSave = false - if (user.profile !== stringifiedProfile) { - user.profile = stringifiedProfile - needSave = true - } - if (needSave) { - user.save().then(function () { - logger.debug(`user login: ${user.id}`) - return done(null, user) - }) - } else { - logger.debug(`user login: ${user.id}`) - return done(null, user) - } - } - }).catch(function (err) { - logger.error('saml auth failed: ' + err) - return done(err, null) - }) - }) - - passport.use(samlStrategy) - - SamlAuth.get('/auth/saml', - passport.authenticate('saml', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - SamlAuth.post('/auth/saml/callback', urlencodedParser, - passport.authenticate('saml', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - SamlAuth.get('/auth/saml/metadata', function (req, res) { - res.type('application/xml') - res.send(samlStrategy.generateServiceProviderMetadata(null)) - }) - - return SamlAuth - } -} diff --git a/old_src/lib/web/auth/twitter/index.ts b/old_src/lib/web/auth/twitter/index.ts deleted file mode 100644 index 84a0bbfda..000000000 --- a/old_src/lib/web/auth/twitter/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Router } from 'express' -import passport from 'passport' -import { Strategy as TwitterStrategy } from 'passport-twitter' - -import { config } from '../../../config' -import { passportGeneralCallback } from '../utils' -import { AuthMiddleware } from '../interface' - -export const TwitterMiddleware: AuthMiddleware = { - getMiddleware (): Router { - const TwitterAuth = Router() - - passport.use(new TwitterStrategy({ - consumerKey: config.twitter.consumerKey, - consumerSecret: config.twitter.consumerSecret, - callbackURL: config.serverURL + '/auth/twitter/callback' - }, passportGeneralCallback)) - - TwitterAuth.get('/auth/twitter', function (req, res, next) { - passport.authenticate('twitter')(req, res, next) - }) - - // twitter auth callback - TwitterAuth.get('/auth/twitter/callback', - passport.authenticate('twitter', { - successReturnToOrRedirect: config.serverURL + '/', - failureRedirect: config.serverURL + '/' - }) - ) - - return TwitterAuth - } -} diff --git a/old_src/lib/web/auth/utils.ts b/old_src/lib/web/auth/utils.ts deleted file mode 100644 index 4c957ef5c..000000000 --- a/old_src/lib/web/auth/utils.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Profile } from 'passport' -import { logger } from '../../logger' -import { User } from '../../models' - -export function passportGeneralCallback ( - accessToken: string, - refreshToken: string, - profile: Profile, - done: (err?: Error | null, user?: User) => void -): void { - const stringifiedProfile = JSON.stringify(profile) - User.findOrCreate({ - where: { - profileid: profile.id.toString() - }, - defaults: { - profile: stringifiedProfile, - accessToken: accessToken, - refreshToken: refreshToken - } - }).then(function ([user, _]) { - if (user) { - let needSave = false - if (user.profile !== stringifiedProfile) { - user.profile = stringifiedProfile - needSave = true - } - if (user.accessToken !== accessToken) { - user.accessToken = accessToken - needSave = true - } - if (user.refreshToken !== refreshToken) { - user.refreshToken = refreshToken - needSave = true - } - if (needSave) { - user.save().then(function () { - logger.debug(`user login: ${user.id}`) - return done(null, user) - }) - } else { - logger.debug(`user login: ${user.id}`) - return done(null, user) - } - } - }).catch(function (err) { - logger.error('auth callback failed: ' + err) - return done(err, undefined) - }) -} - -export enum ProviderEnum { - facebook = 'facebook', - twitter = 'twitter', - github = 'github', - gitlab = 'gitlab', - dropbox = 'dropbox', - google = 'google', - ldap = 'ldap', - oauth2 = 'oauth2', - saml = 'saml', -} - -export type PassportProfile = { - id: string; - username: string; - displayName: string; - emails: string[]; - avatarUrl: string; - profileUrl: string; - provider: ProviderEnum; - photos: { value: string }[]; -} diff --git a/old_src/lib/web/baseRouter.ts b/old_src/lib/web/baseRouter.ts deleted file mode 100644 index 5637a2a31..000000000 --- a/old_src/lib/web/baseRouter.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { response } from '../response' -import { errors } from '../errors' -import { Router } from 'express' - -const BaseRouter = Router() - -// get index -BaseRouter.get('/', response.showIndex) -// get 403 forbidden -BaseRouter.get('/403', function (req, res) { - errors.errorForbidden(res) -}) -// get 404 not found -BaseRouter.get('/404', function (req, res) { - errors.errorNotFound(res) -}) -// get 500 internal error -BaseRouter.get('/500', function (req, res) { - errors.errorInternalError(res) -}) - -export { BaseRouter } diff --git a/old_src/lib/web/historyRouter.ts b/old_src/lib/web/historyRouter.ts deleted file mode 100644 index ef44636cd..000000000 --- a/old_src/lib/web/historyRouter.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { urlencodedParser } from './utils' -import { History } from '../history' -import { Router } from 'express' - -const HistoryRouter = Router() - -// get history -HistoryRouter.get('/history', History.historyGet) -// post history -HistoryRouter.post('/history', urlencodedParser, History.historyPost) -// post history by note id -HistoryRouter.post('/history/:noteId', urlencodedParser, History.historyPost) -// delete history -HistoryRouter.delete('/history', History.historyDelete) -// delete history by note id -HistoryRouter.delete('/history/:noteId', History.historyDelete) - -export { HistoryRouter } diff --git a/old_src/lib/web/imageRouter/azure.ts b/old_src/lib/web/imageRouter/azure.ts deleted file mode 100644 index 9d2f0e1f1..000000000 --- a/old_src/lib/web/imageRouter/azure.ts +++ /dev/null @@ -1,38 +0,0 @@ -import azure from 'azure-storage' -import path from 'path' - -import { config } from '../../config' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -const AzureUploadProvider: UploadProvider = { - uploadImage: (imagePath, callback) => { - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - const azureBlobService = azure.createBlobService(config.azure.connectionString) - - azureBlobService.createContainerIfNotExists(config.azure.container, { publicAccessLevel: 'blob' }, function (err, _, __) { - if (err) { - callback(new Error(err.message), undefined) - } else { - azureBlobService.createBlockBlobFromLocalFile(config.azure.container, path.basename(imagePath), imagePath, function (err, result, _) { - if (err) { - callback(new Error(err.message), undefined) - } else { - callback(undefined, azureBlobService.getUrl(config.azure.container, result.name)) - } - }) - } - }) - } -} - -export { AzureUploadProvider } diff --git a/old_src/lib/web/imageRouter/filesystem.ts b/old_src/lib/web/imageRouter/filesystem.ts deleted file mode 100644 index a1b6b3fc8..000000000 --- a/old_src/lib/web/imageRouter/filesystem.ts +++ /dev/null @@ -1,24 +0,0 @@ -import path from 'path' -import { URL } from 'url' - -import { config } from '../../config' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -const FilesystemUploadProvider: UploadProvider = { - uploadImage: (imagePath, callback) => { - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - callback(undefined, (new URL(path.basename(imagePath), config.serverURL + '/uploads/')).href) - } -} - -export { FilesystemUploadProvider } diff --git a/old_src/lib/web/imageRouter/imgur.ts b/old_src/lib/web/imageRouter/imgur.ts deleted file mode 100644 index 384a63ff4..000000000 --- a/old_src/lib/web/imageRouter/imgur.ts +++ /dev/null @@ -1,30 +0,0 @@ -import imgur from 'old_src/lib/web/imageRouter/imgur' - -import { config } from '../../config' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -const ImgurUploadProvider: UploadProvider = { - uploadImage: (imagePath, callback) => { - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - imgur.setClientId(config.imgur.clientID) - imgur.uploadFile(imagePath) - .then(function (json) { - logger.debug(`SERVER uploadimage success: ${JSON.stringify(json)}`) - callback(undefined, json.data.link.replace(/^http:\/\//i, 'https://')) - }).catch(function (err) { - callback(new Error(err), undefined) - }) - } -} - -export { ImgurUploadProvider } diff --git a/old_src/lib/web/imageRouter/index.ts b/old_src/lib/web/imageRouter/index.ts deleted file mode 100644 index 7ed46e8d1..000000000 --- a/old_src/lib/web/imageRouter/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Router } from 'express' -import formidable from 'formidable' - -import { config } from '../../config' -import { logger } from '../../logger' -import { errors } from '../../errors' -import { AzureUploadProvider } from './azure' -import { FilesystemUploadProvider } from './filesystem' -import { ImgurUploadProvider } from './imgur' -import { LutimUploadProvider } from './lutim' -import { MinioUploadProvider } from './minio' -import { S3UploadProvider } from './s3' - -interface UploadProvider { - uploadImage: (imagePath: string, callback: (err?: Error, url?: string) => void) => void; -} - -const ImageRouter = Router() - -// upload image -ImageRouter.post('/uploadimage', function (req, res) { - const form = new formidable.IncomingForm() - - form.keepExtensions = true - - if (config.imageUploadType === 'filesystem') { - form.uploadDir = config.uploadsPath - } - - form.parse(req, function (err, fields, files) { - if (err || !files.image || !files.image.path) { - logger.error(`formidable error: ${err}`) - errors.errorForbidden(res) - } else { - logger.debug(`SERVER received uploadimage: ${JSON.stringify(files.image)}`) - - let uploadProvider: UploadProvider - switch (config.imageUploadType) { - case 'azure': - uploadProvider = AzureUploadProvider - break - case 'filesystem': - default: - uploadProvider = FilesystemUploadProvider - break - case 'imgur': - uploadProvider = ImgurUploadProvider - break - case 'lutim': - uploadProvider = LutimUploadProvider - break - case 'minio': - uploadProvider = MinioUploadProvider - break - case 's3': - uploadProvider = S3UploadProvider - break - } - - logger.debug(`imageRouter: Uploading ${files.image.path} using ${config.imageUploadType}`) - uploadProvider.uploadImage(files.image.path, function (err, url) { - if (err !== undefined) { - logger.error(err) - return res.status(500).end('upload image error') - } - logger.debug(`SERVER sending ${url} to client`) - res.send({ - link: url - }) - }) - } - }) -}) - -export { ImageRouter, UploadProvider } diff --git a/old_src/lib/web/imageRouter/lutim.ts b/old_src/lib/web/imageRouter/lutim.ts deleted file mode 100644 index 71b6e70fe..000000000 --- a/old_src/lib/web/imageRouter/lutim.ts +++ /dev/null @@ -1,34 +0,0 @@ -import lutim from 'old_src/lib/web/imageRouter/lutim' - -import { config } from '../../config' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -const LutimUploadProvider: UploadProvider = { - uploadImage: (imagePath, callback) => { - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - if (config.lutim && config.lutim.url) { - lutim.setAPIUrl(config.lutim.url) - logger.debug(`Set lutim URL to ${lutim.getAPIUrl()}`) - } - - lutim.uploadImage(imagePath) - .then(function (json) { - logger.debug(`SERVER uploadimage success: ${JSON.stringify(json)}`) - callback(undefined, lutim.getAPIUrl() + json.msg.short) - }).catch(function (err) { - callback(new Error(err), undefined) - }) - } -} - -export { LutimUploadProvider } diff --git a/old_src/lib/web/imageRouter/minio.ts b/old_src/lib/web/imageRouter/minio.ts deleted file mode 100644 index b69c20a0c..000000000 --- a/old_src/lib/web/imageRouter/minio.ts +++ /dev/null @@ -1,60 +0,0 @@ -import path from 'path' -import fs from 'fs' -import { Client } from 'old_src/lib/web/imageRouter/minio' - -import { config } from '../../config' -import { getImageMimeType } from '../../utils/functions' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -let MinioUploadProvider: UploadProvider - -if (config.minio.endPoint !== undefined) { - const minioClient = new Client({ - endPoint: config.minio.endPoint, - port: config.minio.port, - useSSL: config.minio.secure, - accessKey: config.minio.accessKey, - secretKey: config.minio.secretKey - }) - - MinioUploadProvider = { - uploadImage: (imagePath, callback): void => { - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - fs.readFile(imagePath, function (err, buffer) { - if (err) { - callback(new Error(err.message), undefined) - return - } - - const key = path.join('uploads', path.basename(imagePath)) - const protocol = config.minio.secure ? 'https' : 'http' - - const metaData = { - ContentType: getImageMimeType(imagePath) - } - - minioClient.putObject(config.s3bucket, key, buffer, buffer.length, metaData, function (err, _) { - if (err) { - callback(new Error(err.message), undefined) - return - } - const hidePort = [80, 443].includes(config.minio.port) - const urlPort = hidePort ? '' : `:${config.minio.port}` - callback(undefined, `${protocol}://${config.minio.endPoint}${urlPort}/${config.s3bucket}/${key}`) - }) - }) - } - } -} - -export { MinioUploadProvider } diff --git a/old_src/lib/web/imageRouter/s3.ts b/old_src/lib/web/imageRouter/s3.ts deleted file mode 100644 index 4c58ff488..000000000 --- a/old_src/lib/web/imageRouter/s3.ts +++ /dev/null @@ -1,59 +0,0 @@ -import fs from 'fs' -import path from 'path' -import AWS from 'aws-sdk' - -import { config } from '../../config' -// import { getImageMimeType } from '../../utils' -import { logger } from '../../logger' -import { UploadProvider } from './index' - -const awsConfig = new AWS.Config(config.s3) -const s3 = new AWS.S3(awsConfig) - -const S3UploadProvider: UploadProvider = { - uploadImage: (imagePath, callback) => { - if (!imagePath) { - callback(new Error('Image path is missing or wrong'), undefined) - return - } - - if (!callback || typeof callback !== 'function') { - logger.error('Callback has to be a function') - return - } - - fs.readFile(imagePath, function (err, buffer) { - if (err) { - callback(new Error(err.message), undefined) - return - } - const params = { - Bucket: config.s3bucket, - Key: path.join('uploads', path.basename(imagePath)), - Body: buffer - } - - // ToDo: This does not exist (anymore?) - // const mimeType = getImageMimeType(imagePath) - // if (mimeType) { params.ContentType = mimeType } - - logger.debug(`S3 object parameters: ${JSON.stringify(params)}`) - s3.putObject(params, function (err, _) { - if (err) { - callback(new Error(err.message), undefined) - return - } - - let s3Endpoint = 's3.amazonaws.com' - if (config.s3.endpoint) { - s3Endpoint = config.s3.endpoint - } else if (config.s3.region && config.s3.region !== 'us-east-1') { - s3Endpoint = `s3-${config.s3.region}.amazonaws.com` - } - callback(undefined, `https://${s3Endpoint}/${config.s3bucket}/${params.Key}`) - }) - }) - } -} - -export { S3UploadProvider } diff --git a/old_src/lib/web/index.ts b/old_src/lib/web/index.ts deleted file mode 100644 index 2d3f962c3..000000000 --- a/old_src/lib/web/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AuthRouter } from './auth' -import { BaseRouter } from './baseRouter' -import { HistoryRouter } from './historyRouter' -import { ImageRouter } from './imageRouter' -import { NoteRouter } from './note/router' -import { StatusRouter } from './statusRouter' -import { UserRouter } from './userRouter' - -export { AuthRouter, BaseRouter, HistoryRouter, ImageRouter, NoteRouter, StatusRouter, UserRouter } diff --git a/old_src/lib/web/middleware/checkURIValid.ts b/old_src/lib/web/middleware/checkURIValid.ts deleted file mode 100644 index 462b3e9e3..000000000 --- a/old_src/lib/web/middleware/checkURIValid.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { logger } from '../../logger' -import { errors } from '../../errors' -import { NextFunction, Request, Response } from 'express' - -export function checkURI (req: Request, res: Response, next: NextFunction): void { - try { - decodeURIComponent(req.path) - next() - } catch (err) { - logger.error(err) - errors.errorBadRequest(res) - } -} diff --git a/old_src/lib/web/middleware/codiMDVersion.ts b/old_src/lib/web/middleware/codiMDVersion.ts deleted file mode 100644 index e10663a4b..000000000 --- a/old_src/lib/web/middleware/codiMDVersion.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { config } from '../../config' -import { NextFunction, Request, Response } from 'express' - -export function codiMDVersion (req: Request, res: Response, next: NextFunction): void { - res.set({ - 'CodiMD-Version': config.version - }) - return next() -} diff --git a/old_src/lib/web/middleware/index.ts b/old_src/lib/web/middleware/index.ts deleted file mode 100644 index 0943be063..000000000 --- a/old_src/lib/web/middleware/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { checkURI } from './checkURIValid' -import { codiMDVersion } from './codiMDVersion' -import { redirectWithoutTrailingSlashes } from './redirectWithoutTrailingSlashes' -import { tooBusy } from './tooBusy' - -export { checkURI, codiMDVersion, redirectWithoutTrailingSlashes, tooBusy } diff --git a/old_src/lib/web/middleware/redirectWithoutTrailingSlashes.ts b/old_src/lib/web/middleware/redirectWithoutTrailingSlashes.ts deleted file mode 100644 index 129786b53..000000000 --- a/old_src/lib/web/middleware/redirectWithoutTrailingSlashes.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NextFunction, Request, Response } from 'express' -import { config } from '../../config' - -export function redirectWithoutTrailingSlashes (req: Request, res: Response, next: NextFunction): void { - if (req.method === 'GET' && req.path.substr(-1) === '/' && req.path.length > 1) { - const queryString: string = req.url.slice(req.path.length) - const urlPath: string = req.path.slice(0, -1) - let serverURL: string = config.serverURL - if (config.urlPath) { - serverURL = serverURL.slice(0, -(config.urlPath.length + 1)) - } - res.redirect(301, serverURL + urlPath + queryString) - } else { - next() - } -} diff --git a/old_src/lib/web/middleware/tooBusy.ts b/old_src/lib/web/middleware/tooBusy.ts deleted file mode 100644 index c81ff9468..000000000 --- a/old_src/lib/web/middleware/tooBusy.ts +++ /dev/null @@ -1,14 +0,0 @@ -import toobusy from 'toobusy-js' -import { errors } from '../../errors' -import { config } from '../../config' -import { NextFunction, Request, Response } from 'express' - -toobusy.maxLag(config.tooBusyLag) - -export function tooBusy (req: Request, res: Response, next: NextFunction): void { - if (toobusy()) { - errors.errorServiceUnavailable(res) - } else { - next() - } -} diff --git a/old_src/lib/web/note/actions.ts b/old_src/lib/web/note/actions.ts deleted file mode 100644 index a1f3bfa11..000000000 --- a/old_src/lib/web/note/actions.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Request, Response } from 'express' - -import { Note, Revision } from '../../models' -import { logger } from '../../logger' -import { config } from '../../config' -import { errors } from '../../errors' -import shortId from 'shortid' -import moment from 'moment' -import querystring from 'querystring' - -export function getInfo (req: Request, res: Response, note: Note): void { - const body = note.content - const extracted = Note.extractMeta(body) - const markdown = extracted.markdown - const meta = Note.parseMeta(extracted.meta) - const title = Note.decodeTitle(note.title) - const data = { - title: meta.title || title, - description: meta.description || (markdown ? Note.generateDescription(markdown) : null), - viewcount: note.viewcount, - createtime: note.createdAt, - updatetime: note.lastchangeAt - } - res.set({ - 'Access-Control-Allow-Origin': '*', // allow CORS as API - 'Access-Control-Allow-Headers': 'Range', - 'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range', - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow' // prevent crawling - }) - res.send(data) -} - -export function createGist (req: Request, res: Response, note: Note): void { - const data = { - // eslint-disable-next-line @typescript-eslint/camelcase - client_id: config.github.clientID, - // eslint-disable-next-line @typescript-eslint/camelcase - redirect_uri: config.serverURL + '/auth/github/callback/' + Note.encodeNoteId(note.id) + '/gist', - scope: 'gist', - state: shortId.generate() - } - const query = querystring.stringify(data) - res.redirect('https://github.com/login/oauth/authorize?' + query) -} - -export function getRevision (req: Request, res: Response, note: Note): void { - const actionId = req.params.actionId - if (actionId) { - const time = moment(parseInt(actionId)) - if (time.isValid()) { - Revision.getPatchedNoteRevisionByTime(note, time, function (err, content) { - if (err) { - logger.error(err) - errors.errorInternalError(res) - - return - } - if (!content) { - errors.errorNotFound(res) - return - } - res.set({ - 'Access-Control-Allow-Origin': '*', // allow CORS as API - 'Access-Control-Allow-Headers': 'Range', - 'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range', - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow' // prevent crawling - }) - res.send(content) - }) - } else { - errors.errorNotFound(res) - } - } else { - Revision.getNoteRevisions(note, function (err, data) { - if (err) { - logger.error(err) - errors.errorInternalError(res) - return - } - const out = { - revision: data - } - res.set({ - 'Access-Control-Allow-Origin': '*', // allow CORS as API - 'Access-Control-Allow-Headers': 'Range', - 'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range', - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow' // prevent crawling - }) - res.send(out) - }) - } -} diff --git a/old_src/lib/web/note/controller.ts b/old_src/lib/web/note/controller.ts deleted file mode 100644 index ec024123d..000000000 --- a/old_src/lib/web/note/controller.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { Request, Response } from 'express' -import { config } from '../../config' -import { errors } from '../../errors' -import { logger } from '../../logger' -import { Note } from '../../models' -import * as ActionController from './actions' -import * as NoteUtils from './util' - -export function publishNoteActions (req: Request, res: Response): void { - NoteUtils.findNoteOrCreate(req, res, function (note) { - const action = req.params.action - switch (action) { - case 'download': - exports.downloadMarkdown(req, res, note) - break - case 'edit': - res.redirect(config.serverURL + '/' + (note.alias ? note.alias : Note.encodeNoteId(note.id)) + '?both') - break - default: - res.redirect(config.serverURL + '/s/' + note.shortid) - break - } - }) -} - -export function showPublishNote (req: Request, res: Response): void { - NoteUtils.findNoteOrCreate(req, res, function (note) { - // force to use short id - const shortid = req.params.shortid - if ((note.alias && shortid !== note.alias) || (!note.alias && shortid !== note.shortid)) { - return res.redirect(config.serverURL + '/s/' + (note.alias || note.shortid)) - } - note.increment('viewcount').then(function (note) { - if (!note) { - return errors.errorNotFound(res) - } - NoteUtils.getPublishData(req, res, note, (data) => { - res.set({ - 'Cache-Control': 'private' // only cache by client - }) - return res.render('pretty.ejs', data) - }) - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) - }) -} - -export function showNote (req: Request, res: Response): void { - NoteUtils.findNoteOrCreate(req, res, function (note) { - // force to use note id - const noteId = req.params.noteId - const id = Note.encodeNoteId(note.id) - if ((note.alias && noteId !== note.alias) || (!note.alias && noteId !== id)) { - return res.redirect(config.serverURL + '/' + (note.alias || id)) - } - const body = note.content - const extracted = Note.extractMeta(body) - const meta = Note.parseMeta(extracted.meta) - let title = Note.decodeTitle(note.title) - title = Note.generateWebTitle(meta.title || title) - const opengraph = Note.parseOpengraph(meta, title) - res.set({ - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow' // prevent crawling - }) - return res.render('codimd.ejs', { - title: title, - opengraph: opengraph - }) - }) -} - -export function createFromPOST (req: Request, res: Response): void { - let body = '' - if (req.body && req.body.length > config.documentMaxLength) { - return errors.errorTooLong(res) - } else if (req.body) { - body = req.body - } - body = body.replace(/[\r]/g, '') - return NoteUtils.newNote(req, res, body) -} - -export function doAction (req: Request, res: Response): void { - const noteId = req.params.noteId - NoteUtils.findNoteOrCreate(req, res, (note) => { - const action = req.params.action - // TODO: Don't switch on action, choose action in Router and use separate functions - switch (action) { - case 'publish': - case 'pretty': // pretty deprecated - res.redirect(config.serverURL + '/s/' + (note.alias || note.shortid)) - break - case 'slide': - res.redirect(config.serverURL + '/p/' + (note.alias || note.shortid)) - break - case 'download': - exports.downloadMarkdown(req, res, note) - break - case 'info': - ActionController.getInfo(req, res, note) - break - case 'gist': - ActionController.createGist(req, res, note) - break - case 'revision': - ActionController.getRevision(req, res, note) - break - default: - return res.redirect(config.serverURL + '/' + noteId) - } - }) -} - -export function downloadMarkdown (req: Request, res: Response, note): void { - const body = note.content - let filename = Note.decodeTitle(note.title) - filename = encodeURIComponent(filename) - res.set({ - 'Access-Control-Allow-Origin': '*', // allow CORS as API - 'Access-Control-Allow-Headers': 'Range', - 'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range', - 'Content-Type': 'text/markdown; charset=UTF-8', - 'Cache-Control': 'private', - 'Content-disposition': 'attachment; filename=' + filename + '.md', - 'X-Robots-Tag': 'noindex, nofollow' // prevent crawling - }) - res.send(body) -} diff --git a/old_src/lib/web/note/router.ts b/old_src/lib/web/note/router.ts deleted file mode 100644 index 034d89a16..000000000 --- a/old_src/lib/web/note/router.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Router } from 'express' -import { markdownParser } from '../utils' -import * as NoteController from './controller' - -import * as SlideController from './slide' - -const NoteRouter = Router() -// get new note -NoteRouter.get('/new', NoteController.createFromPOST) -// post new note with content -NoteRouter.post('/new', markdownParser, NoteController.createFromPOST) -// post new note with content and alias -NoteRouter.post('/new/:noteId', markdownParser, NoteController.createFromPOST) -// get publish note -NoteRouter.get('/s/:shortid', NoteController.showPublishNote) -// publish note actions -NoteRouter.get('/s/:shortid/:action', NoteController.publishNoteActions) -// get publish slide -NoteRouter.get('/p/:shortid', SlideController.showPublishSlide) -// publish slide actions -NoteRouter.get('/p/:shortid/:action', SlideController.publishSlideActions) -// get note by id -NoteRouter.get('/:noteId', NoteController.showNote) -// note actions -NoteRouter.get('/:noteId/:action', NoteController.doAction) -// note actions with action id -NoteRouter.get('/:noteId/:action/:actionId', NoteController.doAction) - -export { NoteRouter } diff --git a/old_src/lib/web/note/slide.ts b/old_src/lib/web/note/slide.ts deleted file mode 100644 index 2172f59a3..000000000 --- a/old_src/lib/web/note/slide.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Request, Response } from 'express' -import { config } from '../../config' -import { errors } from '../../errors' -import { logger } from '../../logger' -import { Note } from '../../models' -import * as NoteUtils from './util' - -export function publishSlideActions (req: Request, res: Response): void { - NoteUtils.findNoteOrCreate(req, res, function (note) { - const action = req.params.action - if (action === 'edit') { - res.redirect(config.serverURL + '/' + (note.alias ? note.alias : Note.encodeNoteId(note.id)) + '?both') - } else { - res.redirect(config.serverURL + '/p/' + note.shortid) - } - }) -} - -export function showPublishSlide (req: Request, res: Response): void { - NoteUtils.findNoteOrCreate(req, res, function (note) { - // force to use short id - const shortid = req.params.shortid - if ((note.alias && shortid !== note.alias) || (!note.alias && shortid !== note.shortid)) { - return res.redirect(config.serverURL + '/p/' + (note.alias || note.shortid)) - } - note.increment('viewcount').then(function (note) { - if (!note) { - return errors.errorNotFound(res) - } - NoteUtils.getPublishData(req, res, note, (data) => { - res.set({ - 'Cache-Control': 'private' // only cache by client - }) - return res.render('slide.ejs', data) - }) - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) - }) -} diff --git a/old_src/lib/web/note/util.ts b/old_src/lib/web/note/util.ts deleted file mode 100644 index 7e470cd5a..000000000 --- a/old_src/lib/web/note/util.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Request, Response } from 'express' -import fs from 'fs' - -import path from 'path' -import { config } from '../../config' -import { errors } from '../../errors' -import { logger } from '../../logger' -import { Note } from '../../models' -import { PhotoProfile } from '../../utils/PhotoProfile' - -export function newNote (req, res: Response, body: string | null): void { - let owner = null - const noteId = req.params.noteId ? req.params.noteId : null - if (req.isAuthenticated()) { - owner = req.user.id - } else if (!config.allowAnonymous) { - return errors.errorForbidden(res) - } - if (config.allowFreeURL && noteId && !config.forbiddenNoteIDs.includes(noteId)) { - req.alias = noteId - } else if (noteId) { - return req.method === 'POST' ? errors.errorForbidden(res) : errors.errorNotFound(res) - } - Note.create({ - ownerId: owner, - alias: req.alias ? req.alias : null, - content: body - }).then(function (note) { - return res.redirect(config.serverURL + '/' + (note.alias ? note.alias : Note.encodeNoteId(note.id))) - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) -} - -export enum Permission { - None, - Read, - Write, - Owner -} - -interface NoteObject { - ownerId?: string; - permission: string; -} - -export function getPermission (user, note: NoteObject): Permission { - // There are two possible User objects we get passed. One is from socket.io - // and the other is from passport directly. The former sets the logged_in - // parameter to either true or false, whereas for the latter, the logged_in - // parameter is always undefined, and the existence of user itself means the - // user is logged in. - if (!user || user.logged_in === false) { - // Anonymous - switch (note.permission) { - case 'freely': - return Permission.Write - case 'editable': - case 'locked': - return Permission.Read - default: - return Permission.None - } - } else if (note.ownerId === user.id) { - // Owner - return Permission.Owner - } else { - // Registered user - switch (note.permission) { - case 'editable': - case 'limited': - case 'freely': - return Permission.Write - case 'locked': - case 'protected': - return Permission.Read - default: - return Permission.None - } - } -} - -export function findNoteOrCreate (req: Request, res: Response, callback: (note: Note) => void): void { - const id = req.params.noteId || req.params.shortid - Note.parseNoteId(id, function (err, _id) { - if (err) { - logger.error(err) - return errors.errorInternalError(res) - } - Note.findOne({ - where: { - id: _id - } - }).then(function (note) { - if (!note) { - return newNote(req, res, '') - } - if (getPermission(req.user, note) === Permission.None) { - return errors.errorForbidden(res) - } else { - return callback(note) - } - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) - }) -} - -function isRevealTheme (theme: string): string | undefined { - if (fs.existsSync(path.join(__dirname, '..', '..', '..', '..', 'public', 'build', 'reveal.js', 'css', 'theme', theme + '.css'))) { - return theme - } - return undefined -} - -export function getPublishData (req: Request, res: Response, note, callback: (data) => void): void { - const body = note.content - const extracted = Note.extractMeta(body) - const markdown = extracted.markdown - const meta = Note.parseMeta(extracted.meta) - const createtime = note.createdAt - const updatetime = note.lastchangeAt - let title = Note.decodeTitle(note.title) - title = Note.generateWebTitle(meta.title || title) - const ogdata = Note.parseOpengraph(meta, title) - const data = { - title: title, - description: meta.description || (markdown ? Note.generateDescription(markdown) : null), - viewcount: note.viewcount, - createtime: createtime, - updatetime: updatetime, - body: markdown, - theme: meta.slideOptions && isRevealTheme(meta.slideOptions.theme), - meta: JSON.stringify(extracted.meta), - owner: note.owner ? note.owner.id : null, - ownerprofile: note.owner ? PhotoProfile.fromUser(note.owner) : null, - lastchangeuser: note.lastchangeuser ? note.lastchangeuser.id : null, - lastchangeuserprofile: note.lastchangeuser ? PhotoProfile.fromUser(note.lastchangeuser) : null, - robots: meta.robots || false, // default allow robots - GA: meta.GA, - disqus: meta.disqus, - cspNonce: res.locals.nonce, - dnt: req.headers.dnt, - opengraph: ogdata - } - callback(data) -} diff --git a/old_src/lib/web/statusRouter.ts b/old_src/lib/web/statusRouter.ts deleted file mode 100644 index 7eac7721c..000000000 --- a/old_src/lib/web/statusRouter.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { config } from '../config' -import { Router } from 'express' -import { errors } from '../errors' -import { realtime } from '../realtime' -import { Temp } from '../models' -import { logger } from '../logger' -import { urlencodedParser } from './utils' - -const StatusRouter = Router() - -// get status -StatusRouter.get('/status', function (req, res, _) { - realtime.getStatus(function (data) { - res.set({ - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow', // prevent crawling - 'Content-Type': 'application/json' - }) - res.send(data) - }) -}) -// get status -StatusRouter.get('/temp', function (req, res) { - const host = req.get('host') - if (config.allowOrigin.indexOf(host) === -1) { - errors.errorForbidden(res) - } else { - const tempid = req.query.tempid - if (!tempid || typeof tempid !== 'string') { - errors.errorForbidden(res) - } else { - Temp.findOne({ - where: { - id: tempid - } - }).then(function (temp) { - if (!temp) { - errors.errorNotFound(res) - } else { - res.header('Access-Control-Allow-Origin', '*') - res.send({ - temp: temp.data - }) - temp.destroy().catch(function (err) { - if (err) { - logger.error('remove temp failed: ' + err) - } - }) - } - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) - } - } -}) -// post status -StatusRouter.post('/temp', urlencodedParser, function (req, res) { - const host = req.get('host') - if (config.allowOrigin.indexOf(host) === -1) { - errors.errorForbidden(res) - } else { - const data = req.body.data - if (!data) { - errors.errorForbidden(res) - } else { - logger.debug(`SERVER received temp from [${host}]: ${req.body.data}`) - Temp.create({ - data: data - }).then(function (temp) { - if (temp) { - res.header('Access-Control-Allow-Origin', '*') - res.send({ - status: 'ok', - id: temp.id - }) - } else { - errors.errorInternalError(res) - } - }).catch(function (err) { - logger.error(err) - return errors.errorInternalError(res) - }) - } - } -}) - -StatusRouter.get('/config', function (req, res) { - const data = { - domain: config.domain, - urlpath: config.urlPath, - debug: config.debug, - version: config.fullversion, - DROPBOX_APP_KEY: config.dropbox.appKey, - allowedUploadMimeTypes: config.allowedUploadMimeTypes, - linkifyHeaderStyle: config.linkifyHeaderStyle - } - res.set({ - 'Cache-Control': 'private', // only cache by client - 'X-Robots-Tag': 'noindex, nofollow', // prevent crawling - 'Content-Type': 'application/javascript' - }) - res.render('../js/lib/common/constant.ejs', data) -}) - -export { StatusRouter } diff --git a/old_src/lib/web/userRouter.ts b/old_src/lib/web/userRouter.ts deleted file mode 100644 index 819573511..000000000 --- a/old_src/lib/web/userRouter.ts +++ /dev/null @@ -1,144 +0,0 @@ -import archiver from 'archiver' -import async from 'async' -import { Request, Response, Router } from 'express' -import { errors } from '../errors' -import { Note, User } from '../models' -import { logger } from '../logger' -import { generateAvatar } from '../letter-avatars' -import { config } from '../config' -import { PhotoProfile } from '../utils/PhotoProfile' - -const UserRouter = Router() - -// get me info -UserRouter.get('/me', function (req: Request, res: Response) { - if (req.isAuthenticated()) { - if (req.user == null) { - return errors.errorInternalError(res) - } - User.findOne({ - where: { - id: req.user.id - } - }).then(function (user) { - if (!user) { return errors.errorNotFound(res) } - const profile = PhotoProfile.fromUser(user) - if (profile == null) { - return errors.errorInternalError(res) - } - res.send({ - status: 'ok', - id: user.id, - name: profile.name, - photo: profile.photo - }) - }).catch(function (err) { - logger.error('read me failed: ' + err) - return errors.errorInternalError(res) - }) - } else { - res.send({ - status: 'forbidden' - }) - } -}) - -// delete the currently authenticated user -UserRouter.get('/me/delete/:token?', function (req: Request, res: Response) { - if (req.isAuthenticated()) { - if (req.user == null) { - return errors.errorInternalError(res) - } - User.findOne({ - where: { - id: req.user.id - } - }).then(function (user) { - if (!user) { - return errors.errorNotFound(res) - } - if (user.deleteToken === req.params.token) { - user.destroy().then(function () { - res.redirect(config.serverURL + '/') - }) - } else { - return errors.errorForbidden(res) - } - }).catch(function (err) { - logger.error('delete user failed: ' + err) - return errors.errorInternalError(res) - }) - } else { - return errors.errorForbidden(res) - } -}) - -// export the data of the authenticated user -UserRouter.get('/me/export', function (req: Request, res: Response) { - if (req.isAuthenticated()) { - if (req.user == null) { - return errors.errorInternalError(res) - } - // let output = fs.createWriteStream(__dirname + '/example.zip'); - const archive = archiver('zip', { - zlib: { level: 3 } // Sets the compression level. - }) - res.setHeader('Content-Type', 'application/zip') - res.attachment('archive.zip') - archive.pipe(res) - archive.on('error', function (err) { - logger.error('export user data failed: ' + err) - return errors.errorInternalError(res) - }) - User.findOne({ - where: { - id: req.user.id - } - }).then(function (user) { - if (user == null) { - return errors.errorInternalError(res) - } - Note.findAll({ - where: { - ownerId: user.id - } - }).then(function (notes) { - const filenames = {} - async.each(notes, function (note, callback) { - const basename = note.title.replace(/\//g, '-') // Prevent subdirectories - let filename - let numberOfDuplicateFilename = 0 - do { - const suffix = numberOfDuplicateFilename !== 0 ? '-' + numberOfDuplicateFilename : '' - filename = basename + suffix + '.md' - numberOfDuplicateFilename++ - } while (filenames[filename]) - filenames[filename] = true - - logger.debug('Write: ' + filename) - archive.append(Buffer.from(note.content), { name: filename, date: note.lastchangeAt }) - callback(null, null) - }, function (err) { - if (err) { - return errors.errorInternalError(res) - } - - archive.finalize() - }) - }) - }).catch(function (err) { - logger.error('export user data failed: ' + err) - return errors.errorInternalError(res) - }) - } else { - return errors.errorForbidden(res) - } -}) - -UserRouter.get('/user/:username/avatar.svg', function (req: Request, res: Response, _) { - res.setHeader('Content-Type', 'image/svg+xml') - res.setHeader('Cache-Control', 'public, max-age=86400') - res.send(generateAvatar(req.params.username)) -}) - -export { UserRouter } diff --git a/old_src/lib/web/utils.ts b/old_src/lib/web/utils.ts deleted file mode 100644 index 6da5ceb99..000000000 --- a/old_src/lib/web/utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -import bodyParser from 'body-parser' -// create application/x-www-form-urlencoded parser - -export const urlencodedParser = bodyParser.urlencoded({ - extended: false, - limit: 1024 * 1024 * 10 // 10 mb -}) - -// create text/markdown parser -export const markdownParser = bodyParser.text({ - inflate: true, - type: ['text/plain', 'text/markdown'], - limit: 1024 * 1024 * 10 // 10 mb -}) diff --git a/old_src/lib/workers/dmpWorker.ts b/old_src/lib/workers/dmpWorker.ts deleted file mode 100644 index 14449aa89..000000000 --- a/old_src/lib/workers/dmpWorker.ts +++ /dev/null @@ -1,173 +0,0 @@ -// external modules -// eslint-disable-next-line @typescript-eslint/camelcase -import { DIFF_DELETE, DIFF_INSERT, diff_match_patch, patch_obj } from 'diff-match-patch' -import { Revision } from '../models' - -// Function for suppressing TS2722 -// eslint-disable-next-line @typescript-eslint/unbound-method,@typescript-eslint/no-empty-function -function processSend (options): boolean { - if (process?.send !== undefined) { - return process.send(options) - } - return false -} - -// We can't use the logger directly, because we are in a distinct nodejs -// process and the global instance of logger is not the one of the parent. In -// particular, it does not have the log level set correctly. -function log (level: string, msg, ...splat): boolean { - return processSend({ - msg: 'log', - level: level, - result: [msg, splat], - cacheKey: 1 // dummy value - }) -} -// eslint-disable-next-line @typescript-eslint/camelcase,new-cap -const dmp: diff_match_patch = new diff_match_patch() - -// eslint-disable-next-line @typescript-eslint/camelcase -function getRevision (revisions: Revision[], count: number): { content: string; patch: patch_obj[]; authorship: string } { - const msStart = (new Date()).getTime() - let startContent = '' - let lastPatch = '' - // eslint-disable-next-line @typescript-eslint/camelcase - let applyPatches: patch_obj[] = [] - let authorship = '' - if (count <= Math.round(revisions.length / 2)) { - // start from top to target - for (let i = 0; i < count; i++) { - const revision = revisions[i] - if (i === 0) { - startContent = revision.content || revision.lastContent - } - if (i !== count - 1) { - // eslint-disable-next-line @typescript-eslint/camelcase - const patch: patch_obj[] = dmp.patch_fromText(revision.patch) - applyPatches = applyPatches.concat(patch) - } - lastPatch = revision.patch - authorship = revision.authorship - } - // swap DIFF_INSERT and DIFF_DELETE to achieve unpatching - for (let i = 0, l = applyPatches.length; i < l; i++) { - for (let j = 0, m = applyPatches[i].diffs.length; j < m; j++) { - const diff = applyPatches[i].diffs[j] - if (diff[0] === DIFF_INSERT) { - diff[0] = DIFF_DELETE - } else if (diff[0] === DIFF_DELETE) { - diff[0] = DIFF_INSERT - } - } - } - } else { - // start from bottom to target - const l = revisions.length - 1 - for (let i = l; i >= count - 1; i--) { - const revision = revisions[i] - if (i === l) { - startContent = revision.lastContent - authorship = revision.authorship - } - if (revision.patch) { - // eslint-disable-next-line @typescript-eslint/camelcase - const patch: patch_obj[] = dmp.patch_fromText(revision.patch) - applyPatches = applyPatches.concat(patch) - } - lastPatch = revision.patch - authorship = revision.authorship - } - } - let finalContent = '' - try { - finalContent = dmp.patch_apply(applyPatches, startContent)[0] - } catch (err) { - throw new Error(err) - } - const data = { - content: finalContent, - patch: dmp.patch_fromText(lastPatch), - authorship: authorship - } - const msEnd = (new Date()).getTime() - log('debug', (msEnd - msStart) + 'ms') - return data -} - -function createPatch (lastDoc: string, currDoc: string): string { - const msStart = (new Date()).getTime() - const diff = dmp.diff_main(lastDoc, currDoc) - // eslint-disable-next-line @typescript-eslint/camelcase - const patch: patch_obj[] = dmp.patch_make(lastDoc, diff) - const strPatch: string = dmp.patch_toText(patch) - const msEnd = (new Date()).getTime() - log('debug', strPatch) - log('debug', (msEnd - msStart) + 'ms') - return strPatch -} - -class Data { - msg: string - cacheKey: string - lastDoc?: string - currDoc?: string - revisions?: Revision[] - count?: number -} - -process.on('message', function (data: Data) { - if (!data || !data.msg || !data.cacheKey) { - return log('error', 'dmp worker error: not enough data') - } - switch (data.msg) { - case 'create patch': - if (data.lastDoc === undefined || data.currDoc === undefined) { - return log('error', 'dmp worker error: not enough data on create patch') - } - try { - const patch: string = createPatch(data.lastDoc, data.currDoc) - processSend({ - msg: 'check', - result: patch, - cacheKey: data.cacheKey - }) - } catch (err) { - log('error', 'create patch: dmp worker error', err) - processSend({ - msg: 'error', - error: err, - cacheKey: data.cacheKey - }) - } - break - case 'get revision': - if (data.revisions === undefined || data.count === undefined) { - return log('error', 'dmp worker error: not enough data on get revision') - } - try { - // eslint-disable-next-line @typescript-eslint/camelcase - const result: { content: string; patch: patch_obj[]; authorship: string } = getRevision(data.revisions, data.count) - processSend({ - msg: 'check', - result: result, - cacheKey: data.cacheKey - }) - } catch (err) { - log('error', 'get revision: dmp worker error', err) - processSend({ - msg: 'error', - error: err, - cacheKey: data.cacheKey - }) - } - break - } -}) - -// log uncaught exception -process.on('uncaughtException', function (err: Error) { - log('error', 'An uncaught exception has occured.') - log('error', err) - log('error', 'Process will exit now.') - process.exit(1) -}) diff --git a/old_src/test/auth.ts b/old_src/test/auth.ts deleted file mode 100644 index 334206307..000000000 --- a/old_src/test/auth.ts +++ /dev/null @@ -1,110 +0,0 @@ -import assert from 'assert' -import { ImportMock } from 'ts-mock-imports' -import * as configModule from '../lib/config' -import { DropboxMiddleware } from '../lib/web/auth/dropbox' -import { EmailMiddleware } from '../lib/web/auth/email' -import { FacebookMiddleware } from '../lib/web/auth/facebook' -import { GithubMiddleware } from '../lib/web/auth/github' -import { GitlabMiddleware } from '../lib/web/auth/gitlab' -import { GoogleMiddleware } from '../lib/web/auth/google' -import { LdapMiddleware } from '../lib/web/auth/ldap' -import { OAuth2Middleware } from '../lib/web/auth/oauth2' -import { OPenIDMiddleware } from '../lib/web/auth/openid' -import { TwitterMiddleware } from '../lib/web/auth/twitter' - -describe('AuthMiddlewares', function () { - // We currently exclude the SAML Auth, because it needs a certificate file - const middlewareList = [{ - name: 'Facebook', - middleware: FacebookMiddleware, - config: { - facebook: { - clientID: 'foobar', - clientSecret: 'foobar' - } - } - }, { - name: 'Twitter', - middleware: TwitterMiddleware, - config: { - twitter: { - consumerKey: 'foobar', - consumerSecret: 'foobar' - } - } - }, { - name: 'GitHub', - middleware: GithubMiddleware, - config: { - github: { - clientID: 'foobar', - clientSecret: 'foobar' - } - } - }, { - name: 'Gitlab', - middleware: GitlabMiddleware, - config: { - gitlab: { - clientID: 'foobar', - clientSecret: 'foobar' - } - } - }, { - name: 'Dropbox', - middleware: DropboxMiddleware, - config: { - dropbox: { - clientID: 'foobar', - clientSecret: 'foobar' - } - } - }, { - name: 'Google', - middleware: GoogleMiddleware, - config: { - google: { - clientID: 'foobar', - clientSecret: 'foobar' - } - } - }, { - name: 'LDAP', - middleware: LdapMiddleware, - config: { - ldap: {} - } - }, { - name: 'OAuth2', - middleware: OAuth2Middleware, - config: { - oauth2: { - clientID: 'foobar', - clientSecret: 'foobar', - authorizationURL: 'foobar', - tokenURL: 'foobar', - userProfileURL: 'foobar', - scope: 'foobar' - } - } - }, { - name: 'Email', - middleware: EmailMiddleware, - config: {} - }, { - name: 'OpenID', - middleware: OPenIDMiddleware, - config: {} - }] - - middlewareList.forEach((middleware) => { - describe(middleware.name + 'Middleware', () => { - before(() => { - ImportMock.mockOther(configModule, 'config', middleware.config) - }) - it('can be instantiated', () => { - assert.ok(middleware.middleware.getMiddleware()) - }) - }) - }) -}) diff --git a/old_src/test/csp.ts b/old_src/test/csp.ts deleted file mode 100644 index 52a4b6789..000000000 --- a/old_src/test/csp.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* eslint-env node, mocha */ -'use strict' - -import assert from 'assert' -import crypto from 'crypto' -import fs from 'fs' -import path from 'path' -import * as configModule from '../lib/config' -import { ImportMock } from 'ts-mock-imports' - -describe('Content security policies', function () { - let defaultConfig, csp - - before(function () { - csp = require('../lib/csp') - }) - - beforeEach(function () { - // Reset config to make sure we don't influence other tests - defaultConfig = { - csp: { - enable: true, - directives: { - }, - addDefaults: true, - addDisqus: true, - addGoogleAnalytics: true, - upgradeInsecureRequests: 'auto', - reportURI: undefined - }, - useCDN: true - } - }) - - // beginnging Tests - it('Disable CDN', function () { - const testconfig = defaultConfig - testconfig.useCDN = false - ImportMock.mockOther(configModule, 'config', testconfig) - - assert(!csp.computeDirectives().scriptSrc.includes('https://cdnjs.cloudflare.com')) - assert(!csp.computeDirectives().scriptSrc.includes('https://cdn.mathjax.org')) - assert(!csp.computeDirectives().styleSrc.includes('https://cdnjs.cloudflare.com')) - assert(!csp.computeDirectives().styleSrc.includes('https://fonts.googleapis.com')) - assert(!csp.computeDirectives().fontSrc.includes('https://cdnjs.cloudflare.com')) - assert(!csp.computeDirectives().fontSrc.includes('https://fonts.gstatic.com')) - }) - - it('Disable Google Analytics', function () { - const testconfig = defaultConfig - testconfig.csp.addGoogleAnalytics = false - ImportMock.mockOther(configModule, 'config', testconfig) - - assert(!csp.computeDirectives().scriptSrc.includes('https://www.google-analytics.com')) - }) - - it('Disable Disqus', function () { - const testconfig = defaultConfig - testconfig.csp.addDisqus = false - ImportMock.mockOther(configModule, 'config', testconfig) - - assert(!csp.computeDirectives().scriptSrc.includes('https://disqus.com')) - assert(!csp.computeDirectives().scriptSrc.includes('https://*.disqus.com')) - assert(!csp.computeDirectives().scriptSrc.includes('https://*.disquscdn.com')) - assert(!csp.computeDirectives().styleSrc.includes('https://*.disquscdn.com')) - assert(!csp.computeDirectives().fontSrc.includes('https://*.disquscdn.com')) - }) - - it('Set ReportURI', function () { - const testconfig = defaultConfig - testconfig.csp.reportURI = 'https://example.com/reportURI' - ImportMock.mockOther(configModule, 'config', testconfig) - - assert.strictEqual(csp.computeDirectives().reportUri, 'https://example.com/reportURI') - }) - - it('Set own directives', function () { - const testconfig = defaultConfig - ImportMock.mockOther(configModule, 'config', testconfig) - const unextendedCSP = csp.computeDirectives() - testconfig.csp.directives = { - defaultSrc: ['https://default.example.com'], - scriptSrc: ['https://script.example.com'], - imgSrc: ['https://img.example.com'], - styleSrc: ['https://style.example.com'], - fontSrc: ['https://font.example.com'], - objectSrc: ['https://object.example.com'], - mediaSrc: ['https://media.example.com'], - childSrc: ['https://child.example.com'], - connectSrc: ['https://connect.example.com'] - } - ImportMock.mockOther(configModule, 'config', testconfig) - - const variations = ['default', 'script', 'img', 'style', 'font', 'object', 'media', 'child', 'connect'] - - for (let i = 0; i < variations.length; i++) { - assert.strictEqual(csp.computeDirectives()[variations[i] + 'Src'].toString(), ['https://' + variations[i] + '.example.com'].concat(unextendedCSP[variations[i] + 'Src']).toString()) - } - }) - - /* - * This test reminds us to update the CSP hash for the speaker notes - */ - it('Unchanged hash for reveal.js speaker notes plugin', function () { - const hash = crypto.createHash('sha1') - hash.update(fs.readFileSync(path.join(process.cwd(), '/node_modules/reveal.js/plugin/notes/notes.html'), 'utf8'), 'utf8') - assert.strictEqual(hash.digest('hex'), 'd5d872ae49b5db27f638b152e6e528837204d380') - }) -}) diff --git a/old_src/test/letter-avatars.ts b/old_src/test/letter-avatars.ts deleted file mode 100644 index 0f4f7604b..000000000 --- a/old_src/test/letter-avatars.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-env node, mocha */ - -'use strict' - -import { ImportMock } from 'ts-mock-imports' -import * as configModule from '../lib/config' - -import assert from 'assert' -import * as avatars from '../lib/letter-avatars' - -describe('generateAvatarURL() gravatar enabled', function () { - beforeEach(function () { - // Reset config to make sure we don't influence other tests - const testconfig = { - allowGravatar: true, - serverURL: 'http://localhost:3000', - port: 3000 - } - ImportMock.mockOther(configModule, 'config', testconfig) - }) - - it('should return correct urls', function () { - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels', 'hello@dsprenkels.com', true), 'https://cdn.libravatar.org/avatar/d41b5f3508cc3f31865566a47dd0336b?s=400') - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels', 'hello@dsprenkels.com', false), 'https://cdn.libravatar.org/avatar/d41b5f3508cc3f31865566a47dd0336b?s=96') - }) - - it('should return correct urls for names with spaces', function () { - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels'), 'http://localhost:3000/user/Daan%20Sprenkels/avatar.svg') - }) -}) - -describe('generateAvatarURL() gravatar disabled', function () { - beforeEach(function () { - // Reset config to make sure we don't influence other tests - const testconfig = { - allowGravatar: false, - serverURL: 'http://localhost:3000', - port: 3000 - } - ImportMock.mockOther(configModule, 'config', testconfig) - }) - - it('should return correct urls', function () { - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels', 'hello@dsprenkels.com', true), 'http://localhost:3000/user/Daan%20Sprenkels/avatar.svg') - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels', 'hello@dsprenkels.com', false), 'http://localhost:3000/user/Daan%20Sprenkels/avatar.svg') - }) - - it('should return correct urls for names with spaces', function () { - assert.strictEqual(avatars.generateAvatarURL('Daan Sprenkels'), 'http://localhost:3000/user/Daan%20Sprenkels/avatar.svg') - }) -}) diff --git a/old_src/test/user.ts b/old_src/test/user.ts deleted file mode 100644 index dd4f30378..000000000 --- a/old_src/test/user.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-env node, mocha */ - -import { User, sequelize } from '../lib/models' -import assert = require('assert') - -describe('User Sequelize model', function () { - beforeEach(() => { - return sequelize.sync({ force: true }) - }) - - it('stores a password hash on creation and verifies that password', function () { - const userData = { - password: 'test123' - } - const intentionallyInvalidPassword = 'stuff' - - return User.create(userData).then(u => { - return Promise.all([ - u.verifyPassword(userData.password).then(result => assert.strictEqual(result, true)), - u.verifyPassword(intentionallyInvalidPassword).then(result => assert.strictEqual(result, false)) - ]).catch(e => assert.fail(e)) - }) - }) - - it('can cope with password stored in standard scrypt header format', function () { - const testKey = '736372797074000e00000008000000018c7b8c1ac273fd339badde759b3efc418bc61b776debd02dfe95989383cf9980ad21d2403dce33f4b551f5e98ce84edb792aee62600b1303ab8d4e6f0a53b0746e73193dbf557b888efc83a2d6a055a9' - const validPassword = 'test' - const intentionallyInvalidPassword = 'stuff' - - const u = User.build() - u.setDataValue('password', testKey) // this circumvents the setter - which we don't need in this case! - return Promise.all([ - u.verifyPassword(validPassword).then(result => assert.strictEqual(result, true)), - u.verifyPassword(intentionallyInvalidPassword).then(result => assert.strictEqual(result, false)) - ]).catch(e => assert.fail(e)) - }) - - it('deals with various characters correctly', function () { - const combinations = [ - // ['correct password', 'scrypt syle hash'] - ['test', '736372797074000e00000008000000018c7b8c1ac273fd339badde759b3efc418bc61b776debd02dfe95989383cf9980ad21d2403dce33f4b551f5e98ce84edb792aee62600b1303ab8d4e6f0a53b0746e73193dbf557b888efc83a2d6a055a9'], - ['ohai', '736372797074000e00000008000000010efec4e5ce6a5294491f1b1cccc38d3562f84844b9271aef635f8bc338cf4e0e0bac62ebb11379e85894c1f694e038fc39b087b4fdacd1280b50a7382d7ffbfc82f2190bef70d47708d2a94b75126294'], - ['my secret pw', '736372797074000f0000000800000001ffb4cd10a1dfe9e64c1e5416fd6d55b390b6822e78b46fd1f963fe9f317a1e05f9c5fee15e1f618286f4e38b55364ae1e7dc295c9dc33ee0f5712e86afe37e5784ff9c7cf84cf0e631dd11f84f3621e7'], - ['my secret pw', /* different hash! */ '736372797074000f0000000800000001f6083e9593365acd07550f7c72f19973fb7d52c3ef0a78026ff66c48ab14493843c642167b5e6b7f31927e8eeb912bc2639e41955fae15da5099998948cfeacd022f705624931c3b30104e6bb296b805'], - ['i am so extremely long, it\'s not even funny. Wait, you\'re still reading?', '736372797074000f00000008000000012d205f7bb529bb3a8b8bb25f5ab46197c7e9baf1aad64cf5e7b2584c84748cacf5e60631d58d21cb51fa34ea93b517e2fe2eb722931db5a70ff5a1330d821288ee7380c4136369f064b71b191a785a5b'] - ] - const intentionallyInvalidPassword = 'stuff' - - return Promise.all(combinations.map((combination, index) => { - const u = User.build() - u.setDataValue('password', combination[1]) - return Promise.all([ - u.verifyPassword(combination[0]) - .then(result => assert.strictEqual(result, true, `password #${index} "${combination[0]}" should have been verified`)), - u.verifyPassword(intentionallyInvalidPassword) - .then(result => assert.strictEqual(result, false, `password #${index} "${combination[0]}" should NOT have been verified`)) - ]) - })).catch(e => assert.fail(e)) - }) -}) From 4b7318ca33e7f5588fba11bb3d25def3c6c2d41b Mon Sep 17 00:00:00 2001 From: Tilman Vatteroth Date: Mon, 4 Jan 2021 13:07:44 +0100 Subject: [PATCH 05/10] Move docs into subdirectory to make mkdocs work in a subdirectory Signed-off-by: Tilman Vatteroth (cherry picked from commit eaeb88401d07687eb3db8c273f7a4c0ed31ec153) Signed-off-by: David Mehren --- README.md | 9 +- docs/configuration-config-file.md | 189 -------- docs/configuration-env-vars.md | 248 ---------- docs/content/configuration.md | 445 +++++++++++++++++ docs/{ => content}/dev/2.0.md | 0 docs/content/dev/api.md | 64 +++ docs/{ => content}/dev/db-schema.plantuml | 0 docs/content/dev/documentation.md | 37 ++ docs/{ => content}/dev/getting-started.md | 31 +- docs/content/dev/openapi.yml | 456 ++++++++++++++++++ docs/{ => content}/dev/ot.md | 0 docs/{ => content}/dev/public_api.yml | 0 docs/{ => content}/dev/webpack.md | 0 docs/{ => content}/guides/auth/github.md | 0 .../guides/auth/gitlab-self-hosted.md | 0 docs/{ => content}/guides/auth/keycloak.md | 0 .../guides/auth/ldap-ad.md} | 11 +- .../guides/auth/mattermost-self-hosted.md | 0 docs/{ => content}/guides/auth/nextcloud.md | 0 docs/{ => content}/guides/auth/oauth.md | 0 docs/content/guides/auth/saml-keycloak.md | 143 ++++++ .../guides/auth/saml-onelogin.md | 0 docs/{ => content}/guides/auth/saml.md | 0 docs/{ => content}/guides/auth/twitter.md | 0 docs/{ => content}/guides/migrate-etherpad.md | 0 .../guides/migrations-and-breaking-changes.md | 0 .../guides/minio-image-upload.md | 0 docs/{ => content}/guides/providing-terms.md | 0 docs/{ => content}/guides/s3-image-upload.md | 2 +- docs/{ => content}/history.md | 0 .../images/auth/application-page.png | Bin .../images/auth/create-oauth-app.png | Bin .../images/auth/create-twitter-app.png | Bin .../auth/gitlab-application-details.png | Bin .../images/auth/gitlab-new-application.png | Bin .../images/auth/gitlab-sign-in.png | Bin .../images/auth/keycloak_add_client.png | Bin 0 -> 54087 bytes .../images/auth/keycloak_client_overview.png | Bin 0 -> 207910 bytes .../images/auth/keycloak_clients_overview.png | Bin 0 -> 78485 bytes .../images/auth/keycloak_force_idformat.png | Bin 0 -> 6092 bytes .../content/images/auth/keycloak_idp_cert.png | Bin 0 -> 75137 bytes .../images/auth/keycloak_mapper_email.png | Bin 0 -> 52782 bytes .../images/auth/keycloak_mapper_overview.png | Bin 0 -> 30320 bytes .../images/auth/keycloak_mapper_username.png | Bin 0 -> 55010 bytes .../images/auth/keycloak_saml_export_cert.png | Bin 0 -> 181200 bytes .../keycloak_saml_export_cert_details.png | Bin 0 -> 23261 bytes .../images/auth/keycloak_saml_import_cert.png | Bin 0 -> 181214 bytes .../keycloak_saml_import_cert_details.png | Bin 0 -> 48727 bytes .../images/auth/mattermost-enable-oauth2.png | Bin .../images/auth/mattermost-oauth-app-add.png | Bin .../images/auth/mattermost-oauth-app-done.png | Bin .../images/auth/mattermost-oauth-app-form.png | Bin .../auth/nextcloud-oauth2-1-settings.png | Bin .../auth/nextcloud-oauth2-2-client-add.png | Bin .../nextcloud-oauth2-3-clientid-secret.png | Bin .../images/auth/onelogin-add-app.png | Bin .../auth/onelogin-copy-idp-metadata.png | Bin .../images/auth/onelogin-edit-app-name.png | Bin .../images/auth/onelogin-edit-sp-metadata.png | Bin .../images/auth/onelogin-select-template.png | Bin .../images/auth/onelogin-use-dashboard.png | Bin .../auth/register-oauth-application-form.png | Bin .../auth/register-twitter-application.png | Bin .../images/auth/twitter-app-confirmation.png | Bin .../images/auth/twitter-app-keys.png | Bin docs/content/images/favicon.png | Bin 0 -> 605 bytes .../images/hedgedoc_logo_horizontal.svg | 31 ++ docs/content/images/logo.svg | 14 + .../minio-image-upload/create-bucket.png | Bin .../minio-image-upload/create-policy.png | Bin .../minio-image-upload/default-view.png | Bin .../images/minio-image-upload/docker-logs.png | Bin .../minio-image-upload/open-edit-policy.png | Bin .../s3-image-upload/bucket-policy-editor.png | Bin .../s3-image-upload/bucket-property.png | Bin .../images/s3-image-upload/create-bucket.png | Bin .../images/s3-image-upload/custom-policy.png | Bin .../images/s3-image-upload/iam-user.png | Bin .../images/s3-image-upload/review-policy.png | Bin docs/content/index.md | 25 + .../legal/developer-certificate-of-origin.txt | 0 docs/{ => content}/setup/cloudron.md | 0 docs/content/setup/docker-linuxserver.md | 26 + docs/{ => content}/setup/docker.md | 0 docs/{ => content}/setup/heroku.md | 0 docs/{ => content}/setup/kubernetes.md | 0 docs/{ => content}/setup/manual-setup.md | 0 docs/content/setup/reverse-proxy.md | 96 ++++ docs/content/setup/yunohost.md | 9 + docs/{ => content}/slide-options.md | 0 docs/content/theme/styles/hedgedoc-color.css | 14 + docs/content/url-scheme.md | 39 ++ docs/dev/api.md | 42 -- docs/images/CodiMD-1.3.2-features.png | Bin 81971 -> 0 bytes docs/mkdocs.yml | 61 +++ docs/requirements.txt | 3 + docs/setup/docker-linuxserver.md | 14 - 97 files changed, 1485 insertions(+), 524 deletions(-) delete mode 100644 docs/configuration-config-file.md delete mode 100644 docs/configuration-env-vars.md create mode 100644 docs/content/configuration.md rename docs/{ => content}/dev/2.0.md (100%) create mode 100644 docs/content/dev/api.md rename docs/{ => content}/dev/db-schema.plantuml (100%) create mode 100644 docs/content/dev/documentation.md rename docs/{ => content}/dev/getting-started.md (69%) create mode 100644 docs/content/dev/openapi.yml rename docs/{ => content}/dev/ot.md (100%) rename docs/{ => content}/dev/public_api.yml (100%) rename docs/{ => content}/dev/webpack.md (100%) rename docs/{ => content}/guides/auth/github.md (100%) rename docs/{ => content}/guides/auth/gitlab-self-hosted.md (100%) rename docs/{ => content}/guides/auth/keycloak.md (100%) rename docs/{guides/auth/ldap-AD.md => content/guides/auth/ldap-ad.md} (89%) rename docs/{ => content}/guides/auth/mattermost-self-hosted.md (100%) rename docs/{ => content}/guides/auth/nextcloud.md (100%) rename docs/{ => content}/guides/auth/oauth.md (100%) create mode 100644 docs/content/guides/auth/saml-keycloak.md rename docs/{ => content}/guides/auth/saml-onelogin.md (100%) rename docs/{ => content}/guides/auth/saml.md (100%) rename docs/{ => content}/guides/auth/twitter.md (100%) rename docs/{ => content}/guides/migrate-etherpad.md (100%) rename docs/{ => content}/guides/migrations-and-breaking-changes.md (100%) rename docs/{ => content}/guides/minio-image-upload.md (100%) rename docs/{ => content}/guides/providing-terms.md (100%) rename docs/{ => content}/guides/s3-image-upload.md (97%) rename docs/{ => content}/history.md (100%) rename docs/{ => content}/images/auth/application-page.png (100%) rename docs/{ => content}/images/auth/create-oauth-app.png (100%) rename docs/{ => content}/images/auth/create-twitter-app.png (100%) rename docs/{ => content}/images/auth/gitlab-application-details.png (100%) rename docs/{ => content}/images/auth/gitlab-new-application.png (100%) rename docs/{ => content}/images/auth/gitlab-sign-in.png (100%) create mode 100644 docs/content/images/auth/keycloak_add_client.png create mode 100644 docs/content/images/auth/keycloak_client_overview.png create mode 100644 docs/content/images/auth/keycloak_clients_overview.png create mode 100644 docs/content/images/auth/keycloak_force_idformat.png create mode 100644 docs/content/images/auth/keycloak_idp_cert.png create mode 100644 docs/content/images/auth/keycloak_mapper_email.png create mode 100644 docs/content/images/auth/keycloak_mapper_overview.png create mode 100644 docs/content/images/auth/keycloak_mapper_username.png create mode 100644 docs/content/images/auth/keycloak_saml_export_cert.png create mode 100644 docs/content/images/auth/keycloak_saml_export_cert_details.png create mode 100644 docs/content/images/auth/keycloak_saml_import_cert.png create mode 100644 docs/content/images/auth/keycloak_saml_import_cert_details.png rename docs/{ => content}/images/auth/mattermost-enable-oauth2.png (100%) rename docs/{ => content}/images/auth/mattermost-oauth-app-add.png (100%) rename docs/{ => content}/images/auth/mattermost-oauth-app-done.png (100%) rename docs/{ => content}/images/auth/mattermost-oauth-app-form.png (100%) rename docs/{ => content}/images/auth/nextcloud-oauth2-1-settings.png (100%) rename docs/{ => content}/images/auth/nextcloud-oauth2-2-client-add.png (100%) rename docs/{ => content}/images/auth/nextcloud-oauth2-3-clientid-secret.png (100%) rename docs/{ => content}/images/auth/onelogin-add-app.png (100%) rename docs/{ => content}/images/auth/onelogin-copy-idp-metadata.png (100%) rename docs/{ => content}/images/auth/onelogin-edit-app-name.png (100%) rename docs/{ => content}/images/auth/onelogin-edit-sp-metadata.png (100%) rename docs/{ => content}/images/auth/onelogin-select-template.png (100%) rename docs/{ => content}/images/auth/onelogin-use-dashboard.png (100%) rename docs/{ => content}/images/auth/register-oauth-application-form.png (100%) rename docs/{ => content}/images/auth/register-twitter-application.png (100%) rename docs/{ => content}/images/auth/twitter-app-confirmation.png (100%) rename docs/{ => content}/images/auth/twitter-app-keys.png (100%) create mode 100644 docs/content/images/favicon.png create mode 100644 docs/content/images/hedgedoc_logo_horizontal.svg create mode 100644 docs/content/images/logo.svg rename docs/{ => content}/images/minio-image-upload/create-bucket.png (100%) rename docs/{ => content}/images/minio-image-upload/create-policy.png (100%) rename docs/{ => content}/images/minio-image-upload/default-view.png (100%) rename docs/{ => content}/images/minio-image-upload/docker-logs.png (100%) rename docs/{ => content}/images/minio-image-upload/open-edit-policy.png (100%) rename docs/{ => content}/images/s3-image-upload/bucket-policy-editor.png (100%) rename docs/{ => content}/images/s3-image-upload/bucket-property.png (100%) rename docs/{ => content}/images/s3-image-upload/create-bucket.png (100%) rename docs/{ => content}/images/s3-image-upload/custom-policy.png (100%) rename docs/{ => content}/images/s3-image-upload/iam-user.png (100%) rename docs/{ => content}/images/s3-image-upload/review-policy.png (100%) create mode 100644 docs/content/index.md rename docs/{ => content}/legal/developer-certificate-of-origin.txt (100%) rename docs/{ => content}/setup/cloudron.md (100%) create mode 100644 docs/content/setup/docker-linuxserver.md rename docs/{ => content}/setup/docker.md (100%) rename docs/{ => content}/setup/heroku.md (100%) rename docs/{ => content}/setup/kubernetes.md (100%) rename docs/{ => content}/setup/manual-setup.md (100%) create mode 100644 docs/content/setup/reverse-proxy.md create mode 100644 docs/content/setup/yunohost.md rename docs/{ => content}/slide-options.md (100%) create mode 100644 docs/content/theme/styles/hedgedoc-color.css create mode 100644 docs/content/url-scheme.md delete mode 100644 docs/dev/api.md delete mode 100644 docs/images/CodiMD-1.3.2-features.png create mode 100644 docs/mkdocs.yml create mode 100644 docs/requirements.txt delete mode 100644 docs/setup/docker-linuxserver.md diff --git a/README.md b/README.md index 0ebceaab3..e9017c883 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,9 @@ which you are very welcome to join. Licensed under AGPLv3. For our list of contributors, see [AUTHORS](AUTHORS). +The license does not include the HedgeDoc logo, whose terms of usage can be found in +the [github repository](https://github.com/hedgedoc/hedgedoc-logo). + [matrix.org-image]: https://img.shields.io/matrix/hedgedoc:matrix.org?logo=matrix&server_fqdn=matrix.org [matrix.org-url]: https://chat.hedgedoc.org @@ -51,15 +54,9 @@ Licensed under AGPLv3. For our list of contributors, see [AUTHORS](AUTHORS). [poeditor-image]: https://img.shields.io/badge/POEditor-translate-blue.svg [poeditor-url]: https://poeditor.com/join/project/1OpGjF2Jir - [hedgedoc-demo]: https://demo.hedgedoc.org - [hedgedoc-demo-features]: https://demo.hedgedoc.org/features - [hedgedoc-community]: https://community.hedgedoc.org - [hedgedoc-community-calls]: https://community.hedgedoc.org/t/codimd-community-call/19 - [social-mastodon]: https://social.hedgedoc.org/mastodon - [social-mastodon-image]: https://img.shields.io/mastodon/follow/49593?domain=https%3A%2F%2Fsocial.snopyta.org&style=social diff --git a/docs/configuration-config-file.md b/docs/configuration-config-file.md deleted file mode 100644 index db00e3a82..000000000 --- a/docs/configuration-config-file.md +++ /dev/null @@ -1,189 +0,0 @@ -Configuration Using Config file -=== - -You can choose to configure CodiMD with either a config file or with -[environment variables](configuration-env-vars.md). The config file is processed -in [`lib/config/index.js`](../lib/config/index.js) - so this is the first -place to look if anything is missing not obvious from this document. The -default values are defined in [`lib/config/default.js`](../lib/config/default.js), -in case you wonder if you even need to override it. - -Environment variables take precedence over configurations from the config files. -To get started, it is a good idea to take the `config.json.example` and copy it -to `config.json` before filling in your own details. - - -## Node.JS - -| variables | example values | description | -| --------- | ------ | ----------- | -| `debug` | `true` or `false` | set debug mode, show more logs | - - -## CodiMD basics - -| variables | example values | description | -| --------- | ------ | ----------- | -| `db` | `{ "dialect": "sqlite", "storage": "./db.codimd.sqlite" }` | set the db configs, [see more here](http://sequelize.readthedocs.org/en/latest/api/sequelize/) | -| `dbURL` | `mysql://localhost:3306/database` | Set the db in URL style. If set, then the relevant `db` config entries will be overridden. | -| `forbiddenNoteIDs` | `['robots.txt']` | disallow creation of notes, even if `allowFreeUrl` is `true` | -| `loglevel` | `info` | Defines what kind of logs are provided to stdout. Available options: `debug`, `verbose`, `info`, `warn`, `error` | -| `imageUploadType` | `imgur`, `s3`, `minio`, `azure`, `lutim` or `filesystem`(default) | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [MinIO](guides/minio-image-upload.md)| -| `sourceURL` | `https://github.com/codimd/server/tree/` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) | -| `staticCacheTime` | `1 * 24 * 60 * 60 * 1000` | static file cache time | -| `tooBusyLag` | `70` | CPU time for one event loop tick until node throttles connections. (milliseconds) | -| `heartbeatInterval` | `5000` | socket.io heartbeat interval | -| `heartbeatTimeout` | `10000` | socket.io heartbeat timeout | -| `documentMaxLength` | `100000` | note max length | - - -## CodiMD paths stuff - -these are rarely used for various reasons. - -| variables | example values | description | -| --------- | ------ | ----------- | -| `defaultNotePath` | `./public/default.md` | default note file path1, empty notes will be created with this template. | -| `dhParamPath` | `./cert/dhparam.pem` | SSL dhparam path1 (only need when you set `useSSL`) | -| `sslCAPath` | `['./cert/COMODORSAAddTrustCA.crt']` | SSL ca chain1 (only need when you set `useSSL`) | -| `sslCertPath` | `./cert/codimd_io.crt` | SSL cert path1 (only need when you set `useSSL`) | -| `sslKeyPath` | `./cert/client.key` | SSL key path1 (only need when you set `useSSL`) | -| `tmpPath` | `./tmp/` | temp directory path1 | -| `docsPath` | `./public/docs` | docs directory path1 | -| `viewPath` | `./public/views` | template directory path1 | -| `uploadsPath` | `./public/uploads` | uploads directory1 - needs to be persistent when you use imageUploadType `filesystem` | -| `localesPath` | `./locales` | directory for translations1 | - - -## CodiMD Location - -| variables | example values | description | -| --------- | ------ | ----------- | -| `domain` | `localhost` | domain name | -| `urlPath` | `codimd` | sub URL path, like `www.example.com/` | -| `host` | `localhost` | interface/ip to listen on | -| `port` | `80` | port to listen on | -| `path` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `host` and `port` are ignored) | -| `protocolUseSSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) | -| `useSSL` | `true` or `false` | set to use SSL server (if `true`, will auto turn on `protocolUseSSL`) | -| `urlAddPort` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) | -| `allowOrigin` | `['localhost']` | domain name whitelist | - - -## CSP and HSTS - -| variables | example values | description | -| --------- | ------ | ----------- | -| `hsts` | `{"enable": true, "maxAgeSeconds": 31536000, "includeSubdomains": true, "preload": true}` | [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) options to use with HTTPS (default is the example value, max age is a year) | -| `csp` | `{"enable": true, "directives": {"scriptSrc": "trustworthy-scripts.example.com"}, "upgradeInsecureRequests": "auto", "addDefaults": true}` | Configures [Content Security Policy](https://helmetjs.github.io/docs/csp/). Directives are passed to Helmet - see [their documentation](https://helmetjs.github.io/docs/csp/) for more information on the format. Some defaults are added to the configured values so that the application doesn't break. To disable this behaviour, set `addDefaults` to `false`. Further, if `usecdn` is on, some CDN locations are allowed too. By default (`auto`), insecure (HTTP) requests are upgraded to HTTPS via CSP if `useSSL` is on. To change this behaviour, set `upgradeInsecureRequests` to either `true` or `false`. | - -## Privacy and External Requests - -| variables | example values | description | -| --------- | ------ | ----------- | -| `allowGravatar` | `true` or `false` | set to `false` to disable [Libravatar](https://www.libravatar.org/) as profile picture source on your instance. Libravatar is a federated open-source alternative to Gravatar. | -| `useCDN` | `true` or `false` | set to use CDN resources or not (default is `false`) | - -## Users and Privileges - -| variables | example values | description | -| --------- | ------ | ----------- | -| `allowAnonymous` | `true` or `false` | Set to allow anonymous usage (default is `true`). | -| `allowAnonymousEdits` | `true` or `false` | If `allowAnonymous` is `true`: allow users to select `freely` permission, allowing guests to edit existing notes (default is `false`). | -| `allowFreeURL` | `true` or `false` | Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from [Etherpad](https://github.com/ether/etherpad-lite). | -| `defaultPermission` | `freely`, `editable`, `limited`, `locked`, `protected` or `private` | Set notes default permission (only applied on signed-in users). | -| `sessionName` | `connect.sid` | Cookie session name. | -| `sessionLife` | `14 * 24 * 60 * 60 * 1000` (14 days) | Cookie session life time in milliseconds. | -| `sessionSecret` | `secret` | Cookie session secret. If none is set, one will randomly generated on each startup, meaning all your users will be logged out. | - - -## Login methods - -### Email (local account) - -| variables | example values | description | -| --------- | ------ | ----------- | -| `email` | `true` or `false` | Set to allow email sign-in. The default is `true`. | -| `allowEmailRegister` | `true` or `false` | Set to allow registration of new accounts using an email address. If set to `false`, you can still create accounts using the command line - see `bin/manage_users` for details (In production mode, remember to run it with `NODE_ENV` set as `production` in the enviroment). This setting has no effect if `email` is `false`. The default for `allowEmailRegister` is `true`. | - -### Dropbox Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `dropbox` | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret obtained by the [Dropbox developer tools](https://www.dropbox.com/developers/apps) | - -### Facebook Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `facebook` | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret obtained by the [Facebook app console](https://developers.facebook.com/apps) | - -### GitHub Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `github` | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret obtained by the GitHub developer page. For more details have a look at the [GitHub auth guide](guides/auth/github.md). | - -### GitLab Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `gitlab` | `{baseURL: ..., scope: ..., version: ..., clientID: ..., clientSecret: ...}` | An object containing your GitLab application data. Refer to the [GitLab guide](guides/auth/gitlab-self-hosted.md) for more details! | - -### Google Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `google` | `{clientID: ..., clientSecret: ..., hostedDomain: ...}` | An object containing the client ID and the client secret obtained by the [Google API console](https://console.cloud.google.com/apis) | - -### LDAP Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `ldap` | `{providerName: ..., url: ..., bindDn: ..., bindCredentials: ..., searchBase: ..., searchFilter: ..., searchAttributes: ..., usernameField: ..., useridField: ..., starttls: ..., tlsca: ...}` | An object detailing the LDAP connection. Refer to the [LDAP-AD guide](guides/auth/ldap-AD.md) for more details! | - -### OAuth2 Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `oauth2` | `{baseURL: ..., userProfileURL: ..., userProfileUsernameAttr: ..., userProfileDisplayNameAttr: ..., userProfileEmailAttr: ..., tokenURL: ..., authorizationURL: ..., clientID: ..., clientSecret: ..., scope: ...}` | An object detailing your OAuth2 provider. Refer to the [Mattermost](guides/auth/mattermost-self-hosted.md) or [Nextcloud](guides/auth/nextcloud.md) examples for more details!| - -### SAML Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `saml` | `{idpSsoUrl: ..., idpCert: ..., issuer: ..., identifierFormat: ..., disableRequestedAuthnContext: ..., groupAttribute: ..., externalGroups: [], requiredGroups: [], attribute: {id: ..., username: ..., email: ...}}` | An object detailing your SAML provider. Refer to the [OneLogin](guides/auth/saml-onelogin.md) and [SAML](guides/auth/saml.md) guides for more details! | - -### Twitter Login - -| variables | example values | description | -| --------- | ------ | ----------- | -| `twitter` | `{consumerKey: ..., consumerSecret: ...}` | An object containing the consumer key and secret obtained by the [Twitter developer tools](https://developer.twitter.com/apps). For more details have a look at the [Twitter auth guide](guides/auth/twitter.md) | - -## Upload Storage - -Most of these have never been documented for the config.json, feel free to expand these - - -### Amazon S3 - -| variables | example values | description | -| --------- | ------ | ----------- | -| `s3` | `{ "accessKeyId": "YOUR_S3_ACCESS_KEY_ID", "secretAccessKey": "YOUR_S3_ACCESS_KEY", "region": "YOUR_S3_REGION" }` | When `imageuploadtype` be set to `s3`, you would also need to setup this key, check our [S3 Image Upload Guide](guides/s3-image-upload.md) | -| `s3bucket` | `YOUR_S3_BUCKET_NAME` | bucket name when `imageUploadType` is set to `s3` or `minio` | - -### Azure Blob Storage -### Imgur -### MinIO - -| variables | example values | description | -| --------- | ------ | ----------- | -| `minio` | `{ "accessKey": "YOUR_MINIO_ACCESS_KEY", "secretKey": "YOUR_MINIO_SECRET_KEY", "endpoint": "YOUR_MINIO_HOST", port: 9000, secure: true }` | When `imageUploadType` is set to `minio`, you need to set this key. Also check out our [Minio Image Upload Guide](guides/minio-image-upload.md) | - -### Lutim - -| variables | example values | description | -| --------- | ------ | ----------- | -|`lutim`| `{"url": "YOUR_LUTIM_URL"}`| When `imageUploadType` is set to `lutim`, you can setup the lutim url| - -1: relative paths are based on CodiMD's base directory diff --git a/docs/configuration-env-vars.md b/docs/configuration-env-vars.md deleted file mode 100644 index 999e43057..000000000 --- a/docs/configuration-env-vars.md +++ /dev/null @@ -1,248 +0,0 @@ -Configuration Using Environment variables -=== - -You can choose to configure CodiMD with either a -[config file](configuration-config-file.md) or with environment variables. -Environment variables are processed in -[`lib/config/environment.js`](../lib/config/environment.js) - so this is the first -place to look if anything is missing not obvious from this document. The -default values are defined in [`lib/config/default.js`](../lib/config/default.js), -in case you wonder if you even need to override it. - -Environment variables take precedence over configurations from the config files. -They generally start with `CMD_` for our own options, but we also list -node-specific options you can configure this way. - - -## Node.JS - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `NODE_ENV` | `production` or `development` | set current environment (will apply corresponding settings in the `config.json`) | -| `DEBUG` | `true` or `false` | set debug mode; show more logs | - - -## CodiMD basics - -defaultNotePath can't be set from env-vars - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_CONFIG_FILE` | `/path/to/config.json` | optional override for the path to CodiMD's config file | -| `CMD_DB_URL` | `mysql://localhost:3306/database` | Set the db in URL style. If set, then the relevant `db` config entries will be overridden. | -| `CMD_LOGLEVEL` | `info`, `debug` ... | Defines what kind of logs are provided to stdout. | -| `CMD_FORBIDDEN_NOTE_IDS` | `'robots.txt'` | disallow creation of notes, even if `CMD_ALLOW_FREEURL` is `true` | -| `CMD_IMAGE_UPLOAD_TYPE` | `imgur`, `s3`, `minio`, `lutim` or `filesystem` | Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) or [Minio](guides/minio-image-upload.md), also there's a whole section on their respective env vars below. | -| `CMD_SOURCE_URL` | `https://github.com/codimd/server/tree/` | Provides the link to the source code of CodiMD on the entry page (Please, make sure you change this when you run a modified version) | -| `CMD_TOOBUSY_LAG` | `70` | CPU time for one event loop tick until node throttles connections. (milliseconds) | - - -## CodiMD Location - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_DOMAIN` | `codimd.org` | domain name | -| `CMD_URL_PATH` | `codimd` | If CodiMD is run from a subdirectory like `www.example.com/` | -| `CMD_HOST` | `localhost` | interface/ip to listen on | -| `CMD_PORT` | `80` | port to listen on | -| `CMD_PATH` | `/var/run/codimd.sock` | path to UNIX domain socket to listen on (if specified, `CMD_HOST` and `CMD_PORT` are ignored) | -| `CMD_PROTOCOL_USESSL` | `true` or `false` | set to use SSL protocol for resources path (only applied when domain is set) | -| `CMD_URL_ADDPORT` | `true` or `false` | set to add port on callback URL (ports `80` or `443` won't be applied) (only applied when domain is set) | -| `CMD_ALLOW_ORIGIN` | `localhost, codimd.org` | domain name whitelist (use comma to separate) | - - -## CSP and HSTS - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_CSP_ENABLE` | `true` | whether to enable Content Security Policy (directives cannot be configured with environment variables) | -| `CMD_CSP_REPORTURI` | `https://.report-uri.com/r/d/csp/enforce` | Allows to add a URL for CSP reports in case of violations | -| `CMD_HSTS_ENABLE` | ` true` | set to enable [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) if HTTPS is also enabled (default is ` true`) | -| `CMD_HSTS_INCLUDE_SUBDOMAINS` | `true` | set to include subdomains in HSTS (default is `true`) | -| `CMD_HSTS_MAX_AGE` | `31536000` | max duration in seconds to tell clients to keep HSTS status (default is a year) | -| `CMD_HSTS_PRELOAD` | `true` | whether to allow preloading of the site's HSTS status (e.g. into browsers) | - - -## Privacy and External Requests - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_ALLOW_GRAVATAR` | `true` or `false` | set to `false` to disable [Libravatar](https://www.libravatar.org/) as profile picture source on your instance. Libravatar is a federated open-source alternative to Gravatar. | -| `CMD_USECDN` | `true` or `false` | set to use CDN resources or not| - - -## Users and Privileges - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_ALLOW_ANONYMOUS` | `true` or `false` | Set to allow anonymous usage (default is `true`). | -| `CMD_ALLOW_ANONYMOUS_EDITS` | `true` or `false` | If `allowAnonymous` is `false`: allow users to select `freely` permission, allowing guests to edit existing notes (default is `true`). | -| `CMD_ALLOW_FREEURL` | `true` or `false` | Set to allow new note creation by accessing a nonexistent note URL. This is the behavior familiar from [Etherpad](https://github.com/ether/etherpad-lite). | -| `CMD_DEFAULT_PERMISSION` | `freely`, `editable`, `limited`, `locked`, `protected` or `private` | Set notes default permission (only applied on signed-in users). | -| `CMD_SESSION_LIFE` | `1209600000` (14 days) | Cookie session life time in milliseconds. | -| `CMD_SESSION_SECRET` | no example | Secret used to sign the session cookie. If none is set, one will randomly generated on each startup, meaning all your users will be logged out. | - - -## Login methods - -### Email (local account) - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_EMAIL` | `true` or `false` | Set to allow email sign-in. The default is `true`. | -| `CMD_ALLOW_EMAIL_REGISTER` | `true` or `false` | Set to allow registration of new accounts using an email address. If set to `false`, you can still create accounts using the command line - see `bin/manage_users` for details (In production mode, remember to run it with `NODE_ENV` set as `production` in the enviroment). This setting has no effect if `CMD_EMAIL` is `false`. The default for `CMD_ALLOW_EMAIL_REGISTER` is `true`. | - - -### Dropbox Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_DROPBOX_CLIENTID` | no example | Dropbox API client id | -| `CMD_DROPBOX_CLIENTSECRET` | no example | Dropbox API client secret | - - -### Facebook Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_FACEBOOK_CLIENTID` | no example | Facebook API client id | -| `CMD_FACEBOOK_CLIENTSECRET` | no example | Facebook API client secret | - - -### GitHub Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_GITHUB_CLIENTID` | no example | GitHub API client id | -| `CMD_GITHUB_CLIENTSECRET` | no example | GitHub API client secret | - - -### GitLab Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_GITLAB_SCOPE` | `read_user` or `api` | GitLab API requested scope (default is `api`) (GitLab snippet import/export need `api` scope) | -| `CMD_GITLAB_BASEURL` | no example | GitLab authentication endpoint, set to use other endpoint than GitLab.com (optional) | -| `CMD_GITLAB_CLIENTID` | no example | GitLab API client id | -| `CMD_GITLAB_CLIENTSECRET` | no example | GitLab API client secret | -| `CMD_GITLAB_VERSION` | no example | GitLab API version (v3 or v4) | - - -### Google Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_GOOGLE_CLIENTID` | no example | Google API client id | -| `CMD_GOOGLE_CLIENTSECRET` | no example | Google API client secret | -| `CMD_GOOGLE_HOSTEDDOMAIN` | `example.com` | Provided only if the user belongs to a hosted domain. default is `undefined` | - - -### LDAP Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_LDAP_URL` | `ldap://example.com` | URL of LDAP server | -| `CMD_LDAP_BINDDN` | no example | bindDn for LDAP access | -| `CMD_LDAP_BINDCREDENTIALS` | no example | bindCredentials for LDAP access | -| `CMD_LDAP_SEARCHBASE` | `o=users,dc=example,dc=com` | LDAP directory to begin search from | -| `CMD_LDAP_SEARCHFILTER` | `(uid={{username}})` | LDAP filter to search with | -| `CMD_LDAP_SEARCHATTRIBUTES` | `displayName, mail` | LDAP attributes to search with (use comma to separate) | -| `CMD_LDAP_USERIDFIELD` | `uidNumber` or `uid` or `sAMAccountName` | The LDAP field which is used uniquely identify a user on CodiMD | -| `CMD_LDAP_USERNAMEFIELD` | Fallback to userid | The LDAP field which is used as the username on CodiMD | -| `CMD_LDAP_TLS_CA` | `server-cert.pem, root.pem` | Root CA for LDAP TLS in PEM format (use comma to separate) | -| `CMD_LDAP_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the LDAP provider | - - -### OAuth2 Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_OAUTH2_USER_PROFILE_URL` | `https://example.com` | Where to retrieve information about a user after successful login. Needs to output JSON. (no default value) Refer to the [Mattermost](guides/auth/mattermost-self-hosted.md) or [Nextcloud](guides/auth/nextcloud.md) examples for more details on all of the `CMD_OAUTH2...` options. | -| `CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR` | `name` | where to find the username in the JSON from the user profile URL. (no default value)| -| `CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR` | `display-name` | where to find the display-name in the JSON from the user profile URL. (no default value) | -| `CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR` | `email` | where to find the email address in the JSON from the user profile URL. (no default value) | -| `CMD_OAUTH2_TOKEN_URL` | `https://example.com` | sometimes called token endpoint, please refer to the documentation of your OAuth2 provider (no default value) | -| `CMD_OAUTH2_AUTHORIZATION_URL` | `https://example.com` | authorization URL of your provider, please refer to the documentation of your OAuth2 provider (no default value) | -| `CMD_OAUTH2_CLIENT_ID` | `afae02fckafd...` | you will get this from your OAuth2 provider when you register CodiMD as OAuth2-client, (no default value) | -| `CMD_OAUTH2_CLIENT_SECRET` | `afae02fckafd...` | you will get this from your OAuth2 provider when you register CodiMD as OAuth2-client, (no default value) | -| `CMD_OAUTH2_SCOPE` | `openid email profile` | The requested OAuth2/OIDC scopes, which are privileges that CodiMD can exercise on behalf of the user. Default is `openid email profile`, in order to retrieve user email/profile information via the user profile URL. | -| `CMD_OAUTH2_PROVIDERNAME` | `My institution` | Optional name to be displayed at login form indicating the oAuth2 provider | - - -### SAML Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_SAML_IDPSSOURL` | `https://idp.example.com/sso` | authentication endpoint of IdP. for details, see [guide](guides/auth/saml-onelogin.md). | -| `CMD_SAML_IDPCERT` | `/path/to/cert.pem` | certificate file path of IdP in PEM format | -| `CMD_SAML_ISSUER` | no example | Issuer to supply to identity provider (optional, default: `serverURL` config)" | -| `CMD_SAML_DISABLEREQUESTEDAUTHNCONTEXT` | `true` or `false` | true to allow any authentication method, false restricts to password authentication (PasswordProtectedTransport) method (default: false) | -| `CMD_SAML_IDENTIFIERFORMAT` | no example | name identifier format (optional, default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`) | -| `CMD_SAML_GROUPATTRIBUTE` | `memberOf` | attribute name for group list (optional) | -| `CMD_SAML_REQUIREDGROUPS` | `codimd-users` | group names that allowed (use vertical bar to separate) (optional) | -| `CMD_SAML_EXTERNALGROUPS` | `Temporary-staff` | group names that not allowed (use vertical bar to separate) (optional) | -| `CMD_SAML_ATTRIBUTE_ID` | `sAMAccountName` | attribute map for `id` (optional, default: NameID of SAML response) | -| `CMD_SAML_ATTRIBUTE_USERNAME` | `mailNickname` | attribute map for `username` (optional, default: NameID of SAML response) | -| `CMD_SAML_ATTRIBUTE_EMAIL` | `mail` | attribute map for `email` (optional, default: NameID of SAML response if `CMD_SAML_IDENTIFIERFORMAT` is default) | - - -### Twitter Login - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_TWITTER_CONSUMERKEY` | no example | Twitter API consumer key | -| `CMD_TWITTER_CONSUMERSECRET` | no example | Twitter API consumer secret | - - -## Upload Storage - -These are only relevant when they are also configured in sync with their -`CMD_IMAGE_UPLOAD_TYPE`. Also keep in mind, that `filesystem` is available, so -you don't have to use either of these. - - -### Amazon S3 - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_S3_ACCESS_KEY_ID` | no example | AWS access key id | -| `CMD_S3_SECRET_ACCESS_KEY` | no example | AWS secret key | -| `CMD_S3_REGION` | `ap-northeast-1` | AWS S3 region | -| `CMD_S3_BUCKET` | no example | AWS S3 bucket name | - - -### Azure Blob Storage - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_AZURE_CONNECTION_STRING` | no example | Azure Blob Storage connection string | -| `CMD_AZURE_CONTAINER` | no example | Azure Blob Storage container name (automatically created if non existent) | - - -### imgur - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_IMGUR_CLIENTID` | no example | Imgur API client id | - - -### Minio - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_MINIO_ACCESS_KEY` | no example | Minio access key | -| `CMD_MINIO_SECRET_KEY` | no example | Minio secret key | -| `CMD_MINIO_ENDPOINT` | `minio.example.org` | Address of your Minio endpoint/instance | -| `CMD_MINIO_PORT` | `9000` | Port that is used for your Minio instance | -| `CMD_MINIO_SECURE` | `true` | If set to `true` HTTPS is used for Minio | - - -### Lutim - -| variable | example value | description | -| -------- | ------------- | ----------- | -| `CMD_LUTIM_URL` | `https://framapic.org/` | When `CMD_IMAGE_UPLOAD_TYPE` is set to `lutim`, you can setup the lutim url | - -**Note:** *Due to the rename process we renamed all `HMD_`-prefix variables to be `CMD_`-prefixed. The old ones continue to work.* - -**Note:** *relative paths are based on CodiMD's base directory* diff --git a/docs/content/configuration.md b/docs/content/configuration.md new file mode 100644 index 000000000..a73e5bbbc --- /dev/null +++ b/docs/content/configuration.md @@ -0,0 +1,445 @@ +# Configuration + +You can choose to configure HedgeDoc with either a config file or with environment variables. + +Environment variables take precedence over configurations from the config files. They generally start with `CMD_` for +our own options, but we also list node-specific options you can configure this way. + +- Environment variables are processed + in [`lib/config/environment.js`](https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/environment.js) - so this + is the first place to look if anything is missing not obvious from this document. The default values are defined + in [`lib/config/default.js`](https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/default.js), in case you + wonder if you even need to override it. + +- The config file is processed + in [`lib/config/index.js`](https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/index.js) - so this is the + first place to look if anything is missing not obvious from this document. The default values are defined + in [`lib/config/default.js`](https://github.com/hedgedoc/hedgedoc/tree/master/lib/config/default.js), in case you + wonder if you even need to override it. To get started, it is a good idea to take the `config.json.example` and copy + it to `config.json` before filling in your own details. + +**Note:** *Due to the rename process we renamed all `HMD_`-prefix variables to be `CMD_`-prefixed. The old ones continue +to work.* + +## Node.JS + +| config file | environment | ** +default** and example value | description | | ----------- | ----------- | ----------------------------- | +-------------------------------------------------------------------------------- | | | `NODE_ENV` | `production` +or `development` | set current environment (will apply corresponding settings in the `config.json`) | | `debug` +| `DEBUG` | `true` or `false` | set debug mode, show more logs | + +## HedgeDoc basics + +| config file | environment | ** +default** and example value | description | | ------------------- | ------------------------ | +--------------------------------------------------------------------------------------------------------------------------------------------------- +| +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | | `CMD_CONFIG_FILE` | **no default**, `/path/to/config.json` +| optional override for the path to HedgeDoc's config file | | `db` | | **`undefined`** +, `{ "dialect": "sqlite", "storage": "./db.hedgedoc.sqlite" }` +| set the db configs, [see more here](http://sequelize.readthedocs.org/en/latest/api/sequelize/) +| | `dbURL` | `CMD_DB_URL` | **`undefined`** +, `postgres://username:password@localhost:5432/hedgedoc` or `mysql://username:password@localhost:3306/hedgedoc`| Set the +db in URL style. If set, then the relevant `db` config entries will be overridden. | | `loglevel` +| `CMD_LOGLEVEL` | **`info`**, `debug` ... | Defines what kind of logs are provided to stdout. Available +options: `debug`, `verbose`, `info`, `warn`, `error` +| | `forbiddenNoteIDs` | `CMD_FORBIDDEN_NOTE_IDS` +| **`['robots.txt', 'favicon.ico', 'api', 'build', 'css', 'docs', 'fonts', 'js', 'uploads', 'vendor', 'views']`** +, `['robots.txt']` or `'robots.txt'` | disallow creation of notes, even if `allowFreeUrl` or `CMD_ALLOW_FREEURL` +is `true` +| | `imageUploadType` | `CMD_IMAGE_UPLOAD_TYPE` | **`filesystem`**, `imgur`, `s3`, `minio`, `azure`, `lutim` +| Where to upload images. For S3, see our Image Upload Guides for [S3](guides/s3-image-upload.md) +or [Minio](guides/minio-image-upload.md), also there's a whole section on their respective env vars below. | +| `sourceURL` | `CMD_SOURCE_URL` | **no default** +, `https://github.com/hedgedoc/hedgedoc/tree/` | Provides the link to the source code of +HedgeDoc on the entry page (Please, make sure you change this when you run a modified version) +| | `tooBusyLag` | `CMD_TOOBUSY_LAG` | **`70`** +| CPU time for one event loop tick until node throttles connections. (milliseconds) +| | `staticCacheTime` | | **`1 * 24 * 60 * 60 * 1000`** +| static file cache time | | `heartbeatInterval` | | **`5000`** +| socket.io heartbeat interval | | `heartbeatTimeout` | | **`10000`** +| socket.io heartbeat timeout | | `documentMaxLength` | | **`100000`** +| note max length | | `linkifyHeaderStyle` | | **`keep-case`**, `lower-case`, `gfm` +| how is a header text converted into a link id | + +## HedgeDoc paths stuff + +these are rarely used for various reasons. + +| config file | environment | ** +default** and example values | description | | ----------------- | ----------- | +----------------------------------------------------- | +------------------------------------------------------------------------------------------------ | | `defaultNotePath` | +| **`./public/default.md`** | default note file path1, empty notes will be +created with this template. | | `dhParamPath` | | **`undefined`**, `./cert/dhparam.pem` | SSL +dhparam path1 (only need when you set `useSSL`) | | `sslCAPath` | +| **`undefined`**, `['./cert/COMODORSAAddTrustCA.crt']` | SSL ca chain1 (only need when you set `useSSL`) +| | `sslCertPath` | | **`undefined`**, `./cert/hedgedoc_io.crt` | SSL cert path1 (only need +when you set `useSSL`) | | `sslKeyPath` | | **`undefined`** +, `./cert/client.key` | SSL key path1 (only need when you set `useSSL`) +| | `tmpPath` | | **`os.tmpdir()`**, `./tmp/` | temp directory path1 +| | `docsPath` | | **`./public/docs`** | docs directory path1 +| | `viewPath` | | **`./public/views`** | template directory path1 +| | `uploadsPath` | | **`./public/uploads`** | uploads directory1 - needs +to be persistent when you use imageUploadType `filesystem` | + +**Note:** *relative paths are based on HedgeDoc's base directory* + +## HedgeDoc Location + +| config file | environment | ** +default** and example value | description | | ---------------- | --------------------- | +---------------------------------------------------------------- | +----------------------------------------------------------------------------------------------------------------- | +| `domain` | `CMD_DOMAIN` | **`null`**, `localhost`, `hedgedoc.org` | domain +name | | `urlPath` | `CMD_URL_PATH` | **`null`**, `hedgedoc` | +If HedgeDoc is run from a subdirectory like `www.example.com/` | +| `host` | `CMD_HOST` | **`0.0.0.0`**, `localhost` | +interface/ip to listen on | | `port` | `CMD_PORT` | **`3000`**, `80` +| port to listen on | | `path` | `CMD_PATH` | **no default**, `/var/run/hedgedoc.sock` +| path to UNIX domain socket to listen on (if specified, `host` or `CMD_HOST` and `port` or `CMD_PORT` are ignored) | +| `protocolUseSSL` | `CMD_PROTOCOL_USESSL` | **`false`** or `true` | set to +use SSL protocol for resources path (only applied when domain is set) | | `useSSL` +| | **`false`** or `true` | set to use SSL server (if `true`, will auto turn +on `protocolUseSSL`) | | `urlAddPort` | `CMD_URL_ADDPORT` +| **`false`** or `true` | set to add port on callback URL (ports `80` +or `443` won't be applied) (only applied when domain is set) | | `allowOrigin` | `CMD_ALLOW_ORIGIN` +| **`['localhost']`**, `['hedgedoc.org']`, `['localhost', 'hedgedoc.org']` | domain name whitelist (use comma to +separate) | + +## Web security aspects + +| config file | environment | ** +default** and example value | description | | -------------- | ----------------------------- | +------------------------------------------------------------------------------------------------------------------------------------------ +| +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `hsts` | | `{"enable": true, "maxAgeSeconds": 31536000, "includeSubdomains": true, "preload": true}` +| [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) options to use with HTTPS (default is the example +value, max age is a year) +| | | `CMD_HSTS_ENABLE` | **`true`** or `false` +| set to enable [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) if HTTPS is also enabled (default +is ` true`) +| | | `CMD_HSTS_INCLUDE_SUBDOMAINS` | **`true`** or `false` +| set to include subdomains in HSTS (default is `true`) +| | | `CMD_HSTS_MAX_AGE` | **`31536000`**, `60 * 60 * 24 * 365` +| max duration in seconds to tell clients to keep HSTS status (default is a year) +| | | `CMD_HSTS_PRELOAD` | **`true`** or `false` +| whether to allow preloading of the site's HSTS status (e.g. into browsers) +| | `csp` | +| `{"enable": true, "directives": {"scriptSrc": "trustworthy-scripts.example.com"}, "upgradeInsecureRequests": "auto", "addDefaults": true}` +| Configures [Content Security Policy](https://helmetjs.github.io/docs/csp/). Directives are passed to Helmet - +see [their documentation](https://helmetjs.github.io/docs/csp/) for more information on the format. Some defaults are +added to the configured values so that the application doesn't break. To disable this behaviour, set `addDefaults` +to `false`. Further, if `usecdn` is on, some CDN locations are allowed too. By default (`auto`), insecure (HTTP) +requests are upgraded to HTTPS via CSP if `useSSL` is on. To change this behaviour, set `upgradeInsecureRequests` to +either `true` or `false`. | | | `CMD_CSP_ENABLE` | **`true`** or `false` +| whether to enable Content Security Policy (directives cannot be configured with environment variables) +| | | `CMD_CSP_REPORTURI` | **`undefined`**, `https://.report-uri.com/r/d/csp/enforce` +| Allows to add a URL for CSP reports in case of violations | | `cookiePolicy` | `CMD_COOKIE_POLICY` +| **`lax`**, `strict` or `none` +| Set a SameSite policy whether cookies are send from cross-origin. Be careful: setting a SameSite value of none without +https breaks the editor | + +## Privacy and External Requests + +| config file | environment | ** +default** and example value | description | | --------------- | -------------------- | ----------------------------- | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +| | `allowGravatar` | `CMD_ALLOW_GRAVATAR` | **`true`** or `false` | set to `false` to +disable [Libravatar](https://www.libravatar.org/) as profile picture source on your instance. Libravatar is a federated +open-source alternative to Gravatar. | | `useCDN` | `CMD_USECDN` | **`false`** or `true` | set to +use CDN resources or not (default is `false`) +| + +## Users and Privileges + +| config file | environment | ** +default** and example value | description | | --------------------- | --------------------------- | +----------------------------------------------------------------------- | +-------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `allowAnonymous` | `CMD_ALLOW_ANONYMOUS` | **`true`** or `false` +| Set to allow anonymous usage (default is `true`). | | `allowAnonymousEdits` | `CMD_ALLOW_ANONYMOUS_EDITS` +| **`false`** or `true` | If `allowAnonymous` is `false`: allow users +to select `freely` permission, allowing guests to edit existing notes (default is `false`). | | `allowFreeURL` +| `CMD_ALLOW_FREEURL` | **`false`** or `true` | Set to allow +new note creation by accessing a nonexistent note URL. This is the behavior familiar +from [Etherpad](https://github.com/ether/etherpad-lite). | | `defaultPermission` | `CMD_DEFAULT_PERMISSION` +| **`editable`**, `freely`, `limited`, `locked`, `protected` or `private` | Set notes default permission (only applied +on signed-in users). | | `sessionName` | | **`connect.sid`** +| Cookie session name. | | `sessionLife` | `CMD_SESSION_LIFE` | **`14 * 24 * 60 * 60 * 1000`** +, `1209600000` (14 days) | Cookie session life time in milliseconds. | | `sessionSecret` +| `CMD_SESSION_SECRET` | **`secret`** | Cookie session +secret used to sign the session cookie. If none is set, one will randomly generated on each startup, meaning all your +users will be logged out. | + +## Login methods + +### Email (local account) + +| config file | environment | ** +default** and example value | description | | -------------------- | -------------------------- | +----------------------------- | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `email` | `CMD_EMAIL` | **`true`** or `false` | Set to allow email sign-in. The +default is `true`. | | `allowEmailRegister` | `CMD_ALLOW_EMAIL_REGISTER` | **`true`** or `false` | Set to allow +registration of new accounts using an email address. If set to `false`, you can still create accounts using the command +line - see `bin/manage_users` for details (In production mode, remember to run it with `NODE_ENV` set as `production` in +the enviroment). This setting has no effect if `email` or `CMD_EMAIL` is `false`. The default for `allowEmailRegister` +or `CMD_ALLOW_EMAIL_REGISTER` is `true`. | + +### Dropbox Login + +| config file | environment | ** +default** and example value | description | | ----------- | -------------------------- | +------------------------------------ | +------------------------------------------------------------------------------------------------------------------------------------------- +| | `dropbox` | | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret +obtained by the [Dropbox developer tools](https://www.dropbox.com/developers/apps) | | | `CMD_DROPBOX_CLIENTID` | ** +no default** | Dropbox API client id | | | `CMD_DROPBOX_CLIENTSECRET` | **no default** +| Dropbox API client secret | + +### Facebook Login + +| config file | environment | ** +default** and example value | description | | ----------- | --------------------------- | +------------------------------------ | +------------------------------------------------------------------------------------------------------------------------------------- +| | `facebook` | | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret +obtained by the [Facebook app console](https://developers.facebook.com/apps) | | | `CMD_FACEBOOK_CLIENTID` | **no +default** | Facebook API client id | | | `CMD_FACEBOOK_CLIENTSECRET` | **no default** +| Facebook API client secret | + +### GitHub Login + +| config file | environment | ** +default** and example value | description | | ----------- | ------------------------- | +------------------------------------ | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `github` | | `{clientID: ..., clientSecret: ...}` | An object containing the client ID and the client secret +obtained by the GitHub developer page. For more details have a look at the [GitHub auth guide](guides/auth/github.md). | +| | `CMD_GITHUB_CLIENTID` | **no default** | GitHub API client id | | +| `CMD_GITHUB_CLIENTSECRET` | **no default** | GitHub API client secret | + +### GitLab Login + +| config file | environment | ** +default** and example value | description | | ----------- | ------------------------- | +---------------------------------------------------------------------------- | +----------------------------------------------------------------------------------------------------------------------------------- +| | `gitlab` | | `{baseURL: ..., scope: ..., version: ..., clientID: ..., clientSecret: ...}` | An object containing +your GitLab application data. Refer to the [GitLab guide](guides/auth/gitlab-self-hosted.md) for more details! | | +| `CMD_GITLAB_SCOPE` | **no default**, `read_user` or `api` | GitLab API +requested scope (default is `api`) (GitLab snippet import/export need `api` scope) +| | | `CMD_GITLAB_BASEURL` | **no default** | GitLab +authentication endpoint, set to use other endpoint than GitLab.com (optional) +| | | `CMD_GITLAB_CLIENTID` | **no default** | GitLab +API client id | | | `CMD_GITLAB_CLIENTSECRET` | **no default** +| GitLab API client secret | | | `CMD_GITLAB_VERSION` | **`v4`** +| GitLab API version (v3 or v4) +| + +### Google Login + +| config file | environment | ** +default** and example value | description | | ----------- | ------------------------- | +------------------------------------------------------- | +------------------------------------------------------------------------------------------------------------------------------------ +| | `google` | | `{clientID: ..., clientSecret: ..., hostedDomain: ...}` | An object containing the client ID and the +client secret obtained by the [Google API console](https://console.cloud.google.com/apis) | | | `CMD_GOOGLE_CLIENTID` +| **no default** | Google API client id | | | `CMD_GOOGLE_CLIENTSECRET` | **no +default** | Google API client secret | | | `CMD_GOOGLE_HOSTEDDOMAIN` | **no +default**, `example.com` | Provided only if the user belongs to a hosted domain. default +is `undefined` | + +### LDAP Login + +| config file | environment | ** +default** and example value | description | | ----------- | --------------------------- | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| --------------------------------------------------------------------------------------------------------------- | +| `ldap` | +| `{providerName: ..., url: ..., bindDn: ..., bindCredentials: ..., searchBase: ..., searchFilter: ..., searchAttributes: ..., usernameField: ..., useridField: ..., tlsca: ...}` +| An object detailing the LDAP connection. Refer to the [LDAP-AD guide](guides/auth/ldap-ad.md) for more details! | | +| `CMD_LDAP_URL` | **no default**, `ldap://example.com` +| URL of LDAP server | | | `CMD_LDAP_BINDDN` | **no default** +| bindDn for LDAP access | | | `CMD_LDAP_BINDCREDENTIALS` | **no default**, | bindCredentials for LDAP access | | +| `CMD_LDAP_SEARCHBASE` | **no default**, `o=users,dc=example,dc=com` +| LDAP directory to begin search from | | | `CMD_LDAP_SEARCHFILTER` | **no default**, `(uid={{username}})` +| LDAP filter to search with | | | `CMD_LDAP_SEARCHATTRIBUTES` | **no default**, `displayName, mail` +| LDAP attributes to search with (use comma to separate) | | +| `CMD_LDAP_USERIDFIELD` | **no default**, `uidNumber` or `uid` or `sAMAccountName` +| The LDAP field which is used uniquely identify a user on HedgeDoc | | | `CMD_LDAP_USERNAMEFIELD` | **no default**, +fallback to userid | The LDAP field which is used as the username on HedgeDoc | | | `CMD_LDAP_TLS_CA` | **no +default**, `server-cert.pem, root.pem` +| Root CA for LDAP TLS in PEM format (use comma to separate) | | +| `CMD_LDAP_PROVIDERNAME` | **no default**, `My institution` +| Optional name to be displayed at login form indicating the LDAP provider | + +### Mattermost Login + +| config file | environment | ** +default** and example value | description | | ------------ | ----------------------------- | +-------------------------------------------------- | +--------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `mattermost` | | `{baseURL: ..., clientID: ..., clientSecret: ...}` | An object containing the base URL of your +Mattermost application data. Refer to the [Mattermost guide](guides/auth/mattermost-self-hosted.md) for more details! | +| | `CMD_MATTERMOST_BASEURL` | **no default** | Mattermost authentication +endpoint for versions below 5.0. For Mattermost version 5.0 and above, +see [guide](guides/auth/mattermost-self-hosted.md). | | | `CMD_MATTERMOST_CLIENTID` | **no default** +| Mattermost API client id | | | `CMD_MATTERMOST_CLIENTSECRET` | **no default** | +Mattermost API client secret | + +### OAuth2 Login + +| config file | environment | ** +default** and example value | description | | ----------- | ------------------------------------------- | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `oauth2` | +| `{baseURL: ..., userProfileURL: ..., userProfileUsernameAttr: ..., userProfileDisplayNameAttr: ..., userProfileEmailAttr: ..., tokenURL: ..., authorizationURL: ..., clientID: ..., clientSecret: ..., scope: ...}` +| An object detailing your OAuth2 provider. Refer to the [Mattermost](guides/auth/mattermost-self-hosted.md) +or [Nextcloud](guides/auth/nextcloud.md) examples for more details! +| | | `CMD_OAUTH2_USER_PROFILE_URL` | **no default**, `https://example.com` +| Where to retrieve information about a user after successful login. Needs to output JSON. (no default value) Refer to +the [Mattermost](guides/auth/mattermost-self-hosted.md) or [Nextcloud](guides/auth/nextcloud.md) examples for more +details on all of the `CMD_OAUTH2...` options. | | | `CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR` | **no default** +, `name` +| where to find the username in the JSON from the user profile URL. (no default value) +| | | `CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR` | **no default**, `display-name` +| where to find the display-name in the JSON from the user profile URL. (no default value) +| | | `CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR` | **no default**, `email` +| where to find the email address in the JSON from the user profile URL. (no default value) +| | | `CMD_OAUTH2_USER_PROFILE_ID_ATTR` | **no default**, `user_uuid` +| where to find the dedicated user ID (optional, overrides `CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR`) +| | | `CMD_OAUTH2_TOKEN_URL` | **no default**, `https://example.com` +| sometimes called token endpoint, please refer to the documentation of your OAuth2 provider (no default value) +| | | `CMD_OAUTH2_AUTHORIZATION_URL` | **no default**, `https://example.com` +| authorization URL of your provider, please refer to the documentation of your OAuth2 provider (no default value) +| | | `CMD_OAUTH2_CLIENT_ID` | **no default**, `afae02fckafd...` +| you will get this from your OAuth2 provider when you register HedgeDoc as OAuth2-client, (no default value) +| | | `CMD_OAUTH2_CLIENT_SECRET` | **no default**, `afae02fckafd...` +| you will get this from your OAuth2 provider when you register HedgeDoc as OAuth2-client, (no default value) +| | | `CMD_OAUTH2_PROVIDERNAME` | **no default**, `My institution` +| Optional name to be displayed at login form indicating the oAuth2 provider | | | `CMD_OAUTH2_SCOPE` +| **no default**, `openid email profile` +| Scope to request for OIDC (OpenID Connect) providers. | | | `CMD_OAUTH2_ROLES_CLAIM` | **no +default**, `roles` +| ID token claim, which is supposed to provide an array of strings of roles | | | `CMD_OAUTH2_ACCESS_ROLE` +| **no default**, `role/hedgedoc` +| The role which should be included in the ID token roles claim to grant access | + +### SAML Login + +| config file | environment | ** +default** and example value | description | | ----------- | --------------------------------------- | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| +------------------------------------------------------------------------------------------------------------------------------------------------------ +| | `saml` | +| `{idpSsoUrl: ..., idpCert: ..., clientCert: ..., issuer: ..., identifierFormat: ..., disableRequestedAuthnContext: ..., groupAttribute: ..., externalGroups: [], requiredGroups: [], attribute: {id: ..., username: ..., email: ...}}` +| An object detailing your SAML provider. Refer to the [OneLogin](guides/auth/saml-onelogin.md) +and [SAML](guides/auth/saml.md) guides for more details! | | | `CMD_SAML_IDPSSOURL` | **no default** +, `https://idp.example.com/sso` +| authentication endpoint of IdP. for details, see [guide](guides/auth/saml-onelogin.md). | | | `CMD_SAML_IDPCERT` +| **no default**, `/path/to/cert.pem` +| certificate file path of IdP in PEM format | | | `CMD_SAML_CLIENTCERT` | **no default** +, `/path/to/privatecert.pem` +| certificate file path for the client in PEM format (optional) +| | | `CMD_SAML_ISSUER` | **no default** +| Issuer to supply to identity provider (optional, default: `serverURL` config)" +| | | `CMD_SAML_DISABLEREQUESTEDAUTHNCONTEXT` | **no default**, `true` or `false` +| true to allow any authentication method, false restricts to password authentication (PasswordProtectedTransport) +method (default: false) | | | `CMD_SAML_IDENTIFIERFORMAT` +| **`urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`** +| name identifier format (optional, default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`) +| | | `CMD_SAML_GROUPATTRIBUTE` | **no default**, `memberOf` +| attribute name for group list (optional) +| | | `CMD_SAML_REQUIREDGROUPS` | **no default**, `hedgedoc-users` +| group names that allowed (use vertical bar to separate) (optional) +| | | `CMD_SAML_EXTERNALGROUPS` | **no default**, `Temporary-staff` +| group names that not allowed (use vertical bar to separate) (optional) +| | | `CMD_SAML_ATTRIBUTE_ID` | **no default**, `sAMAccountName` +| attribute map for `id` (optional, default: NameID of SAML response) +| | | `CMD_SAML_ATTRIBUTE_USERNAME` | **no default**, `mailNickname` +| attribute map for `username` (optional, default: NameID of SAML response) +| | | `CMD_SAML_ATTRIBUTE_EMAIL` | **no default**, `mail` +| attribute map for `email` (optional, default: NameID of SAML response if `CMD_SAML_IDENTIFIERFORMAT` is default) +| + +### Twitter Login + +| config file | environment | ** +default** and example value | description | | ----------- | ---------------------------- | +----------------------------------------- | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| | `twitter` | | `{consumerKey: ..., consumerSecret: ...}` | An object containing the consumer key and secret +obtained by the [Twitter developer tools](https://developer.twitter.com/apps). For more details have a look at +the [Twitter auth guide](guides/auth/twitter.md) | | | `CMD_TWITTER_CONSUMERKEY` | **no default** +| Twitter API consumer key | | | `CMD_TWITTER_CONSUMERSECRET` | **no default** | Twitter API +consumer secret | + +## Upload Storage + +These are only relevant when they are also configured in sync with their +`CMD_IMAGE_UPLOAD_TYPE`. Also keep in mind, that `filesystem` is available, so you don't have to use either of these. + +### Amazon S3 + +| config file | environment | ** +default** and example value | description | | ----------- | -------------------------- | +----------------------------------------------------------------------------------------------------------------- | +------------------------------------------------------------------------------------------------------------------------------------------ +| | `s3` | +| `{ "accessKeyId": "YOUR_S3_ACCESS_KEY_ID", "secretAccessKey": "YOUR_S3_ACCESS_KEY", "region": "YOUR_S3_REGION" }` | +When `imageuploadtype` be set to `s3`, you would also need to setup this key, check +our [S3 Image Upload Guide](guides/s3-image-upload.md) | | | `CMD_S3_ACCESS_KEY_ID` | **no default** +| AWS access key id | | | `CMD_S3_SECRET_ACCESS_KEY` | **no default** +| AWS secret key | | | `CMD_S3_REGION` | **no default**, `ap-northeast-1` +| AWS S3 region | | `s3bucket` | `CMD_S3_BUCKET` | **no default** +| AWS S3 bucket name | | | `CMD_S3_ENDPOINT ENV` | **no default** +| S3 API endpoint if you don't use AWS name | + +### Azure Blob Storage + +| config file | environment | ** +default** and example value | description | | ----------- | ----------------------------- | +----------------------------- | ------------------------------------------------------------------------- | | +| `CMD_AZURE_CONNECTION_STRING` | **no default** | Azure Blob Storage connection string | | +| `CMD_AZURE_CONTAINER` | **no default** | Azure Blob Storage container name (automatically +created if non existent) | + +### imgur + +| config file | environment | **default** and example value | description | +| ----------- | -------------------- | ------------------------------ | ------------------- | +| | `CMD_IMGUR_CLIENTID` | **no default** | Imgur API client id | + +### Minio + +| config file | environment | ** +default** and example value | description | | ----------- | ---------------------- | +----------------------------------------------------------------------------------------------------------------------------------------- +| +----------------------------------------------------------------------------------------------------------------------------------------------- +| | `minio` | +| `{ "accessKey": "YOUR_MINIO_ACCESS_KEY", "secretKey": "YOUR_MINIO_SECRET_KEY", "endpoint": "YOUR_MINIO_HOST", port: 9000, secure: true }` +| When `imageUploadType` is set to `minio`, you need to set this key. Also check out +our [Minio Image Upload Guide](guides/minio-image-upload.md) | | | `CMD_MINIO_ACCESS_KEY` | **no default** +| Minio access key | | | `CMD_MINIO_SECRET_KEY` | **no default** +| Minio secret key | | | `CMD_MINIO_ENDPOINT` | **no default**, `minio.example.org` +| Address of your Minio endpoint/instance | | | `CMD_MINIO_PORT` | **no default**, `9000` +| Port that is used for your Minio instance | | | `CMD_MINIO_SECURE` | **no default**, `true` +| If set to `true` HTTPS is used for Minio | + +### Lutim + +| config file | environment | ** +default** and example value | description | | ----------- | --------------- | ----------------------------- | +--------------------------------------------------------------------------- | | `lutim` | +| `{"url": "YOUR_LUTIM_URL"}` | When `imageUploadType` is set to `lutim`, you can setup the lutim url | | +| `CMD_LUTIM_URL` | **`https://framapic.org/`** | When `CMD_IMAGE_UPLOAD_TYPE` is set to `lutim`, you can setup the +lutim url | diff --git a/docs/dev/2.0.md b/docs/content/dev/2.0.md similarity index 100% rename from docs/dev/2.0.md rename to docs/content/dev/2.0.md diff --git a/docs/content/dev/api.md b/docs/content/dev/api.md new file mode 100644 index 000000000..960f53ef3 --- /dev/null +++ b/docs/content/dev/api.md @@ -0,0 +1,64 @@ +# API documentation + +Several tasks of HedgeDoc can be automated through HTTP requests. The available endpoints for this api are described in +this document. For code-autogeneration there is an OpenAPIv3-compatible description available [here](openapi.yml). + +## Notes + +These endpoints create notes, return information about them or export them. +You have to replace *\* with either the alias or id of a note you want to work on. + +| Endpoint | HTTP-Method | Description | +| ---------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `/new` | `GET` | **Creates a new +note.**
A random id will be assigned and the content will equal to the template (blank by default). After note creation a redirect is issued to the created note. | +| `/new` | `POST` | **Imports some markdown data into a new +note.**
A random id will be assigned and the content will equal to the body of the received HTTP-request. The `Content-Type: text/markdown` header should be set on this request. | +| `/new/` | `POST` | **Imports some markdown data into a new note with a + +given alias.**
This endpoint equals to the above one except that the alias from the url will be assigned to the note +if [FreeURL-mode](../configuration.md#users-and-privileges) is enabled. | | `//download` +or `/s//download` | `GET` | **Returns the raw markdown content of a note.** +| | `//publish` | `GET` | **Redirects to the published version of the note.** +| | `//slide` | `GET` | **Redirects to the slide-presentation of the +note.**
This is only useful on notes which are designed to be slides. | | `//info` +| `GET` | **Returns metadata about the note.**
This includes the title and description of the note as well as +the creation date and viewcount. The data is returned as a JSON object. | | `//revision` +| `GET` | **Returns a list of the available note revisions.**
The list is returned as a JSON object with an +array of revision-id and length associations. The revision-id equals to the timestamp when the revision was saved. | +| `//revision/` | `GET` | **Returns the revision of the note with some +metadata.**
The revision is returned as a JSON object with the content of the note and the authorship. | +| `//gist` | `GET` | **Creates a new GitHub Gist with the note's +content.**
If [GitHub integration](../configuration.md#github-login) is configured, the user will be redirected to +GitHub and a new Gist with the content of the note will be created. | + +## User / History + +These endpoints return information about the current logged-in user and it's note history. If no user is logged-in, the +most of this requests will fail with either a HTTP 403 or a JSON object containing `{"status":"forbidden"}`. + +| Endpoint | HTTP-Method | Description | +| ----------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/me` | `GET` | **Returns the profile data of the current logged-in +user.**
The data is returned as a JSON object containing the user-id, the user's name and a url to the profile picture. | +| `/me/export` | `GET` | **Exports a zip-archive with all notes of the current +user.** | +| `/history` | `GET` | **Returns a list of the last viewed +notes.**
The list is returned as a JSON object with an array containing for each entry it's id, title, tags, last visit time and pinned status. | +| `/history` | `POST` | **Replace user's history with a new +one.**
The body must be form-encoded and contain a field `history` with a JSON-encoded array like its returned from the server when exporting the history. | +| `/history` | `DELETE` | **Deletes the user's +history.** | +| `/history/` | `POST` | **Toggles the pinned status in the history for a +note.**
The body must be form-encoded and contain a field `pinned` that is either `true` or `false`. | +| `/history/` | `DELETE` | **Deletes a note from the user's +history.** | + +## HedgeDoc-server + +These endpoints return information about the running HedgeDoc instance. + +| Endpoint | HTTP-Method | Description | +| --------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/status` | `GET` | **Returns the current status of the HedgeDoc +instance.**
The data is returned as a JSON object containing the number of notes stored on the server, (distinct) online users and more. | diff --git a/docs/dev/db-schema.plantuml b/docs/content/dev/db-schema.plantuml similarity index 100% rename from docs/dev/db-schema.plantuml rename to docs/content/dev/db-schema.plantuml diff --git a/docs/content/dev/documentation.md b/docs/content/dev/documentation.md new file mode 100644 index 000000000..9c6ad5c56 --- /dev/null +++ b/docs/content/dev/documentation.md @@ -0,0 +1,37 @@ +# Documentation + +Our documentation is build with [mkdocs](https://www.mkdocs.org). + +## Writing + +All documentation files are found in the `docs/content` directory of +the [hedgedoc/hedgedoc repo](https://github.com/hedgedoc/hedgedoc). These files are just normal markdown files with +nothing special about them. + +The configuration for mkdocs lies in the `docs` folder in a file called `mkdocs.yml`. With that file the theme and menu + +- amoung others - can be configured. + **Please note:** Any new files need to be linked to by other files or put in the navigation or the files will be very + hard to find on the documentation website. + +## Building + +To build the documentation locally you need to perform the following steps: + +0. Make sure you have python3 installed. +1. Go into the `docs` folder. +2. Install all the dependencies (E.g. with a [venv](https://docs.python.org/3/library/venv.html)) + with `pip install -r requirements.txt` +3. Start the mkdocs dev server (`mkdocs serve`) or build the documentation (`mkdocs build`). + +## Deployment + +The documentation is deployed with [Messor Structor](https://github.com/traefik/structor). + +The necessary Dockerfile and version menu template and also the github action to build the whole documentation can be +found in the [docs.hedgedoc.org repo](https://github.com/hedgedoc/docs.hedgedoc.org). This repo is also used to deploy +the actuall website to github.io. + +Messor Structor builds and deploys the documentation by finding all branches that follow the pattern `v*`. For each +branch the docs are generated separately by first installing the dependencies from `requirements.txt` and then running +mkdocs. Afterwards the menu go template is used to include a version switcher in the theme. diff --git a/docs/dev/getting-started.md b/docs/content/dev/getting-started.md similarity index 69% rename from docs/dev/getting-started.md rename to docs/content/dev/getting-started.md index 9a35b71ab..77e3e180d 100644 --- a/docs/dev/getting-started.md +++ b/docs/content/dev/getting-started.md @@ -1,26 +1,24 @@ -Developer Notes -=== +# Getting started ## Preparing for running the code **Notice:** *There's [specialised instructions for docker](../setup/docker.md) or [heroku](../setup/heroku.md), if you prefer running code this way!* -1. Clone the repository with `git clone https://github.com/codimd/server.git codimd-server` +1. Clone the repository with `git clone https://github.com/hedgedoc/hedgedoc.git hedgedoc-server` (cloning is the preferred way, but you can also download and unzip a release) -2. Enter the directory and run `bin/setup`, which will install npm dependencies - and create configs. The setup script is written in Bash, you would need bash - as a prerequisite. -3. Setup the [config file](../configuration-config-file.md) or set up - [environment variables](../configuration-env-vars.md). +2. Enter the directory and run `bin/setup`, which will install npm dependencies and create configs. The setup script is + written in Bash, you would need bash as a prerequisite. + +3. Setup the [config file](../configuration.md) or set up + [environment variables](../configuration.md). ## Running the Code -Now that everything is in place, we can start CodiMD: - -4. `yarn run build` will build the frontend bundle. It uses webpack to do that. -5. Run the server with `node app.js` +Now that everything is in place, we can start HedgeDoc: +1. `yarn run build` will build the frontend bundle. It uses webpack to do that. +2. Run the server with `node app.js` ## Running the Code with Auto-Reload @@ -32,11 +30,10 @@ rebuild the frontend or restart the server if necessary. The commands will stay active in your terminal, so you will need multiple tabs to run both at the same time. -4. Use `yarn run dev` if you want webpack to continuously rebuild the frontend - code. -5. To auto-reload the server, the easiest method is to install [nodemon](https://www.npmjs.com/package/nodemon) - and run `nodemon --watch app.js --watch lib --watch locales app.js`. +1. Use `yarn run dev` if you want webpack to continuously rebuild the frontend code. +2. To auto-reload the server, the easiest method is to install [nodemon](https://www.npmjs.com/package/nodemon) + and run `nodemon --watch app.js --watch lib --watch locales app.js`. ## Structure @@ -44,7 +41,7 @@ The repository contains two parts: a server (backend) and a client (frontend). most of the server code is in `/lib` and most of the client code is in `public`. ```text -codimd-server/ +hedgedoc-server/ ├── docs/ --- documentation ├── lib/ --- server code ├── test/ --- test suite diff --git a/docs/content/dev/openapi.yml b/docs/content/dev/openapi.yml new file mode 100644 index 000000000..f0a180265 --- /dev/null +++ b/docs/content/dev/openapi.yml @@ -0,0 +1,456 @@ +openapi: 3.0.1 + +info: + title: HedgeDoc + description: HedgeDoc is an open source collaborative note editor. Several tasks of HedgeDoc can be automated through this API. + version: 1.7.1 + contact: + name: HedgeDoc on GitHub + url: https://github.com/hedgedoc/hedgedoc + license: + name: AGPLv3 + url: https://github.com/hedgedoc/hedgedoc/blob/master/LICENSE + +externalDocs: + url: https://github.com/hedgedoc/hedgedoc/blob/master/docs/dev/api.md + + +paths: + + /new: + get: + tags: + - note + summary: Creates a new note. + description: A random id will be assigned and the content will equal to the template (blank by default). After note creation a redirect is issued to the created note. + responses: + default: + description: Redirect to the new note + post: + tags: + - note + summary: Imports some markdown data into a new note. + description: A random id will be assigned and the content will equal to the body of the received HTTP-request. + requestBody: + required: true + description: The content of the note to be imported as markdown + content: + 'text/markdown': + example: '# Some header' + responses: + default: + description: Redirect to the imported note + + /new/{alias}: + post: + tags: + - note + summary: Imports some markdown data into a new note with a given alias. + description: 'This endpoint equals to the above one except that the alias from the url will be assigned to the note if [FreeURL-mode](../configuration-env-vars.md#users-and-privileges) is enabled.' + requestBody: + required: true + description: The content of the note to be imported as markdown + content: + 'text/markdown': + example: '# Some heading' + responses: + default: + description: Redirect to the imported note + parameters: + - name: alias + in: path + required: true + description: The alias for the note-id under which the note will be saved + content: + 'text/plain': + example: my-note + + /{note}/download: + get: + tags: + - note + summary: Returns the raw markdown content of a note. + responses: + 200: + description: The raw markdown content of the note + content: + 'text/markdown': + example: '# Some heading' + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note which should be downloaded + content: + 'text/plain': + example: my-note + + /{note}/publish: + get: + tags: + - note + summary: Redirects to the published version of the note. + responses: + default: + description: Redirect to the published version of the note + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note which should be published + content: + 'text/plain': + example: my-note + + /{note}/slide: + get: + tags: + - note + summary: Redirects to the slide-presentation of the note. + description: This is only useful on notes which are designed to be slides. + responses: + default: + description: Redirect to the slide version of the note + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note which should be shown as slide + content: + 'text/plain': + example: my-note + + /{note}/info: + get: + tags: + - note + summary: Returns metadata about the note. + description: This includes the title and description of the note as well as the creation date and viewcount. + responses: + 200: + description: Metadata about the note + content: + 'text/json': + schema: + type: object + properties: + title: + type: string + description: The title of the note + default: Untitled + description: + type: string + description: The description of the note or the first words from the note + viewcount: + type: integer + minimum: 0 + description: How often the published version of the note was viewed + createtime: + type: string + description: The timestamp when the note was created in ISO 8601 format. + updatetime: + type: string + description: The timestamp when the note was last updated in ISO 8601 format. + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note for which the info should be shown + content: + 'text/plain': + example: my-note + + /{note}/revision: + get: + tags: + - note + summary: Returns a list of the available note revisions. + description: The list is returned as a JSON object with an array of revision-id and length associations. The revision-id equals to the timestamp when the revision was saved. + responses: + 200: + description: Revisions of the note + content: + 'text/json': + schema: + type: object + properties: + revision: + type: array + description: Array that holds all revision-info objects + items: + type: object + properties: + time: + type: integer + description: UNIX-timestamp of when the revision was saved. Is also the revision-id. + length: + type: integer + description: Length of the document to the timepoint the revision was saved + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note for which revisions should be shown + content: + 'text/plain': + example: my-note + + /{note}/revision/{revision-id}: + get: + tags: + - note + summary: Returns the revision of the note with some metadata. + description: The revision is returned as a JSON object with the content of the note and the authorship. + responses: + 200: + description: Revision of the note for the given timestamp + content: + 'text/json': + schema: + type: object + properties: + content: + type: string + description: The raw markdown content of the note revision + authorship: + type: array + description: Data which gives insights about who worked on the note + items: + type: integer + description: Unique user ids and additional data + patch: + type: array + description: Data which gives insight about what changed in comparison to former revisions + items: + type: string + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note for which the revision should be shown + content: + 'text/plain': + example: my-note + - name: revision-id + in: path + required: true + description: The id (timestamp) of the revision to fetch + content: + 'text/plain': + example: 1570921051959 + + /{note}/gist: + get: + tags: + - note + summary: Creates a new GitHub Gist with the note's content. + description: 'If [GitHub integration](https://github.com/hedgedoc/hedgedoc/blob/master/docs/configuration-env-vars.md#github-login) is configured, the user will be redirected to GitHub and a new Gist with the content of the note will be created.' + responses: + default: + description: Redirect to the created gist (or the GitHub authentication before) + 404: + description: Note does not exist + parameters: + - name: note + in: path + required: true + description: The note which should be pasted to GitHub gist + content: + 'text/plain': + example: my-note + + /me: + get: + tags: + - user + summary: Returns the profile data of the current logged-in user. + description: The data is returned as a JSON object containing the user-id, the user's name and a url to the profile picture. Requires an active session of the user. + responses: + 200: + description: If the user is logged-in, the user data otherwise `{"status":"forbidden"}` + content: + 'text/json': + schema: + type: object + properties: + status: + type: string + description: ok if everything works as expected, forbidden is the user is not logged-in + id: + type: string + description: Unique id of the user + name: + type: string + description: The user's display name + photo: + type: string + description: An url to the online stored user profile photo + + /me/export: + get: + tags: + - user + summary: Exports a zip-archive with all notes of the current user. + responses: + default: + description: The zip-archive with all notes + + /history: + get: + tags: + - user + summary: Returns a list of the last viewed notes. + description: The list is returned as a JSON object with an array containing for each entry it's id, title, tags, last visit time and pinned status. + responses: + 200: + description: The list of recently viewed notes and pinned notes + content: + 'text/json': + schema: + type: object + properties: + history: + type: array + description: The array that contains history objects + items: + type: object + properties: + id: + type: string + description: The id or alias of the note + text: + type: string + description: The title of the note + time: + type: integer + description: The UNIX-timestamp when the note was last accessed by the user + tags: + type: array + description: The tags that were added by the user to the note + items: + type: string + pinned: + type: boolean + description: Whether the user has pinned this note + post: + tags: + - user + summary: Replace user's history with a new one. + description: The body must be form-encoded and contain a field `history` with a JSON-encoded array like its returned from the server when exporting the history. + requestBody: + required: true + content: + 'application/x-www-form-urlencoded': + example: 'history=[{"id":"example","text":"Untitled","time":1556275442010,"tags":[],"pinned":false}]' + responses: + 200: + description: History replaced + delete: + tags: + - user + summary: Deletes the user's history. + responses: + 200: + description: User's history deleted + + /history/{note}: + post: + tags: + - user + summary: Toggles the pinned status in the history for a note. + description: The body must be form-encoded and contain a field `pinned` that is either `true` or `false`. + requestBody: + required: true + content: + 'application/x-www-form-urlencoded': + example: 'pinned=false' + responses: + 200: + description: Pinned state toggled + parameters: + - name: note + in: path + required: true + description: The note for which the pinned state should be toggled + content: + 'text/plain': + example: my-note + delete: + tags: + - user + summary: Deletes a note from the user's history. + responses: + 200: + description: Pinned state toggled + parameters: + - name: note + in: path + required: true + description: The note for which the pinned state should be toggled + content: + 'text/plain': + example: my-note + + /status: + get: + tags: + - server + summary: Returns the current status of the HedgeDoc instance. + description: The data is returned as a JSON object containing the number of notes stored on the server, (distinct) online users and more. + responses: + 200: + description: The server info + content: + 'text/json': + schema: + type: object + properties: + onlineNotes: + type: integer + description: How many notes are edited at the moment + onlineUsers: + type: integer + description: How many users are online at the moment + distinctOnlineUsers: + type: integer + description: How many distinct users (different machines) are online at the moment + notesCount: + type: integer + description: How many notes are stored on the server + registeredUsers: + type: integer + description: How many users are registered on the server + onlineRegisteredUsers: + type: integer + description: How many of the online users are registered on the server + distinctOnlineRegisteredUsers: + type: integer + description: How many of the distinct online users are registered on the server + isConnectionBusy: + type: boolean + connectionSocketQueueLength: + type: integer + isDisconnectBusy: + type: boolean + disconnectSocketQueueLength: + type: integer + +tags: + - name: note + description: These endpoints create notes, return information about them or export them. + - name: user + description: These endpoints return information about the current logged-in user and it's note history. If no user is logged-in, the most of this requests will fail with either a HTTP 403 or a JSON object containing `{"status":"forbidden"}`. + - name: server + description: These endpoints return information about the running HedgeDoc instance. diff --git a/docs/dev/ot.md b/docs/content/dev/ot.md similarity index 100% rename from docs/dev/ot.md rename to docs/content/dev/ot.md diff --git a/docs/dev/public_api.yml b/docs/content/dev/public_api.yml similarity index 100% rename from docs/dev/public_api.yml rename to docs/content/dev/public_api.yml diff --git a/docs/dev/webpack.md b/docs/content/dev/webpack.md similarity index 100% rename from docs/dev/webpack.md rename to docs/content/dev/webpack.md diff --git a/docs/guides/auth/github.md b/docs/content/guides/auth/github.md similarity index 100% rename from docs/guides/auth/github.md rename to docs/content/guides/auth/github.md diff --git a/docs/guides/auth/gitlab-self-hosted.md b/docs/content/guides/auth/gitlab-self-hosted.md similarity index 100% rename from docs/guides/auth/gitlab-self-hosted.md rename to docs/content/guides/auth/gitlab-self-hosted.md diff --git a/docs/guides/auth/keycloak.md b/docs/content/guides/auth/keycloak.md similarity index 100% rename from docs/guides/auth/keycloak.md rename to docs/content/guides/auth/keycloak.md diff --git a/docs/guides/auth/ldap-AD.md b/docs/content/guides/auth/ldap-ad.md similarity index 89% rename from docs/guides/auth/ldap-AD.md rename to docs/content/guides/auth/ldap-ad.md index e74121f10..b7d0284e5 100644 --- a/docs/guides/auth/ldap-AD.md +++ b/docs/content/guides/auth/ldap-ad.md @@ -1,9 +1,8 @@ -AD LDAP auth -=== +# AD LDAP auth -To setup your CodiMD instance with Active Directory you need the following configs: +To setup your HedgeDoc instance with Active Directory you need the following configs: -``` +```env CMD_LDAP_URL=ldap://internal.example.com CMD_LDAP_BINDDN=cn=binduser,cn=Users,dc=internal,dc=example,dc=com CMD_LDAP_BINDCREDENTIALS= @@ -13,7 +12,6 @@ CMD_LDAP_USERIDFIELD=sAMAccountName CMD_LDAP_PROVIDERNAME=Example Inc AD ``` - `CMD_LDAP_BINDDN` is either the `distinguishedName` or the `userPrincipalName`. *This can cause "username/password is invalid" when either this value or the password from `CMD_LDAP_BINDCREDENTIALS` are incorrect.* `CMD_LDAP_SEARCHFILTER` matches on all users and uses either the email address or the `sAMAccountName` (usually the login name you also use to login to Windows). @@ -24,7 +22,6 @@ CMD_LDAP_PROVIDERNAME=Example Inc AD `CMD_LDAP_PROVIDERNAME` just the name written above the username and password field on the login page. - Same in json: ```json @@ -38,4 +35,4 @@ Same in json: }, ``` -More details and example: https://www.npmjs.com/package/passport-ldapauth +More details and example: diff --git a/docs/guides/auth/mattermost-self-hosted.md b/docs/content/guides/auth/mattermost-self-hosted.md similarity index 100% rename from docs/guides/auth/mattermost-self-hosted.md rename to docs/content/guides/auth/mattermost-self-hosted.md diff --git a/docs/guides/auth/nextcloud.md b/docs/content/guides/auth/nextcloud.md similarity index 100% rename from docs/guides/auth/nextcloud.md rename to docs/content/guides/auth/nextcloud.md diff --git a/docs/guides/auth/oauth.md b/docs/content/guides/auth/oauth.md similarity index 100% rename from docs/guides/auth/oauth.md rename to docs/content/guides/auth/oauth.md diff --git a/docs/content/guides/auth/saml-keycloak.md b/docs/content/guides/auth/saml-keycloak.md new file mode 100644 index 000000000..2745087cd --- /dev/null +++ b/docs/content/guides/auth/saml-keycloak.md @@ -0,0 +1,143 @@ +# How to setup HedgeDoc SAML with Keycloak + +## Configuring Keycloak + +### Get the public certificate + +1. Select the Realm you want to use for your HedgeDoc SAML +2. Select "Realm Settings" in left sidebar +3. Select the "Keys" tab +4. Click the button "Certificate" at `RS256` algorithm + ![keycloak_idp_cert](../../images/auth/keycloak_idp_cert.png) +5. Copy this key and save it to the file specified in `saml.idpCert` property of the HedgeDoc configuration + or `CMD_SAML_IDPCERT` environment variable + +### Create a new client + +1. Select "Client" in left sidebar + ![keycloak_clients_overview](../../images/auth/keycloak_clients_overview.png) +2. Click on the "Create" button +3. Set a Client ID and specify this in `saml.issuer` property of the HedgeDoc configuration or `CMD_SAML_ISSUER` + environment variable +4. Select `SAML` as Client Protocol +5. Set Client SAML Endpoint to `https://hedgedoc.example.com/auth/saml` (replace `https://hedgedoc.example.com` with the + base URL of your HedgeDoc installation) + ![keycloak_add_client](../../images/auth/keycloak_add_client.png) +6. Leave "Client Signature Required" enabled +7. Set Root URL to `https://hedgedoc.example.com` (replace it here also with the base URL of your HedgeDoc installation) +8. Set Valid Redirect URIs to `https://hedgedoc.example.com/auth/saml/callback` (you should also define all other + domains of your HedgeDoc installtion with the suffix `/auth/saml/callback`) +9. Set Base URL to `/` + ![keycloak_client_overview](../../images/auth/keycloak_client_overview.png) +10. _(optional)_ You can set which Name ID Format should be used + +## Configure HedgeDoc + +### Config file + +You have to put the following block inside your `config.json`: + +```json +"saml": { + "issuer": "hedgedoc", // Change to the "Client ID" specified in the Keycloak Client + "identifierFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "idpSsoUrl": "https://keycloak.example.org/auth/realms/test/protocol/saml", // replace keycloak.example.org with the url of your keycloak server + "idpCert": "/path/to/the/cert.pem", + "clientCert": "/path/to/the/key.pem" // this one is optional, see below +} +``` + +### Environment Variables + +- `CMD_SAML_IDPSSOURL`: `https://keycloak.example.org/auth/realms/test/protocol/saml` (replace keycloak.example.org with + the url of your keycloak server) +- `CMD_SAML_IDPCERT`: `/path/to/the/cert.pem` +- *(optional, see below)* `CMD_SAML_CLIENTCERT`: `/path/to/the/key.pem` +- `CMD_SAML_ISSUER`: `hedgedoc` (Change to the "Client ID" specified in the Keycloak Client) +- `CMD_SAML_IDENTIFIERFORMAT`: `urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified` + +## Client certificate *(optional)* + +If you want keycloak to be able to verify HedgeDoc, you hava to create a client certificate. There are two options for +this: + +### Create Private Keys for Signing + +1. Generate the private key and certificate with the following commands: + +```shell +openssl genrsa -out priv.pem 2048 +openssl req -new -x509 -key priv.pem -out cert.pem +``` + +*execute the following steps in keycloak* + +2. Select "Client" in left sidebar +3. Go to your HedgeDoc-Client +4. Select the "SAML Keys" tab + ![keycloak_saml_import_cert](../../images/auth/keycloak_saml_import_cert.png) +5. Click on "Import" +6. Select `Certificate PEM` as "Archive Format" +7. Now upload the generated cert.pem (in this case named `cert.pem`) + ![keycloak_saml_import_cert_details](../../images/auth/keycloak_saml_import_cert_details.png) +8. Click on "Import" +9. Move or copy this key (in this case named `key.pem`) and save it to the file specified in `saml.clientCert` property + of the HedgeDoc configuration or in the enviroment-variable `CMD_SAML_CLIENTCERT` + +### Convert Private Certificate generated by KeyCloak + +Instead if generating you own certificate, you can also use the one generated by keycloak. + +1. Select "Client" in left sidebar +2. Go to your HedgeDoc-Client +3. Select the "SAML Keys" tab + ![keycloak_saml_export_cert](../../images/auth/keycloak_saml_export_cert.png) + +5. Now click on "Export" +6. Here you can select the output format, choose `PKCS12`. You also have to set a password. Choose your own. + ![keycloak_saml_export_cert_details](../../images/auth/keycloak_saml_export_cert_details.png) +6. Click on "Download" and save the file somewhere on you computer +7. You now have to extract the private Key. You can do this with the following command. WHen asked, enter your password. + +```shell +openssl pkcs12 -in keystore.p12 -out key.pem -nocerts -nodes +``` + +8. Move or copy this key (in this case named `key.pem`) and save it to the file specified in `saml.idpCert` property of + the HedgeDoc configuration or in the enviroment-variable `CMD_SAML_CLIENTCERT` + +## Use Persistent Identifiers + +Instead of using the username as the owner-key in the HedgeDoc database, you can also use a persistent identifier. This +allows to change the username, without them loosing access to their notes. + +1. Go to the HedgeDoc-Client in keycloak. Now enable the option "Force Name ID Format" and select "persistent" as the " + Name ID Format". + ![keycloak_force_idformat](../../images/auth/keycloak_force_idformat.png) +2. For HedgeDoc to be able to use the username and email configured in keycloak, you have to create the following SAML + protocol mappers: + 2.1. Create a mapper with the type `User Property`. Set the Name, Property and SAML Attribute Name to `username`. Now + you can specify a friendly name (for example `Username`) + ![keycloak_mapper_username](../../images/auth/keycloak_mapper_username.png) + 2.2 Create a mapper with the type `User Property`. Set the Name, Property and SAML Attribute Name to `email`. Now you + can specify a friendly name (for example `E-Mail`) + ![keycloak_mapper_email](../../images/auth/keycloak_mapper_email.png) + +The configured mappers should look like this: +![keycloak_mapper_overview](../../images/auth/keycloak_mapper_overview.png) + +3. You now have to add the following block to the saml-definition inside your `config.json`: + +```json +"attribute": { + "username": "username" + "email": "email", +} +``` + +It you configure HedgeDoc with enviroment variables, these are the ones you have to set: + +```bash +CMD_SAML_ATTRIBUTE_USERNAME=username +CMD_SAML_ATTRIBUTE_EMAIL=email +``` diff --git a/docs/guides/auth/saml-onelogin.md b/docs/content/guides/auth/saml-onelogin.md similarity index 100% rename from docs/guides/auth/saml-onelogin.md rename to docs/content/guides/auth/saml-onelogin.md diff --git a/docs/guides/auth/saml.md b/docs/content/guides/auth/saml.md similarity index 100% rename from docs/guides/auth/saml.md rename to docs/content/guides/auth/saml.md diff --git a/docs/guides/auth/twitter.md b/docs/content/guides/auth/twitter.md similarity index 100% rename from docs/guides/auth/twitter.md rename to docs/content/guides/auth/twitter.md diff --git a/docs/guides/migrate-etherpad.md b/docs/content/guides/migrate-etherpad.md similarity index 100% rename from docs/guides/migrate-etherpad.md rename to docs/content/guides/migrate-etherpad.md diff --git a/docs/guides/migrations-and-breaking-changes.md b/docs/content/guides/migrations-and-breaking-changes.md similarity index 100% rename from docs/guides/migrations-and-breaking-changes.md rename to docs/content/guides/migrations-and-breaking-changes.md diff --git a/docs/guides/minio-image-upload.md b/docs/content/guides/minio-image-upload.md similarity index 100% rename from docs/guides/minio-image-upload.md rename to docs/content/guides/minio-image-upload.md diff --git a/docs/guides/providing-terms.md b/docs/content/guides/providing-terms.md similarity index 100% rename from docs/guides/providing-terms.md rename to docs/content/guides/providing-terms.md diff --git a/docs/guides/s3-image-upload.md b/docs/content/guides/s3-image-upload.md similarity index 97% rename from docs/guides/s3-image-upload.md rename to docs/content/guides/s3-image-upload.md index 7ca8dd12f..626119dac 100644 --- a/docs/guides/s3-image-upload.md +++ b/docs/content/guides/s3-image-upload.md @@ -77,7 +77,7 @@ Guide - Setup CodiMD S3 image upload } ``` -9. In additional to edit `config.json` directly, you could also try [environment variables](../configuration-env-vars.md). +9. In additional to edit `config.json` directly, you could also try [environment variables](../configuration.md). ## Related Tools diff --git a/docs/history.md b/docs/content/history.md similarity index 100% rename from docs/history.md rename to docs/content/history.md diff --git a/docs/images/auth/application-page.png b/docs/content/images/auth/application-page.png similarity index 100% rename from docs/images/auth/application-page.png rename to docs/content/images/auth/application-page.png diff --git a/docs/images/auth/create-oauth-app.png b/docs/content/images/auth/create-oauth-app.png similarity index 100% rename from docs/images/auth/create-oauth-app.png rename to docs/content/images/auth/create-oauth-app.png diff --git a/docs/images/auth/create-twitter-app.png b/docs/content/images/auth/create-twitter-app.png similarity index 100% rename from docs/images/auth/create-twitter-app.png rename to docs/content/images/auth/create-twitter-app.png diff --git a/docs/images/auth/gitlab-application-details.png b/docs/content/images/auth/gitlab-application-details.png similarity index 100% rename from docs/images/auth/gitlab-application-details.png rename to docs/content/images/auth/gitlab-application-details.png diff --git a/docs/images/auth/gitlab-new-application.png b/docs/content/images/auth/gitlab-new-application.png similarity index 100% rename from docs/images/auth/gitlab-new-application.png rename to docs/content/images/auth/gitlab-new-application.png diff --git a/docs/images/auth/gitlab-sign-in.png b/docs/content/images/auth/gitlab-sign-in.png similarity index 100% rename from docs/images/auth/gitlab-sign-in.png rename to docs/content/images/auth/gitlab-sign-in.png diff --git a/docs/content/images/auth/keycloak_add_client.png b/docs/content/images/auth/keycloak_add_client.png new file mode 100644 index 0000000000000000000000000000000000000000..79121b15a731da26a43680a3c452db2ea42efd8b GIT binary patch literal 54087 zcmeFZXIN8Pw>GS(SP>Nz0cp}in)F@-kuD0-35fKL^j<_!Q9x;-BhsXX-a-)(DWND3 zdI0GV2sMci0`Fu$+vhp&Ia@qGzF+V4`2)FFi?HULquk>j_gJs)-%}(zLv!ZHkt1Zv zN_RAm969N6-o!bw+jF(X-^#+iH z*7c;^prDt&tK67mF-_OZIDy<__HbGW((O&QeWU;d0GB{ywAqj=~y#{P?ls z!@E8HYu+=#C-0Cv%fZ+11Z?=VZl`YUjKFxL$L77ZfBwuoMRxS~1=%Bqe33MM?}(}` z_1?6MOv_=v_idDdy(RhZUpcs{afxvVn_1Ov^ru@tF`qc)A+=G#&+&%`xv<7^^eIHc zC#mzqA&>jlpOe%KdNjyv!Wk`h*vkI@$Nb;!<|h#u%gYxpGF|4>*&U2DD62Ho{Pto8^=4a-|A+JS*QZPhSJjwsXkK;h-< zFPb}EL-n(3TKImB z==vwiJ$_+LFjz8oi0s_Cm^|%#%VP1X#_gfCBPw6g;_B7K5y3R-kfPDCT9`c-M6phT zzN9rn+=x~Ab~^P=o=IbaHJ0a(u76?8?I>@Vxr>UU#zqU3Nz9qcH>=%f>1f$|6i*!V^MD7PT>}b86J)1jNtv=`8sd z=eq;k>=^=nrmyh&qX%JWDA%FEH^gu0^899B&&{)@r>FPk>+;$R6eK)*_Dn_Y@zZ2+ zZxvyCJzkl;pBc&G?j7C^dV29&i+zfhC@2)5b*aJ*iC^NyEOUe$MjmeE*Llk*s4KXC zNazVB5@vg3_G2pS25ad&M*`~W>$9wSQZ4=FhUW<3v?3iv5crt1K?t4)Qk!^08oSjI z%Q*|4k!NtJE=kbFcJ7CR+BEAx9Sk^D^-5&OVUBc!WdELQl_sjrd$SS!49*)STg2NU z={zZ0v$unWutg^)U!NAnM2Dd9Bh%q|y6OCI zUqo4tGLJZTKpp!a(YQULFfLtQ!dy9ng!e9g!qp?iXvJNINy;i*zNp`6lpqc z6TkJE&9ZH`$_ntCX(%$XpQBo z9dX>8DdO%f-TP3J05PXx!(2_)8UhB+%E*Y6D%4j>5!Y<>Q&3by_^#HopFDr9?bemn z;49n)O6UOx79O4f`aE4&!y7t6?I@Z^B(h%r@NRRg!JlCC6jHc6a6yWZ@mn|R_h-X2 zkNf_Zn6w#np^pbt`X6N6P56ea7-hDanjv=Onwri|9?_@1-yQKmK{jmb#+<aH zxAmJRTj_l}0|o-{7!+q;jz-nyRWX;C(fhhE_fD;}!rPdI?->ryiz>^T3UF!KeR(r4 z=xOH8xoZ)+y)+&@dMmm1>DUJXv(48JjE88jwjW%e{clh%1qQ_}VscggcIF^wQ{_a7kjg2qf`w_R%W=1Z$21 zq}Hwd{>2s1w590BYMmw(Wr2Kx$vPB)fihMiwdb}%$!NzqgX9kn0?)PIyQ2p_cq4nW zRA`g+p*l^QM%_BbRn!K5zUt8Y8GT$Mk^znU~=(X$4r z(*I=ot609VyVxuoQ>*HM8C&FcRMak@H>z?>A+zrpblaX{RgD`Wdbq1Oj8;|Q!Bd>WL6usJ(5uKZ%FXyVnet zi8d{BCpRnxd}(TG>JFPPpRWirET5wLP zj|%BIr7m)z=-$tbjN&k=eR9_O8hJG}^Ks1xf*f)9#`iJV!!gNmS7HJN9 z_h6)ajpR_}$MovFN|r~fCcHn|B5!uzw2=C!s;Zl(x41n1`MR%~$$Z=xj=#zIML9~W zad2&{B(t2puA>uf-tKIdsa;3&(r)OFyLYrJ?pk_LcOJkmy>QRfvx$$Y98og}-p0<2 zRPc4oUU}z!++e0mZvM8%@(>^K2g$ye?o*U1Pt6?~5l4IWq}my$C6e|&k8AIQS~FJG zEn^Yw#;ZpN#AB>cES>B^?&@Uh(e^*{k7k87)%rR4?u#y7cw2jIqwcB`$8_wCCd(>R zNvpqwXPq5)5woZonS@sJkABwITCmN{%~<7VwglS;4Df5EJQW2@%e&i~D_;C|BZ?uU z*qQ7kM;C&2-a`(kVNbG{S(;hW=_jhtn+_1ceq{FLdKz=ve3QmtqE-@SB?-y@Wyxh{ z%Vr)s|I~TVA~%I9nV9XdGQxwbb?v5j-Aq;23WA`Pr)Gn#>)XE4y z_^h6_`klpz+V`fcF?WDLSzrGdBjQ)d!3XR4QY|el!^NU44=dP`9%gn@_ZepGoBj3m?`b*fOM~_zWLa-ubyIp*tFJGS8M#CD7ihv?1{&vmF1CTX9Wfe4Hd7;9n187*(i8pj-6v}x*E!-zt*Q&WPKdiNnL$jBR}9f?oC)J>rpE~Tt>TmNlTb9;q;;7UWs=r z5Od&B)yP5L2|W9`;RJT3Q-{H6rj-VwLre^4^lY$9qwBeM@GAwL&E&#PG8y z-62TdJb^&f?yR!^+0N@vp+fR#;hPm?KGZ0Xh~@WMdju_5_A5i$Lb&<+SMI>w7N^GK z%IyY=giUI<=aOdk2&+{;oJO(@W2N_ZH$C9}cCdP#N{3Ol9w~hC8yX>%&~wyNxRM_~ zer$9K^t>efnrK*gYj|ke0PeA34l;lDxk8XGg)a;^i^2?w9xji2PSo>zZNU*lFbF6+Sax>ddAt;;*AaLP6$9!EF#^v68 zQDJiy)Ih#aT4x@?gMN%}MP8w#oH-Yc6`?PWTp87ZS`TbW&&89jMr1d6j%1bjZY{8; z1xmMMjf{BnO&ngzQ>q+AG2l~uF(uyd%sGbT*6->zIygNnh6)mmCvr3xXvda3vJ&ed z9>W&=R^8WZdNW^<`Bm6pG7Zypay46q0pv$7;|-pJzxm*apS0K7d+Q){QK4SRXKy{- z5#$nTQwZ{1uND9KEbq`0l;?!Mu$r{{QvbGN*ZOucG%VXY^PUHB2g?)k?S8pQ)~(#f zI2)ni0}%`g(&Y6Dco~^SnW7m zs<2gcddy$!Y0nlOJwM$VIovEB8XtcZ`pqyBW>nMLeLMe+d%}WFp+OD$EB)E?=POO9 zMk?)x?bBew(rkBDN2{E&Aq(yRKnu@n^sd42^smIaLnO-ep9s%ln2tW+d^Ju zGU7BckgYB;uUHW&qCG~#g?1UL6~xV_1v&-_$b~#cnGCnKs&0vJS|1+ZQkmXwj~-M2 zlX;iR4O;RL%yxQ&FBBTdo>2}X+JU7C030O3DY;%yPidjY?bN6X8R{ZOg>O85bD={sOXj3Loc+XV72IBYxOuf&_9$k zVR4^dw5T1ER!dn1&$fGMmsO&}Wd{evAu6=<0BFBsR%{0t(k9=muX2+cR$yjg7Z7qg ziHEyz|A>(%%AIG<=N=vD`D@l82B;T$@+f4!j=lyrvxd^kvf!e=Q47i<29>yT(5aT! z@N50viQ=~U_5o+*2gL`m9g%brj)Z=l20!my%YdUnp@))Q_kW%cj8rkXwh*r!NiUV0 zKVm7Y1qs!M-lG?^eoI^e0In;_EzJm$Qfby2(QPPnydhq_8Aa<<$JZkdNii$pYAK+z zp^@?*5v0ELD5&q=^gy;kRHjDBorEVNx;n}0QH}xYE=Ic+0dhfZYvJ#1HsqQXOtX<$ z5QlA}>U4Xt@G?%2&i`oQokq zw8=57fVaEzyb9$u&SeE5Z-u>3XifR~w?`UueoNl+Qa@ ztPOt}M)}uLZbr)N-Ox39@_e(rXtdsQ)tHdA`EBCyjR)7qLK_vro+Y@~DkfIczsNEU ztfbMGIiPqRcaDFx5@GPbRXv&Z+3tPVHo%8|NyX>dyEOSVoHi*SKOyYLY~`+zYC8xp z986429^EvS?D0}jR-N&tA&L7T#3zp(O8v>EU$7o7waA|C-&MyKBWGWu zgt!?C46BN`ecS}QU=2T~&Kg!oIF5z*Z!{&+>%f(ac{JbNIk2ULNR^!b%=&W%tAyqz&aPoIQ8rUIU{jN(Zv)QY1 zYw=LgaM}6GIn>xZGkNM37tJOqs4ALs+C|IhUg41X=sRY{En!o$9Y1aSF-JgK5mkgu zGvY$*Zi)Hg>_?xcr8zC_HO?7ryUb=j&Aow)lNKB>tL3SJKhjn0a8EP#|Jfd0e)EH_zC;6%-<- zlIk+*YfLNr=2j!egBF~AmWnpKwIpLv=KYQ*6H}Kle540ZS<5~Px!PUry?u2d zHWLAMt@4MLX*c{x47jSTdguwU`iPrndyUjNJ^HFNWQhIV3$sv@dx0YX18Q6jeYPfw zefD{Q`+L+ys)3O@lUMrV02t*VO1R9N+7#;T9(*us@Kr=1^oqt?5sjY+%pIrP6iQxp zzp##MmO%Z~N#3qHb$9eI4l|H(DK_4Kj@Gy$^x7@&tg7~H`g5WdP`3f96i~?#4f{mM zt_UUfH%c1hCN|h~z?1`=onOAXqh+s+xmmVbtP^g#`CaN!k50UJY7VkdJhc2M3|_3e zI*5g9L0uy#CIp$RcAogHH4#4e{xJ4ksi>3__3yK?>wwYT+TZMv!IjhZ-83eA6|)bNiSYn&qXj9E~)dLW7D@#3>0or7n?hbs_8F;y9OY z?6LteDO_YvJA3OI0ydi4DLGsog^)4z#D|Tq;F~A- zxlKimpRdu=W2CKx=xp5c8>!)>MW859o2Ve}f@CKOeK_72*f?r;?IabK9^+Xmo|qjh zTJ@R!O|iN=rv(%PwWR4eUQ_W_sxsy{h|AO)&tvq`j9RBYzHv7q;3wuWecJ&)f4uN8 zv*p$ptjX)i)ygS=>d>R{5jq8WeA}Bn7TrteeL~|t!sUD|CH|6tPOJ2%ol#1f0+@dN zz!;RK4lT4e8pW!5r!`xBJ__k%o!JQOIXso0+SNT?rxqU0<{HB^m-K3~?@;k_H=Hi%-7cHYvR2DP zRJ(QAlS%dIuI{0m`i>qN2#=7^-+WIP%;vqh^)1(Dten4ym~>XFKg-W^dFWkwPU+~N zQm$04b|yhpmtq^O0lly5^bzh_5wn3UO)sh(L0DOxa>rI<=u|%@1;_uP96QB08BF4> zS(1ORw!ksxUP`9YyX!UG9t+=?;DMZf>`;{Q%C+8xKf*BU?|8)0TvtWR|JLbBQT>WH3j3t95VMFy^TGQ=+`o*9it5X-2eZKmd zU-{FmlT9SY;q<#M2{eDOtW#d0N1BSP>J%-555-Vmcj>ugi_uNI&|Id&S?B+k9~1i{ zE9jRN;Qz~=ozw=L5hZylgVx~*SN2G78OiwgcvN!o8$~9{wabm~_MVz=3^r$MR?o{X> z4e69Qn{07X!nxLqhbkQa^A=2UUAEXz*7$hypYA+*oS%Yms7oz$`cJMABzyEC;}AC^ z?^DymE9`@-38ybCTe3AjIcz)sBC^4rURb{Jma6I2;e_GAqB@VC@(_srA^Il+V!SU4 z?mXM}`q9-tFUk@)d_uePwLhNd4MuS1i5Z1k=RnI^E%*bhaJ};t})O83}x8q0?ZNz z029OqkKqOtddwb?fGE%}GvZNER(=Px3d(YFpBrgfK|j>IHG*zGkKFO@Z`%lryeIrN zOI>#k?vR8`rcpd`S+p{o$*r`ocnrIFX?c|yasG~KVexeyEj)i3+g1VBp7ai+JMr%4 z9&TyIvZ7q3-~cK--sOPZ0tDg#i9%aF=kYo+5_-^gu^lYpreMDp1NuIQR4HG6$*%~6 zYO3Fc^7`f`!WkoXzB8Ur9@Lh+$UJTM+tKPPzde{>zXQt^v88`@ge3LGTES_97lJ$- zT^$c?pK1^lVT3_7$^6Yc0-0n;y@jL$xUS5-9 zsK?m#hWKszhRio(W5v%T#RJm{#3`8}IgYW#AEZkk-RGvRT6$Rr-+1{YL1psWb!q<1 zB^u4|V@WBMHhpZT$;e_iW)W8NE>Jtm?qnNIi^lyu-|x1AH?{Lbd+e0NZF*T~D?Ju_ z6?TcllzCytu^SnRk#R#qdbyw`V_{{j@vqdGTk`LbCKPP?fi^PAnD9-Wyd6NSWihfq z#c&!{#fWR~TxL6l35XaDW}pOsYDjN?34je=lL;^?YTWawnF`~a0R+nxx=qj&umJg= z-(^OreOce}qR$jHPv~zI}zqXaP6OsZ;Rwpe3_X z(|MkaogHBoDa9r-;a3K^Uh9j;2;cD#Bnxz}TdmuSAo^@}i70S}U~7dPM%w)GD63;O za;VN{ViCXdPG>$K=Hktk?zwv;SdQ0uOYOtMHp}M)W~Jzer$U+8-;c&Pff69`&0r7%MZBK87k##u^$DP~1|(n%-x! ziYW_)8>H8IZ_e5Cwih5+?5YWU8ZyH?LZV3LYCvgwyqYc#F5qb`(1wp}83Ch*gr*Z!~(><90wXv3AqV1iP;0o{SB--afgwh zeCH_jt-q4snJ8I8Sc~~cTy$^o!(n^!d_O)JoBO37cg3pjh5CA=hEYThT8`B9rW9P7 z;$^@VaGlJc$ij;lX6fiXsQGZ$men~sB~vWjw})QJryuh?DaB)BMj3$QBvju3dihcL zW8G$BG7q7T$RmT_-G=8D7OV*mdTdx7N3Kv)FXBpoil)+c{QNc1Z!6xOCxrxyjO%Mr zsv`ap&XYl|b&EZVR;@;3DbrUESl3NAS~_2OBv=><#BA|($l4JH z_GuPjKC|bAW>FWjj&*LEZ{t>@ac_;c@$1$0)X$PSCc9cSVd2V3aokp`eY1)Ap;!2P z*Ry$EC8ux4Q2o30OtAVaA48PdN-0r4$&|Xny$c;Z9?kh*PRHwm=w# z)@g<~RM;X*n=qh9xI7P{o#8+c#I8|eVh6XvNx-c{4;uS+k@k!T-nvIilhc@E*_G(g zGiDM633##+B}+{YLZe2nirueY574(H>a?VwLBX!b&I z&nx;%l9aboVue;-L*wlwwV@jpPeH&nXhBK!u9T?6-h|x$n4hu>T4yextq$YQ_JP|kMUDG zn{L1V{J$aCWF1MveEoG=DmAZFhtuazSL%|I9#?vG$+XmSB49oR7U^%OQ(%x1o?3nU zx5@e67Z~ehi;lzPSGUv3CP=a9b|euNMRm76W>0^AXLBD@uR2aIviHB0VBQc^AGdrNZ8Z#wzvcP0V0fdo^zz2HeM~G{IBh#&wayggzY<<$F^Z!b_7@yv zIzYpxK;|!jy@|6@th+(zCZ9WQ=?fu=}!wwJG3Qog+?0HEUU0r=$9*%`ZH37`H= z{?)+~-4=-w4$jC?(4Bz%HV`HYT2SHeE;P9N- z|JI^wb{wQ_v*3k=zDslz%+YKCj3G|6HwkzKXB@VAyCot(7Z*FaTFcu?bY=d%lL6}D z70GrbWf@P#^2!Q#ndSbBn^F19K18Gg~Mdoe;ZWkkY^-6hT zEh7@~RXxd~^t2}eH2c`0!u>=$B56;;ErHv=_Wz%j?{b@Q;wdUyod&TQ$c4By)3`r= z9e}-(R`vjX<*$*xS_YNYsXxTeGX@3CpAv0Gbp?((d(OCOjH;lRJjXeo)uwKyCY(NG zJu|7Y4csk8MfTJ-;{~tE9r`*fw$js?N^QFgeAPI;svJjoLW=6|VjA)HwoT_E`5ku1 zYeWov{ z=Yst%v{hxr4;JWKae9=Ef;>N4QR1Z9_w^z!?%9_+>sV|%X2l4U8PD&?Hbdl4avP;r z*$&woBf((5vmX0;m1E0UhT7upb^R8l=}b(xGM$Bif(NKsqv@A-T^80Z`f@Qb-G2J? zDa$R!PqQ@Azss@zi8!e|Z=F>6IA`|hebnd!)}(8uE0b8+=H9TdvLh~1j7f{Ql>hwc zg{b!=kLAx&Rkk-u&dkh=cU7Ey{*G5{q6xn0&qy&Is2GtZ$~19r-}nl*@zUbzi|s#g zCPzr7w0S=$oH-AkBq-;sS_=Pz>(@1*9{8;qewjnOZ%s1T&oFFwb0PlXA-najWxtgH zmEZPsr`E4C|95cv?`9r+?d*l+x%dd$!;bW?-wxgd#dH^gRqE5c>iT5 z|8JToXuH{~wXdW8GJVQR!C$@{fA#X^4VDZkk%LBghii`%dzocd?PN)nEmEa{h%?N6 znA>||!k0;;GeJNx`(Db;Xg2lQLs^8Q$9ZHw;g@cQ@J_n$8~}b0y$=@*QGV>+Ar2JuI*6D4FKevfyyZHl_UiTPXlen=A?LDN6`+#v z{_&jZPRN0Ny5peAokc*YWMpJ$*T6uN_FQ)gXG_@SvUvf!2M-=xqNcW?^|bc11N`N#XLL=Po*}elAI=39YR{ zc_cl1@d5!f^jTi(Q#>&3{770MTNcnOkXS_zpn+U3Y91kLC3GRB2ZMr_)jo6my=PI< z1b==fOi6Q(Gz^RaxCaB_vb^B^y441PeZ|r$C?;S^b#--nNFtTXCJ;%nDTGnJ17*E{ z{6}9VqG(Yes2=V)A}V~#mqf+H#0GaVn13I_c(RXNhEr*!SuqCzy3G%d^6bq}B3}U+ctXaA5-MCn`rE_mHdMU9Qz<|t20rO<`mff^ z)7Jn6FA8NDVnikY7>JudDN+3}Uq>Cl5R2wevdSrs$xp!^CS%LOWE#xZuV>y%5g)E+ zZ5^x!VwM5r5cEanyF-kgn{!fTpf57nzH*S&0?5>57 z-L>ogXxf^odJ&B`u*mZr%yu$(vU4EG3c>-+ymRXLvuDeK9s07>S866FC%39bmXHP& zw(Xp-x~b9^PC!FxUx7Io_6QkY7B0LpaPvoD|b4DCsoZgu&Ia)cI;LKy%#FxN5CbH&>A2Xc8d$2XbZhkGi8ASn;tGZN$= z{%BArsi<5c^QhPmc0i-xRe%m{UNMG&JuLGb$tLHc!=p<(fB>ppHcOSvPGL2KTzcWs zk~mL4>#K^#csU#tnHA0X@Z;Mb`ZfNOpeQXxRzz4t_u&{WTzGU0b09A9F9;pO;I0i2 zMyi~6?FI^-_%fXQJziNmelV@*^}6#Yh?KRT0ByU%-*hndLj4*;o3F~pYgozEd{wtV z&lEp_#dYuQhXJ801}6>i(Z^?X71*3uel7^v8%7ydQ}woP7a?ae_P6I5YG$HT`RmI8 zq2=K{3kKt$c41V!j`{HdcD4OjAW|2Q=sKi#aHjrz-}xyZ~3e|!q$x)=cdqsH|<7Gi#o08#%@xTjMbQ;x9-5VdVpS#0a)8v~_u^sLZ6 zZYF|G!k(&j%*9eY{|%N?SXjqRE#eA2ed;hbt{PLAuibY@Q7)+shBUP%xHduk;72h8 zdh@&MtqfCWG-qv{%T8Q;yfx>2AiH9-Ii`X#6Y;;0yf^+q;dQnQi_gS%o*fDWP0tWK zsS?M2>X2OU_=sSve74#)5_BQ%v1DdYUK31R5m3r|oSrWj z0TUbi$pZvH`?7!*O{a7BlSg3iG9lH~Qx3mh2qvKPyVz0l7)tjf9z)9JD|{rV9vl^^tAv1OkjO(j=W2IU{R=Qc438YgYwe*Wa?|6tVr@!fNE&`>O{=ll8^G#Bs6$`6C7 zJTOs1EE8g@zsKn(WZ$pz;m&FAoyDBlgK5aq6l`t4e^`JD#ckVyEa(LpEgMivx{cxi zBgOmr3U?_}L1;;>XCW^C_8PzZ%Yy3~9?i_HYWXA4`3m}cPORUy01A@&W&fgrL z89HIWRG{4k{Gga{2?$Pk;Z?45zmJ+HR6bS7hKDvC;Hu|Jvia_`g4U1nt;+g<9F!d> zsrl^&xM~)&la{#;q5~NEY>VO0vS-X^vI3*DU>=I+UDdb`0yAt_pjUDZWoMm_KM=!( z!f8lP9zXt4XVca?5C2zm^PiWvUuLPky_64Ic4?=X>INa1XL}iVI1>|-M?o!Rxz5B~ zIT?erQNJ9qVQr%??jrAGcmYyD6p2mU_R(Tvx^)~b4&{qSJbkXp z!o>HWBbI}^kjIAY0b2p`g2=5~vN}b^?6e|I?-GUbl*`z{zf4SM+>GJnESuZC&YdI_ z$8A`ZWRc*hR8yLjWkwL5ve@A=tc@Xi7idx`2N(dAfzyO#(Jk zu8DdLk;1FSy$bEeOSLN#*Mu|m_~4YAAF=|?Z!K8HS)>YhHe3_)QKJ#DWn}#vhR72N zR7T#6Q%>axORqOV4QKs`=AZ^<3fyCeT z5bQ^_)*a4Hdi;3XB3GQ^fJLHip}v(o#37K&ki*?>&_#M@Xq`g1A9;ns_3no*-Qv@( zJ%e)cPaVJ*@Y)Y%;h`=^!>WL2fqrgnexs3)^o{r8(*->)mEJ-06{dn&@p+RQyH{$5qg z#3t^(w0WMp&qcYLx8E~yR^~>FU>xXR` z!JE()OEbZCHYG^q&!r5A|ktSzx{5H zzKJH>(meq``Zz(_tg_Rj`U^E>+AU;t?J5k=)GP1rtt4j4iEf@Vgu3F^*W(O?^28Xf z>PQk0;#N{B-M`Q5zm9GH9^+>DCJ6yjVq17xha%Ip)#HQj1RD!m2S$ouK9Fo;|C097 zHLj}otO)mnS*h$i&%MuCR6n1+fwm@#G1vRL#s2(x9Il8NC!U;{_dd(Q&#yAzG{iDU zzHEhGMo#MF`v}-^Wczu3jg(P^-h*~n(2b5RO&5-OcEHYFvGO?kzYy2>{VO)VILkCY zdKD%8(E!=e`|-9^0`MKO8283;1TXpq9Jd^crQP@NB?s7gvXS$ad&eEXUHn`nx#fC@ zY24^1sVSx0Y`O3)D~cHi>OSVH=R1Y~8kT=)tL5tXp8o~Aq{cWH_qe<4qGj*;PI%Jn z1`plrS2U?oss6bBXsEj3@GN8HZw81_memYSy1A*i@eT*3ieeEvn|- z{~qlBr}e!!(!>);^~d{yNqB&S>66KY=07RBjsk*mTjH1f{5}9sIs-P1Wbf%!`acC% zfbI|zfAk;O_d$T|y|PC2W$llv0X5VfXlVQotoGlY_Jq-=s-VcoAOGI+=Q@n6tSu3! zb*uCgrK4A?p-?E@^XVRvTP&gf_+hdQX8>WzDMJ4DrUmam4I-`C!L~94DygY;2AXzk z^S6SAjt#1|g3R-@*XHx&7ytBFl#E9w`sJc114MO#jL*pbO@9V|=6;{<=;BgJ<}Lwx zq1EhKL3bOizh6f$t*mqf!mqr?f4=`uTd|?|$xycEg_#g}E+?W)UZ&#eaHl%lpZ*_e%`dCN47n?P|etY;QesACZiY`FnFU zC&N>>{t30+_c~CV^}ruz{yNd1)>B_v*`HnsHUC2rDnu`?MOJ$KL`gz7*H~(K|ux|lO ze1Buq3iJ10dOJ^2L$_=z>(k6FKbtD?Lg@w0Vbgr~1v$gJs;}YDdct`n#GE>-Aj_SD zx0ZZk5<%2rY0bCdOZYK`x~z3~UfD~TwC>Kqr!7EJYojwdQf2+yeVgwEuYmOE^Xwj3 zk}x7y>s{0+7`I@d`nT2o*Ja-SbmEL!F?xF1As1xp6muUgF|n5IW+~4>N@tVMf9d07 z)2ZTx?Bd>B6Vn8=%0tGuHqb*Y60{$>52grB795zFGiIXO(~^qaG9Yo)wy`QMo8cjy zX|bDbj_evKQ5EO`)mGKf8vpLjVVU;!=y&|P?@ro3FAS{-UeArKbaWE!xlLS!N3(0R zOH(XITqEX5ZhpydnSLKkjq#bqR+%Fc-Kisf_okXVntlDRxqhJM*`c0jwiIzUw+I#% z(II-f{^H=x_|!o&AE{sZ?mb@;gYE4RJ6L=0v6E-IW-4|B%V4|>J37Mq#K%Z@lb}aj}K53ol@q}2;L-+P_xQxmL`{u9lUxo|WJ&XoePIXr0a+YTgrgy(% zoF}$C0lR{!PD_JH?zM$z=39pMJL9u-9lj;)jcj)1f2(slpi}?rzW>WEWa&>)#)qLK z<7pv(dja^#*ppVe-j5HMhpV4t5c7;`O2-2Ci3ii9!^Nf{L`mEJ8-)2%3&aedF`%H1 z8%@ULppnuE z*Wn(kaT~K8?QaboW0sJ4mRI%M+{*nV7hUxUgQTa=oQcUNU}IHBD@q0x6cpMsd$LEu z9#yP*=(Fc))_m~WMhX(VzfF#2p)KgtCq%>uDL)q}w-H9L^!(I7Om6F6kN{M=sa{*@ z=X!cDqQ{OMv#%y>*g18`7*@3_QDBxzJFOmfw_Vv3gT=*m-+J`VQTx8qi8FUv9Pi5p z&2DbsI^15heozP-*&MkxNF}%#Iqr+ty#Uv|O?zefUy+k>@Weq~STh@EI0LBWiXZ4> z}f+64rC`|L~z}#>t&=>mdfr+3vAeCx=d6C)P znE+;=0LJtCQRfND*bl0=(KVnP={Okj?g^)tG5``p4pURpZo9KfB8&N&eF2XB#SOb9 z_Rl-Fy;Hxmw1{!)QCzxY{zgBp+ROUo8$S$3u1-bR8-KLatH?-Coi6d6grAF6rLKdH z-Ww$^W;({}XNad65a1OIEABMs>=cSaKYNnbt6!%Pdi(Wac&767-E5!A+PclJS8H%f z0X(r~$JA~W#8z}A3RlkCJ%r6=x=U)2FW~2CbEbEE>AmiZ6CQmyew;G)M>D;%4kp5D z{W7&_oaMkex*{SjLI1XY>zlLxlzD@9FWk7$CAh5=Onj_+NkO zAbM*jxl+8swgYbx$d=~68%*4B9!qlBR1dMYxPRNW-q)Cip^gyhCuH%#Puw(F(s=?h zOk=FKKGj=%+aGF2r!5f?;)!~a@3!dYIE=P;?^O7gD`j4^{{G>4xg*K|ypG2a4@c&W z0IEfFDB2F#cq$l}cYFZe_G8yPafwx>4e+B5N@9U~euho?{_dd50OY|o#|**C zX&#V0C1BC)fQ)g|nZF{k-@pk70xw^xm-{j8>l5Jt{=TY>oUpe}+53!mDM6#TE)#3Q z$QJ&Jn9o+ck-+55-1`m5=N1MPBj{utk9{i#xKQXSX1G3yEKtJJp4S2q6Nj`+Ga!RN zVMg5kzWBGQ27=L7x)PO$KJIrotzO43S(`AJoEBNVe&a@4R?oM$7rtjjS3EW7A?#Q- zd{Xsj^`82otd&A%k(SXj=&XCptWZz-$wnq(bNm0wF#icLm=pZ_$|(f&=A5-l7!Vr| zU{Xf2-8rjz)`XkTwT%O+AGVn+pxr4b<7iY!t8L`g@u293^sUCcNJ-*n>*2=zpyMa0qB|~gnxhlwMymK^Zjr@cX@y77*cT=8PH_Dz zyhN1uzJ_aHg{sNlZ<%Pzl^vOl#7+p=a9Ux@NF!_vOCGl*Ghjz3=Aac3^isC@fei2T-CY?22eM!iE84%kPD%EyeJ8ao!o)e*`*v%_JwT4`FfZQMSmu#Ey5J z`Ihx83VGVOT(6XsKMc<6^fBBl(yRD-Jm+!>#G|e}#mFpDc?z6F2gTVfFw?rN3jk0?K!M# zCg4zS&f(*PWWJ2oxK@$5S12SfV6y%1VwbdM?@;VEJ%_LNJ!GS z7a82@&o^O>+@(mdbW7^i60^I*4fNhq`Zc8*yu-Eb@ZFz%MiNvI(%#Ws^BOPfkM$lY z!x^j7?P;TEz$sqGpQF2;r5byQ*yOyZ$vXQn_iFDfqbGF|0n;FVQ#bF?P2b(wp%Sx= zv5$PXlO6x6SbDBhe^b#1v#`m-?85E4zPoEbnuQCHfsu=0)IQzc&nL!;sU!r>iyG|A zd)ZuC3Rcgzgf-%9^&1|??h<=+4E6IJeioku{k2HD)=-ZGyeRa~r4r7S;@OQU% zv%(If$4ndF{F7FZn%S#YuGqpQCq(agoY=r z1ULb0RH+M6MPllVRmi}FvTKjtfl~g&5*rXBCFIIt-&LUZI(&4foGXon`Fks|to+!d zMO@L2yB$J3gtWs+bT&(OqIkaIk_S$sacFHLj2?<83~?$p&4mxN zAO8|5y)@6+Idedqxd%1~yNWj9MIkA^if=kr5Gm+7f;CX^q?l*G=y2 zDACjJmBX1v%;-j|qD`CAqUhK@BAtnagC@deMrOyx8!TZBdS&wy(>-;M0)OsxyzW87 z^fZ?C&T73R4NePm5{%H&lHf$I2 zTLX6%*}q#P3D_B|4nDHdI{T)#^$nMsF=5QQh8z2ndd<6sXo#Rz_etid7An&pSmLJGC49^a-!c z0IgYx;HMHWEh!@T;BS4TfXN%QFnSvt>?rbHbQo-|ZdX_eQPwNMG$wj==f$NZ<}v~; zrMg{XTO!uQF%C9yp#!jT?m{gc%f;4qtABQB&I6a0^7CkKG1qFzFwNUzEPazZux$qv z=^<@XntA5RTEtq7tvY3T^$R|Zuf8VN-5}mx%#0it(9RAJF1SV*5Z!k5wtYXA<;tG0 ziGX#_9t{*^!n88f*}?j5W^nJ@yGmt-SG?s zO94%@ol((?ArOeplc6=MnWa7d*$~gK9cRj9#^)`)6)J2ja8%=_0mW!NTkn+}vTT@M zu0z0)Wzo3BAbzou?X*C9KtgbSI8e=9MnJ2Yigc7E?A`VZ)h(RCu!4E`_U&RFfr&?Q zYou7+4&VWue%;ze78^It|Mil!UBwe_IpY(Eb>Xer1|3#$UH%_#%MAGrN-`x`%+~Yh>92B)BOBwU`JJ}mZ7Lpk)hUv z&0kvEIADdFVmYi|kU(u$oYa8g|LL>6k#EBv@R{A^>+Vznrro#a+vu`I)r3#9pZKh5 z!rD3up+*BnkL%&dPHP-+D&HsT$Clo641xIm@J`&Tdg#$w<3Ko1&9{T(@*T6%kx2i? zk|rp~H<;w&vgOsp?L`YCxw>T(yysbNJKIBSw{v@=*!$agn38;Lp4CQdB1`7*$@@@R z#{rhld!PEggSp6q+JVdWngx_^;HEyYsk~8t>Q;W%xr&Xp?@?XSpTB3Pm3MV_aV;(v z(Fq}FBKOxQw!d(_^2-|bUByE0c1V#+UT1Aqjb{iQjKOzS({Z=$G8#dByKP=e&el#i zZVaDcT+x84*xTmiQYBhsyrx`-*3J!YQgM|>?ht!sFHte@9wV4={Fpo0W)et9;o`sC z_IGf-v;exz3(yRIpdI0%@WW~k7GppK&~xM)&`eNEdO3$q*Wxh%gYsV+JOUcd^2A@i?9$gYQ*!h8Y$&u!ZQH9(s%VfjQCl{2EUKhKzh_bS zEP3JzQ?Ia;amQ}dDCngdb}zLybk&8z409+#&gb(fq_emxD#sMV#vEr(GgOo_vtcvmoMz73Fo)lBUDf6Kyt}^F z@A~7q$?)W#_<7Eh;5UTY0C4? zI)n8f_0aWXaD3mo(F3swB2TSl>ur0Q3hJaI_brEBOj4CxG-9o|7eEnQM)-oqtcA1# zXV^y$c%4hS6|ny=G^|(cSX4r=fWP9GdG8vtW*Pw{FHY<*{IIqWNplH$*zr(~29 zqlhgYZ>+aHARKT{tgn`bqV)6pnX1;zok4w{U?$>j60xZVFppsrP~;w+(SJGrM%?=U z!If?nomvIq&jEbI(&}mXgZiVmYcR!D=*97Ohs4FjEnXel{4VtILvDUPZv7?8OO7r{yWc$wfbit?DBoq*sXPR%R0F)lU+J1w{2`1;};s8>KpPW&w+QZUJJQ*`x9Df zx}zny9TA}%q+B`rOfPhRP-$+2MJG7+4~i8!e7Y*M^r@Yc>b^-nFj@REqVct@2(O^U zhs#e3k1KiR@NSyJ034*FIqAL;J$6+j2l3IcP4kUz>Ug8I7Im(vCQ_4J!dUI7%Vte$ zOnjK&lg6(gR6K%t?0X8M!~F^RAmHG#|0qVjOR&PSMrVf9mt`fgZN%n%kg&bl^64r# zd{V+c0}hktpCg#5$Gt?j$4J1*<-#+M zv`Qy!>6q0YdvR-xl;nc;st#4a@O%jb>7tOT5khe5^^f$P2 z=(Kf#gp~80nn+<*74Zwm+;$%-@bjbJ?I z?ssLp8lxW!YH&SJgiewZ_?lwf;VY$SKn;>;>h|SmObeTOBR~3%HUF>2%IGE0BjR5C ztt+ZtCTC{@+00Mmp$FxoUx(spw6-?F&TbJctOHeW?^S>!P(^OA#yj274{8?v;+wAU zbLo#G9#cMw{*r&%>>Cob+3SLtSi*LfWi_ELk4Bt-`G|Pr+=J1u?zVc|;@q}BcoMX2 ziyVHrjsJbtYefE5IbrlwJMg%WqC?T>lOIsvBZ194JZA!}8e)kpRb!U+246 zxMkw=i#1Es-$-l9c>vU%_0cOn^8GI=cymDx5a*l$bRv2BbZfx`y8O&MR7|9 z&h7eTaou(th*uXU_8tDd3We<0GnEE0_$>ob1M%GA^&*%MsxwP$Y6ELxP8CD z%{SJm-JSaYG9L-}8?}WGcf0HJ^g*5MenBL_*vl=<}K`vQd z<1#R&{>R@)aSxgD2wFB#{jYBn-7y0m(!t;-dqw~2TT{HjLz!EF^e+B#GOS@_L+f;D!Zv36^#Fg&b_Pt8IU6Pmn1Fj{>QD0Ms;%^`u%S2+z%~4 ztI}`n!07eYkHw3Hyg6e-23t&{K5OpVBKQM`usJUZbTtORbd~RNO#7#6{s>2aox|Jo z6Yc-9=XyFkOfm~A#>?ZE=zcq4V0KUEV4ZxE<JUw%7d6BIU zr{axHP}mvWM!Uvbkv9p>GWBx}q>%=`-ey&X{CG%rgR&2HeD(ZskKohlV|))EEBXgV z{*j>Zb8a^x)UR-tLM32%v}_z1U7q)+V^1!DyJYdgowV)rlWgDNPUnGY%IltLa;+LH z_2G^CTl+{$&#b*Zc(xn&RfV6N@kv=O_QT+oj3@6b3rOiVFEU0Qy)gl&E;XWPLP|jv zkLNBO|8Y@29?M^I!o_-np~2VsqE?CTPwR+|=#fxroS?Z43+r&pDF1eDPmNa2_Jq=o zB$UA>^quBj=}foO$5L~2mbEkmXA>EyJmM~-=ISlq5 zc6NEoaf9@+p8HmHu-E0~i$ngj6%zs4ydi}E@e(p|%jJ0z*TcRmtl-j|F!b@!ZaMqL zE<^8f^$;%R)yUy2SAzA#Ip|`c-~4&|j$U2Xa*7zip;t4hDC3=MxO;;jQBqmC3wW&^ zeP;)Ai)RHoN+*MFrZ!63Qj_QwK(<_{qqg@Zs_fJPumTkpW*sQ3leX^-{R&Kj#yZk> z%%*E<4F_)izw?Q}3rNx7>|JN9YVR<{NQFt|%e7glsL>eym;)SxY_x+>KKbi5A;SUt z>|F6^3G(yQI!T~aPxGviLc?l~=_DN3?D?YAsLp?)5ZG=gfxOs4z=M$CI5P|-w%ehH zce&Hkohl3K49g;Sj^S6lZqcK3)N)48Sa+6j^U&YxsO1k~<@0M4RYsY(&paXa?PZ^h zm8Wue?#~X_*|3?DI<+nxK%TT_t@t^8{{CERk-EaSu@10i(2fVt=d>tr-j$g)xFFTKoG~Exd1%iAmh>~Pm z4W6)Xo61u+zZN6uos5o6G@q_XLL1AYfgRskB1#Q!>Q979ZRpN*w-IfAW*=PmR~5J8 zTAs{x21N-gZI2R*( z2(~P(7~?m%PDo}9#$I}oZ6f+TnY2Ox7**BAf&Mq=(-VQx&O;m!8t`V%xZ6Ox0cWwh z%DIKdJ;OrvC3&v{?Y06h5DjOTx;My@$^-p{WGwFCK<=dz9=KC|u5IVbrJ+k3Il*~# zz@R!l0LwZpVcwm2=f2G4+LHjtobNKC8UT@y`!WtIvD+I&lsYudCy71K~iBLD_DdK zklE*L^g_DQc(H)lcKxr_%7(!%k=dUZZ6ypEwWI`yvI}07dgqr;mQn8qFth?pbA&nL zPBdXl=1gca2(C1;b>8<|crn;Fyoe|uLM&L8K}>>7QrE{L0V@l`2FV)XK4H`%?N)qn zFst%Ncoi@?$b>)5<+?oiLE8X>H0rAw(h9uAT$;76dliSVw_%dtEhP!czIn?)R2xHt zKTihg|ClDWItj1sWw)diNY<} zNmGJ*?^=C%{%K~g(J>C|@cWd4O0hr7DO)t-A^fnR{brP%!r1MXbTWp5TBO>nI&}Gv zX`7PVc8q`9P@<3<^h1Da#S4~;S{+I^4P+1}dO%W%1R0~eIPxChqC*(5tA41%NtIam zD!}TA2Qdqk&<-S$qwnWLcNzydpSuf`qD8CB0$W0L>{;9XuPEm?8qmN%pms(JvHM@&gVkO3IXB)8+FE9UEqbWZ?xPJ!90jXB?(i z;*i&2TEip-#`(+{v()U9puvgN>~Is7N2;iT8=rw0{csb~0yL@CfV1{$M^3H0g?-|9 zE8s;g$>ILi*eCYQQ-t^%K(7o>=rqQkqgM+#Z#7u~32<~AtJ|FgTgL{}Wjqxm z(>tVLyDoqX6vw6c>B2@fPE*fVZTjQxkg1?zfgC)OY~Q$`;T-Fb@ZiVMe$DXZY=g;% zcj(%WAB#C!#SWYMeR5ShE#qDKh2bKZb4=oIiDl-9zZPmm;jTFlaOjaktuk~k5sH~s%a52e>3W{&qQRr z>j@x~@wJpax11yx;NxDAE>k2Gatu5tz`jUT;Pnwn*G0roV!)o<7Wg`s@pvxCqc9{b|Oz>6<9>x zAWImxI63vT;T3j^xGS_X-XqPGAeC;DJz(3Ej{ghBuA#}P5Rd;6YXLI}>J)?O=e7>s zr_uX1P3Ax9mPw;*_o0oKFE{?i;?Iu|oQ)g3rbT1RIgwB1JP|kCxNW5>@RLJj%|erH z?AKoAj6LqXiqpb%)NAV0-oJLQ<8LdpqNBMXd{^=whH8Z8y)yI5P%`M70u=2ylj7_h z$`m}LDrA1Kq?qu(4>7#czs5?C3E*!WH3vE4*GwzyA6KsyB|x5TX)eBtXAm9 zFhcpL>WMqh=)7QFP(L4d-S-|CH_)|;XvAn~U9`k-qAowW$|6f=TrDOm7KxR;4~!JW zHGo>2v#!_fdO+%0_b=s&!T{I7o#S4#={#8nmq+kf=F;<{17#x{Uzs@2jnyn_${6#0 z4Zr7|CyWL|LHQcLE}&d@vBy%A{C*XWGmm((E%MCVoyfC1T1OcDvr_)@eOWX znj$ng)H_=?#cx#k>tw$plna^IR#0Rt0z2<)5m!|K5`4hsPv?3tzYZ;TV&qBo(K(ZV znhnnFe2uZ<#b7UZ)Tu&Jg}5%udNEQoEV9<2Ft@_unAaM#`ZB7hy?~dO!=fjEZLdqP z1eD^-zZuqi{@_fOE|2M8@6Fd?y!x-(u#2Fkr=MW^&R;1VNMzFo&WF*Xu#M(fPmmNo z={d*lne!UdGc3io-{=QWwEF<;mg8!YdP|(Eh4`v1&k^(trtQWovU*Bxf7zwSpH6yj ziVq5Whdygw9v}yfL)gpc#)Q{}pl=O!j}yqO%F;^@71m4icD zkVQnrvNQ@%@k~}(1Zxcfiya7zexi+qKhylBZ7qb4?@Bnm~e!Au#0W_!@$ZfZB2O<%wII>>U4z;^CJyAF*MJ z#o!k@0^=2;hX))htl(IuZTC83`;C(C*g13B*MM2tVk8W5U^wARHt1~dxerbyqsOp& z@+MN1+vb)zok9vJPVRjyVehV6;K->e3Gt-`vBrpX++U1efz;sYG~)41YYNJ>g&zPl zO_#ooy$F#~b9j-5BXHDhI}UNJ@9~xBj1D{Kwq@)35DzhzjyT)}{u*E}jU4soegjUf zg`h3daa-dt_i%ZyaYNvMyMf$GD?Z&{wq~B(%Tov4dg9)EUVUqIA~HJnJHeq&7TEmd zF}0wnk^hHI$YMjDb;B5GRBOT*_vqXv_8MSh&Bgx4m2qA)h18+7?dH?}_Gl|m0E}P* zkDvWDud=q@{GCsh4UC0{#o^?Bf<3VdgWg~YAjU0X!u%tbY;!?AS#p#7>BSRkqL1#(j)wzm!^(y z|7l$exxVA!=J4~UHvXuVL?t0@+2(4JW_#NI1u7a=7hT#P|3dF4sIlf%{+}0eZ;>5Y^eSKOrok;<0VFgd$Bo_6g8-GPe_{ zSIititUizah*M|57q{VB$JE-F`2h;d&WQnt><S~LtoW`0p==$uqzv08e@9BybR-8mM^UA^O?av8vcoAkJK}wGswNC zk2Xe9aJ(3=Cb8ejS!kt9Gb$NaJ)O>2H{}AUW}|kz!mZeEk# zi8wltHnmiLTK{8h`Q`QsmPG}3u7kqki?0%7?d6mL?mW<9AYAG#;XVG_DUJCdDxpG|H1 zk9EmLQ*>!O{+O%HjY}g7skMfUUBwo{F5~ku0%Jq92{pAbr4^?y-p-lfmzvV(cF1LF z)!*;xK36!|75&=OlI~87juiAkIIGN#x!khYj`pRr!FVoRValX-c`>1F@$K~9>uS`@K$p+VsC}QmWh7AY6 zpi=Q?k#+D-3+%H?s#FZ%#de;(MW8<y?_Z>1w(^irG+~r7XM>AHaFYaK& zy3bZGfRMbol}e={7Q#BHf7&a=j=Z&-uO_yz!Tsfz`M&3uH10yxl8A&ep4fHH*}k9} zmp!t*RyIarPZZZ}+_umfXFPw$V*8fy_ny}NtWkmV+6dpN;15rVJ5{ttieGOUC*x{1 z1~am7gkeuso0D_w?JSm1zOCZWRROadj_x5#zK&@E6N{2b@{aBENaHjF|5Yi?oLoCq;$=gq zrQXLEO~ki%7L4|E&h84_q4e`OVsnK<0sQgi^qZAz1G-|N)vPt8$TiGrn$#kBqwJo% zq`Q-|aM${n52yo@24yK<>!T@h4)ZlkAN*Z@Dcz6UcyI#uB%IZ}c>52J93`uUbpuOyEPCNJY>QAnG{fWz$(JB9$y(WwDfT+s!Q;(x@uD=Aa!*Vz3x{RW zJ)Egsl4eD*hc&&FfXWtYFl8d33(Ge61f2tw7u>o0OZlp;;aj$wRb9s=Gw4KU_>-*b zm0V7-L*AQ$1`|c(Z#`G(F3%F^mSQ54<&8i~MSe-$4lSxl*`1xvwPOhr%Ak7B1!7$I zW#{o975SBT4yp9wth;8vpOy65<@yR*-6G61yac$s3xHku2upwe&-~z&bPltz!Y}q( z((GLdTQOih3YN@{l!O<41m9|LPO7Mx9&=bz8)cZA$KwV9?k5s^N^P*RcbZT9e#)55 zTzF-M+2c*Ml~!gI#CaL&ZO=Aa#xh1aB`VABuPi;0EyZNuh^1*fo{>N3k} zm0xyy)JoM`Kw)4a(j^%*@)Bd|=dbyb(HjZ>1<{0Hb3 z!wIh%;>go)Jz41U(YWj~pp{r`4kYCU3Mq|eB`cBPPhfqR9=;W`Q7uf@VltabE>_zn z@)hYqjL9;z4a3iqOFSleHEwlkC&&;~51jo7e782#Qcq9zC0{6UciJDknO}uQ;+?Pg#!#Tn-AGU&tKZ10(#&mEBS9Q#<|3h^3lh@*4eGWJ-$Yu;=?2+%MVJL~Kl4`LQm zbofhQ=7F+5`O%7V0-M!_4^M3b=`4Ld5B^lrF_X|uxl`7pdHZ2bt5vNZVbcR&!l{}> zvO@QI0%dn5{Z;pbLi;~B(Z3IG-#?1Fzd^%7d}v{I$S|YT3Wu?IQgYWo%YJl^q(N5} zrqqdUtW?N!c1}9&ByQbaMx8Sx$W2Zo4kZpVcJABv=DyRmSO0k$+q@*PV^<}b^xSlz z#!b4y)N=ThIGwATYk{YugkkSMsE%-IfMMtqtWij4cxHhB7icL=b-UeU%Og;qzn;x< zSKGZ~ubOM#-!h8-xr-n50O#O`uwag!Jql9XZM(_EXRQAKk*abVG)(EchqR8Dec<$56PEs>HoOp8%VlWrV6aMcD^%%xd4P9DSC|Ta1;%P@aG-ViY@9q zrj1<&2%|yjRelNMv&_X=!5U5wjrN~Jc#iVPpdkQGmMfzIrqB**?OvCzRSF7Xtu2;nIPXz6i%pdVN;S?4+s*Azb>CKan6*$NvCdzmCXlP*HoaRnn0h|yP-DU8^-A+ zTSA9mm+63|N#S98;wMXJQmigicKMi@C9B)tS#*Pr=iaT~!R&7X@XX0mgHNO-K`&v; zKwG7ssQTth>%_e-OruX7`}SQ?0QD`#ifW(o&v5d4#u&x2lB-;q&cT(G$TxG+HA$q|p3pVXGoG9lj z$kBH|sxhiznXn2vxjCH#3E&vO5K_X6z?s6ESYiAGs;3~KY;Y(2x@__?G&j?JemuV^ z6QpD~2?9B)cU+9l^%I#>i-64Vs^rX1YC#*=@}AnyJH>I?;4>8E-G}O(;9z)V-K-3q z5DTw{WPx1py&dwHU;;o^1VU+vBL`}AvKw))TXlWBQ(GGAGl&gAKB@ zigVLjVf>|>oEAL=@T@-pLC@Z*cfA0 zgEK%Ey^_)7Z~?Os1l1s&rWPaeb3Ac?nEpMRw|j5#9FVj4f$H3QrhX4L-j8_^@;It_ zpWxx|MmP^{z8LWWWsvO-=9BNE10$fKrIyEro-48~6&c_7zz1RgeDAxdc(45mE^m2Q z9OrD+a4({_$$7Q z89>T^+?c~I%r9P(r0{$&>fva4RQYwCibRv-#vzniku%mg>) z+K1{1#k10SB06mXD3%jx;^xqzYU0vpA|t-aRu;O$e(bg^G!*FulN?&m#^BMnz!07= z#Al4@4{t@EA})k}pxxQD#8N+q##f`|Y>kIO=HDjdt7Xdqb7Q;M8DnAz#H%M@R*MZZ z0MrM+opr>P!!AvNvL_Qj%OQ2oe3M$AZ)#t&g;#X$5^Ym~x5jV!4vlJSike)*PH(Ct z92_+Kwh+vnc$@J+7Ly}VuJz{hCoO4U1Wn&?4*ai=lml>-93BZEy0irJ|3hf9AndrY z9&EJ%h)^hzo&ztN@Sj zNjz)&9B%Iogq%)P7&K1KuI)3Y{V7_HARD>wOf>-27dJdWL#VyAdfb(e%rKN5=yEk) z{URn7F=(K7G!FqI#n#8hC@L!}UuT>&5Awct%{#&Vm&L89D_7qmN(Ao5X%V3g_5x~2 zHYb}3et`)T3um)%ao6>3wu99IbX9xk37AMN4A{p8?`_|roFdZpwEVfJT<4%8T9D`3vyscvC_rB&k6M@i?FiRaK|5&sCjUW((ZqBK8LKbOl{iRYCgbU(1T>oY_0m=#O^N5IgS>1x>3+oCKt-zCKVXS9 zLwwC^e#c?A8{f!MPy6r}{qA`DP~>q&ln<*1V~=e}z&BsrBYmJF?Z$_Vr16+z0Mgn+ z$@k9QCb$$W37^)C4+N@$RIi#Wd3g07Zye|)47uL0NXMS?<(Lofu=jx!&8*vxEMjCV zk5P)<(?ID=dA9%DE*mw6pOxj0!SFxN)dF(wVvf+CGViVaxSZqPg(5SCu0QkD`r>Dj z;&QMwCCHRL#7>@=M?%FrsSVE9VgE78Q6wIr5^n^><>Eli?lhUgka}LPfhW4nB(B<9y)=y+dUBJhYc54G(ewi zijg$G1>netV0GoNe~gS@z0r>cL51m5e;qc^Rn#X!$+h&~e__R2?;flVUfPJK(W^@d zVu>Avfe+x8@`nypt+WH+HS+1!{eL#W-M#zX9c}UJ=+k;1uNGWxh_izO$>zAY^ww|i z;7OZj`{gW2`<490UsHYIdUfq%2iX%3k{o8*MspYcTb3!hBZ)JRA8bG1VNckIoxK(< z6L_@E!{lng73pT-8HP6#1Tm8Pk6x1mDqwmy?zq82cm;b+>gm6|E?;tv;R*QoEJsd8fS=@kiV(uyT3ZkCU=Y>k-kl-~bTz!_N zkh#)Meyig;mp}O_)>k>qq)Y=%qW6ciFnpeqsS@Sm7d?lTRx2hEtJZO?$(upyZMe-* zVahL-Tf%Ws^49P|i_~o^{r0rh;;^rc(RD(!-{TZ55rN8g9zsu;gSMcwvF(o(ciIA2 z2n+lyHRGW*zg%_JjxF^vu3P*lqUyfMe4Ein66msHm1i8gi&_j;mu(6H`3gzd!5Lb6 zSN%h4W{v8{p+F?2%JA>{Ceg4CM!yX zoM_9^OM4a`9-azcFSVw}T1eYT7eEaFs72eZd_(n*MohL>0EfMe`iInyV0aB3QBdLS z*;$!wlI(4>cWqXG+Mb6`pDHu7$A3Bi;*YLdsr89@d+rCqe?RdI zb5USCW0-G%{n$BdFN-QSm~0VPb6)<(Q%ZUJTOBe*^qA>)*+PXa&prRTi?2zK-~P9d zVe>ss3U#ut`Ck6DxcV<&$qpb8;32Rkg8!p8`nQ`ocmfn5o4fh$f71>`DTIJsne2$A z4tarq>2Rvchi!%S?dXrf^=2&_IO-HO(7i^s=7@TbmBmb>q^%3-q~;%C)(P+gD#Jo2W0Iq}POkhSS@tduvSoU!5n zkdMz##Z)>UY*k$UKc{fc$tcI);Ptt09Xr(BxH$xC*v4%@ToU_c#jpn)Z2dtnx1}d6 z{rW+c2`CCIRbI7i!!I-AfM8jy@dM{GO)9K-PEG9fH5z6NlDFwiYO7nv0YY;FYkJUK zUthmK6*SYb4fpFVgkrs-8ora!qQ9A#&EE$HO^Qx+545)K2DtoFuXAT? z8Vf+(eT2OW>(FW8-Q}uTFksFxGlNi^7gU>oO+anX>V#t$D1nA%0i`+1`?rh?kAj-@ zc_0%28^tUOUCL;pe8#Y4@b`JMM#&(WwdG<8hNs`}+l*?BskkPMyA6H{19FiJ0annz z%>-169C%KJ{si{A<2yK)1!78a7xg+yIAL6^sZYWmJOFgm>`9$O<&b5*i$kCP`~X@{ z-2^?vF`$L&W!i^${RO}jXTy(vu?3|Y7W6W&oh)(qH^cT3fs9ZRu<)6{~h21S;Ku@L{KU2Y)`hepnx84bWX|* zfaHp4H?A-CJrE%SJj)RzkN-}R6|cZel+d_p#$?l)mom~4uNnkz5l(4;sk-4$8O!Q> zUIWGXC*O{dK|{2X>_ItblSBs&V4u6Fm#)Ukw;Z?pnGz<-&8<7O3cFf)u;s_ZO5yZN z@CcYK_5e>-w2fPT3rZ9T-l-QDV8<1@fJz4rLe(ASr~0IFuAg86m2lCH>*r}8C3_5c zhrdhwsn5)p_h;7_uWF?^_(R-0IfA0AYYzw z`o%(BprMl`(iob9nzYo)O)#30UTzK#!tq zkzZe_1qa2Qx)loYk-um~Bazm!&>-=OZme?>)n_0g2E3MvQIBx|Rb+z9eI@`^OM8t6 zh@L1=4Vq7MfY|&GfS)o*Kc!%OV)NS^7s7@#*ni^Ew~0B7>5XV6@0-0c&+h9s z3l8AfA$T?CwI*=>tnJFAO*`ALTN%b}ZOs5L&Ih^;C01jCQfZJU9(pv3_e>Y4f=PK+ z*V-R+>wuO5XTqoaR!1;=U7WsuFwZP6fH{`h-3shIKdA%-4dQj;8RWU1;aFYM z=#PH*(dA6modB&G8YZRv0rC?7uxwe~&ndtiG0`11wh9&iPxhA)5F_t49P#w2hsfR* zwi-As`jWEEdvIP@0L=4?>$_}syCE9{j$w3w4|;4T7Xo=b93O-`(|V3kA`N1j93wT5*)ORG`rEcSCC{*=E|Y<;$w zZ3%80A?{-u78ElAB1-E#c|%bn4ENDRTDJG{m`ws&vvG{gkr+Fb7?@&Jefs1hjPfDz z07sojtkWOH4=4I}$<|#YSm^*<#;CxKSR1M~vNOO8=S_UjHTOW*G%`pErA8HMc=}d# z&fQq;%nSE~kdWCQyWpCg2Czb}AD{cN!CtZFg4}JhxPR$Uv358NBFFz+86eG4MK?r8 z<+X-U71wCB;vd^AxpxPB?FY2QkVb#6ory52S(6`Nxa=$*wa~cG?a*AYaokX>y~$l6 zcM{x-}L^po^-wsgQ9##EHAQS5h4z zb9~C&^4xI99Zv^N@5>dzv~oT^F$Mjv>0F1xu@JL#~?Iy~}IJ=Gtf%hTDA3n(f=DLqM~Nx!l7^i#NknH@{bh5~+*6d&;tdE{_;9X4SPs zb~G2YWt+*D;33hw?fgu|j2RJmicKhfQy5ACcGVF zb$h0@HA(EVQ-=5xBYU2^C2WaE8vftIDmd5y8)od}0ZR@T-dc1Q`GxP|QBS{H&~@UQ zb+34VP9`N+&xacYeSO6@wbR&?nm=)xon6m9IE9Nn7d%#5oU}~u)KSHbv2N}ZO-JfdCSk)j2oEHdAimgx=^3Y?_QnEI zCLIwv1V4%2^z}|YC-t%~;YZg) zR!X`#@hVD@s=YhA_|j=U!DNfT>z72lu5T9Z;wu_6o(s~QRnvdRewQoJOf2H-UR)vT zu2W8Chw+Px z72N1}CwigpX-|PxNMz4hDHW0{5}|hoA!Z}*)U~%qOsCkC5WUFne0nx6lwU1sru`hz zbCKUy5F5+flIUbiS<1QEgA$R2O4Qzv^a<1s#|PaVNPOB7T9a~9UWNpLguy`rR@138 zyB^@N+m!gY*u367?S4%qvqa$0^pax7{yGC&ws&J9ktReB^y}>6*TdU`_AedWhI^hSj9k2)^&JP#tD(VkOIr z?H9Z@<+|8=bqd!Web0V8Ls( z3!&z9GEFGVD`-eC=$27D7N{kS&Pe6=2?j@{kT=^yZA7osdLFY`+W!lXCS@ZyX0^Gz z+RK3`qO`g7jSvX+t5EDCN6212-2&hUxPBgCX?g#YD&`1wX|~w0KtlsyDaBTQcbATdu>xsHuz5?v+|0 z2~~%=t5!M&k*=tWyu6q4(EM2Bn8&th%sleX0imSD8xLvOxu_b*d#KDf%z!=I8kB+i zG`ypoSyad!eDgf(6K{W*=^R-f>f$nw$kC!nv9)TrS*dgg#bY(p{DU8LeqGM9Er})a z))>2b|K08LmJ{#Yk=(&=50?kYZihBX?0t$F4HJeqG7fGH?A3twBkf=(ki0=B0=6bj zzygn0KV2yf#qr&xx&9Fx4%$h+bX{ksAz4%<>!U`^@16auF?lW6arEOe*rX|U8U(tG zNP@+7R+ziP2&Yk_>-Wm6@9t&qZ$CFcMwIs}W>=#z#r)%Tre=Y?z3Z~YO^C!rGkzRo zKCFEtB760wMENhQ6Rjn`>B*!ql*ff;6N z;^g#yN4CFI6GkHqmousui*p~87^yA>2Xhcdm~n{xE1-J=SGF(yvEJlSXp#5`fqgzY zW~J>jvarnUSa;!OMFBOa=21;!L#-Z`-rFAm9VjJ$77*ndEB zttb!+qU>D`Lgtu3tE$t=bwfoPO4Qf|re33;Tva~FaZ034E){>KhdpX#>H{wcV-JHl zroA23*J9iG^#hYkQSGVl8BPLj!^3qg z?=>}*^!Xp<-PnvSv?GcGBlE?Z+YGdPC0GSrd^@^9E#U<=e8pf{t@TpQ!OKRD1mhIY z>BWmJp2I>(c?QcmV#I&PklaBf$7KS!y3BA~jxc6JquV(twLBsG$B?74>8JEXjIW2M zhFY$AqA*DQtw?bL+U(f;%gqCGvCSROjBG}Hn1uW?t+j)10yU|id$?cjGfo;gTJfMF!!}X&Bd7ku{_NG&^rms|c-(j9Q0~A5vZZ#}<|7=%fq^0(Q%wYgv$k?RF1~3k6 z4bt)$ZT*BJ6-25o?Oe*gYJVOzy22|YcQTn!k`ycxHo_?Zp~m2-PInS?gwn(vUPVk? ztBaAO+IO1!D^~8F;^3P5!zY_>3Uk(cobt`?ypwOXaH zrs(geo_hM0dn@J_Eg#xyeSiq)7liW+`SYKsxzKQ?ar&%-OD;-rDvX*?>P4yGT@6ma zD8!E;z_<6-DB}P z_1?_)u(*7vSTGft2>lZ&ZQR9`?3Uesz?9tmIFMY9H~B>uoE>%?3J3V-PqYx2Rt&Dz z{pZ|_Bc9kH?i9fRtK<(v_Xg=V*HQAF@mld`kCJh>H_e1p_HUZb?3 zw2tx!M+VXn@O)pj_PyzJ^Xr>!zIE84^`$LXCK%&|2(2zYf1rB2jgL&aGrQ+xUYe4c z6HB#?JW-lf3}qo8k_H72VUIjMs;>46`7=kgNhB0sH_ktjrUoy}lpFc5j#PNThQjD6 zyc5QrtPFCtE6+8Pb&S(I-~mTFv^78WUmojfH}{VQNhv-;OGGTfZt%e*{x6RNPPXTM zq@X1PXv#CJfN`WDaimqUIglPJJHFySSqPFwj0wl&JM6M8ya!(gw-=YvV~%-IiLes8 zXe$Ye>`|Wut5;-UY`4QcoUKy(cMAp2eU?ALX-`g?5{6YZeuLQ?C|M?^>fMnqUFN{T z7S)Zlqv)hEC9m-!+?n3>Yq8)Ht} zm~RmGvuRAUhxsOt^QtZPd+8~ZIdneWaKV(G_Lf;q%f>A52y9x!4#R4R%Q5KFW9T?3Xf{HU-QfkBK^K3gCJRi>!rh(>VM}|vvX4mJC@V76#iLbL zZo@#wfEdCVPguXw@o&*kDtkY$0|nakj;a$rb!*kr(MR)oatuVA0eK^ zu{N|V3KzI!o6PcQlBh2y@!Z8Ur2x74pD!{nw*Z0@wBW*h^uq&|X0kH>&|m#(c-CvYv+!OC zhGJt+E1W!evXcFrfNH~~8wi7R`icmc%O`!_*8`MiKG`{4^kGH07p`pPTJh$s-V& zieg#m+*O)aPoBJ3@}FU88vBAm)u6GP~$^K6me!q0F0 zcLhlO>KMHCF^H;c0j#@(3wH?=Ma%*A3#JCX_ZFmz|KTR= zYirQsDyMH1dVbSnT1NW7q0SuF7mQ%%xB0<~k7}|;8|2B6t6G}EvrEdq3WQwC6nwiq zlse{W^q85I!#c_kv~RJ`EIaqf#e)g^)F z5MVHF%lp_97qy5f!C6N3tgg=bat87Wv=fD~eXo7_5=t>*(!{^)aXUbtKe7twvx#c> zi_;ZzpUJLOgJNFxgt$zHQC-sNGH<_%T!zk_(pl-Lo24pgrZZP|%j)_K~hes4Sad%%h)5jb=}AQITMk^7|Aua#$q zba4HzN+uempTD%4r3uf_jXqNR2OxN#Gb5dc0o80DiSg@jvUPh;pG9mraBfk)w1LN9 znUvP!&zuTmku@h-`454al%BPY5?rzA5yY$JS<-FBSX*A?#<~0(_-9~gUJZuWFjlFN zYMld-nA~G#IZNG}l8Wxa?3=`WKpfM{ETdAX@>|D!OEm~EvtYu3z!6o>&MVApJhRx| z<5=6aFQojKZ;zUfIgijXrK5seCZm&b6KmLVh%}6Og|q9w!geQ`cQ2N$;`dDE@k=;P z37ErQH42;fWab2oJ$=KRetS@+)GZPaJdO!v)3?7o@8lWR;T)uV?YV=6hs(c_b*l2qLj97sZoj!qjv38RokVdMvNLo%p&%x z?tvPy8mbkuVuTp6TD5A{juoY$Dx#=F%-`c)dfWTWef8%LuRPC_JfC$w=X1vUoOAd3 z8x#3y*P2@)EpY9`;vRTg)p8y?(f&moYcm)0JS1B$`Plj+$r4rg#D z)AtTMo&=iOlS_{PTjBgDW4Oc*RMRgl>^fGn0c6K+rO$UHO!fAnV|kEswLp z-NtS$i~y;HdL-xu_q@!M`t#SlG?f+_bQQz}>pzX%dPzWUTAk&Wtq<@0}u>&%mY%l&j{SoS6=Mu27mC!*$sc~TUnJa%iVj+zO#D6n$i=->)} z855C$6vx4Ins^0aQ%VZL9%vd zbaQ$bokjv6VxV4!-zQ(sa9CgH5I3cD1Va9Kh8XXm>;KrDV;;RjXZxN#etbK_y{1i+ z2?I`*a*pN5#vc0$c%(1dH>dVR?6_D#*8cvN-ntttQhY7X=bauCpci@edfY)BT87|G zx&mXE&zJR@yi2dB?p5_AKBhP1TVZtGSUfYFi2@Brc=H3kdBkT~(cSsWG^47!Y0CD; z@yS+q&u_VlS!Lmag+qEsQE3rM#Upvffb;-asTLjgcK2vKhWT6MpW9g0@zVB;(PP1m zEitEuG)|Ik>t%GyrKh;$Mxe=mzE@(lCWDUWv!`v#vMvy@=_JC}os3(G@ohgNr&Ly)@7&>X#V*^#xn z{tHqyr~cSO+y6Sg))NPlZOVO;OAvB0V#2(3cN3P>CVCG+cGRfy(cn16-c7hu_8ZU~ zFM641QP74IJ>z(`b$kW@pcNQ3(${>LVvSI$U0svskex2KCj|%`soqU45P?{!nAYeo z*bds?^?vpX>t8e;>S~I`TX!5D$O1XvPYJoM1Vi}LfP9NDsUfgo{04=W$SPDo$+j>3gcQd{>7d1bE zFRU|ZL>p);KIaR9fU(3sFPObba%fL#g%C!a6$6PVKu4)iwn4eA6eTFtWpebA)E^vB z8wP$kR86J_;k3)nClnZ9{agumG#+u8B#Xn}l(FUP_{)g%$~N2UUs!>lt1`kW?>%~q zT>*D7kW*nOEo9woGV|QWHNCGDCq&F#IEPD1=+DP{gV{YWCH>=px5DR1YlML^B;a-J z9Vd+S!lup@J~rzILLC1}Xi@2wa(L|%@LFo}GUlUQv+HV(nDlhH7olJH) zQ$RGJbbj1K_$)*gj7=3!2@VrE?sF zUd?tUDhTAb+^Nb^B#&TQfGKecM`~TJsNU#VzJ2kW84J^?(sk~N1^48|M48XgaoNKp z0*a@Gpsb*1z9s2)pR*20d%rpQB!5Ggg!W-cPdUfWQzbW7*vVhw4h(!E)dl7CbkB$v z!rM$+z9$#zXlXrq$|d^_Y8(tES|%@jU`Spcuy**IwAinYrKuHE*o@arTT6lE9~xJZ zw|!&pd@-=2ijkO9J4k%~r(F}qmCHKhAb8;I$VR^j$HZYG!_C zGzo-br|Z6+;%`vaf#Tn>1WetB-d2fxhxE&=)B_pQ;-g^b?{pr;w{y3O3aUbDfe&F7Ln8Yvn)dV3wmgA@5#yJvNr9^}BMN2vBW7 zl!W!pE;w>CR1&3I_j&{TR_)~Ckmn%=h8XAGTf^atfF5yy8(9@l5mM|!5!LyU>rh2` z&V1OXJLXO=QKT~E_)aenzxa9cYV8`IG1MtW7Dw&S&@_bn3?E=dNg#|(!3U)VwXa=k zCn@FcXMc+Cfg>$H=Dt=;Y&8@UJ}=(mSP}Ydu@1l9SL%bQ2zc`SE2g1V#%(IAW2t|j zunlWUiq@2x8l=$&iN=v{`vx;<=_)wwhiAEs)T(nXN#?_0l3;eej+Dk0LHZMzkgQXa z+4O9QOd*J6aa@9);b5t-+)P#q=ajz0Nx2{rKeS6qk*|UF1s#wd-gG1(#wM~V>$o$j zb3A079~I#3cRzc#^dZ|ll}A^syND^M#k;!L7rX{d%`NwXM%ulf~>QIhEmT3 z^)BJ856!Z0ObU)0xgb6HsDm?aA$dkfO#>NA28_g%Ff7C@Nl3dr9!^(cU*kv$&9mG1 zLU;O>VqJDU29wRNcH!}hf|b4nTE!`}&hm6(OaEHUmrTcLAVf6LZ()!m$8k)$P`W@g zflo6U10-tpC`m>Ofmzhnl}_91)@W_}apBc7R`B4&qd32T2rF%(-(L6+poa z1BiVQYiB2to{j-nsH+yjji{fmi$fx>YgQOgrkU!{RDBI(hUMuZuL|%Nx?tHFM!Yt46wftPSNqLidG*FnL zhW6Pl{d6NGh^Jx9-Mf+l?Koa7gRUYR14vkEMfv2V8FA5NPa-ixJ=4MUP5f71nU7^l zN74gY);M3B=g>`l-`CftZK3Dfcy-0Ato>=b_PU;|HWDKGw~Z;{KChv16GAL0D`HHh zPRT*%Y+a67rB?F2B@H9g)2}D_%AHTHH9nda9ryNCL`G$EYz3k-nXX7u!H^9x(LL<5UhBQ|3g;UwjcHx|{gYmF8@2YYh(+L{OI=IITlNDJ zz9H6PVIjdELUo*?{5ZiM&atr_$B>+7XHgp^WOfrTd}%2Ircl{G=*#n?fZ6i!VYdSb zk3;fOb=1kOUNB0M1fx#9*ijT7?`np2OrX_!?JGQR@lc;lRyu<0QXVFwR80KTO zPO?Wr=&%x~E8?t>mcDlET}3p`0_5kH4qa9Z z{u~26)0xoHa<;O{)MK{0*ce9WQU$dMgLKYrtLbbVprIKmmUF6{$|&Es3=ORvt&Q#% zzw?ZpJQBv;FEr5pRA_OT#1@xOCAt_s>f1b@5;18bw71&e8FGVSHmmiej(R2< z>U@N_421wi7WIZP^yp(972Y=Q=H{OMt~VH+s_)|nD8iECZ4 zLo%))waBkd2xLMGsh5IcOuZ}zD?3nJW9X~*O~^@#GayXuvW0wBu6EB%iq%p-s?fJO z1QNUqYmE0$8rjHmFC?rD{fIF8S+7tDIqs?3M964pWf^$|rOq~{RVS$t>a_q`sxv1JVX_g~)NbnP{7I6L#bA4RE;c#&`cwdTBpIIE)>XSI81QWijiWksUwYp@7L?Xy)oX*% z3PR)NRTpK+MYBt%EhTnx94qX|^##%l6t)>|jjWgjc#mY6A5;Dpl2 ztmKQi&dw!Ht>S3uH0P#(0lcjEpN#r5pIeOW1h1upnwX#zvb{HPk)+nCIxdk)*~${n zMHaKNK#*HvYv|uH82eKdJ$RDdHwa$J{CNXb^9UFkS{XT=qX|y} zSBa^rMu@w&pG}t8Ru3T6L}y;DOT9eD!a%|XWqpgn%#5?;!$PRmwJCwv7jd3`0n4W*N+?)T6aWJfDU5Tl4s8XvW>j+ZE zIw_#gy3T5H3MOxDAS~@RdpjNz2XgNx#7zFp1ii^TqI-24z8TghapN%qBsT$3knJC9J`!{{bBf)Qh}9} zad9L?lHNz%xg$*v()a=;hUeR0&=)U0>&vYDpnA4zFOyVe53J05rgWejv=pL_I)o2h zUXgwj74`gV$UT>H)8XO!7MGUJ`$^-HmX~gy;p0=+Kc$?7smT_B2G#rSzPVmQNTrFO z5$s*L$2Wf1{r<8OZ9Um}aY{*;p#G_H(OzA{!ND%m>Y89zSw~}Na!>enqXBL9u461> znHP9hfUQ0A|0)Z>La|qe+fk#hFWfyedE&&eua3*FeuS*77}sCp%r$t%-P50qZnUHn z8p|FVZnq!JI4j^;usZ{ui--G=6@Uj!(7?CA6! z9&N?Eo`ywFBFs3An-@r!Z)9Y2(^}tIAO>tzTU$#kbe{H@>4b60S{sa=x3X?r|1^8) zJ4NeXy%seM1m+`?M89iNvOGqO5W2z5%^jpDkTaKA2ENeQMWfoW{&?AYI9PGh@S0yp zT9hh<*bQK^UkFU(Uni9&4ATYvv#=3WhmsbqA?jb9Y&|aNYi=_rrD@uP03-BY6lVKn zPAYmHK#&o0xx5qy{z5>d3DHY9xV#%!6A>snaX7_<;hUUr5jX}!Wyn@xJTo^-_wM+6 zUl6w{$l$>2Uaa-cBs+1L3R`j+RN@Qs_fBHn9ciBdm8r_d3PTqRs7>ud>|;uO}R+rFy~jua5oi zWsY8Wy}O$lo+7CL3%u7+DjJa@fXwNG_g_+^V2b>Ojqw7O=#{`69s3Og)knX?%Y5y3K2l0b8SRx8x1_LN+#5XQ`m%|*@~Mq0FHN(8uU z+Z~Pc%Kmiyp9$iZ3EF!QE>9iRKE%jKpSZee#lkV7eTU=0RpfLB+=7(G!pS++DHYI{ z?d4fiP3jby9p>+RJ*7J{w`MuDDCR5s@+&#ZAmC5)96gYEzu1HAC90F%g&v^$eNaM-MpicL=!NitQ*0r`%HT5J5!vY0 zA4PV4U6y~Qz;o-sDbvTYJUl9Qq@ED#BQ|4UAd^5@QBl()Tvy|xI16LCyDw@P=*WAp zMA8!Dl=aijcSUW(B%N7K=jJ-tG1ZWpS@JPOg`2o%OWul#fthbWb$=4)4dSs%(v~Sr zm)rWZx^!+%zFi9aWSg<{PGSmfhRia$apUYldys)if!VF*Z;Ol1gF?3?DywcWEfR@P zUk;g8<>~gs$;q3uVVg|2ybDsE^Em!bwze!;Q^A`ZN5~^13s>8QPV}cOENX`FchyR2 z#Ky)p(l{@05sfQRexf_2(rJVbZMM_L`JkgW99J89GD74RSC->|aI&_x!Y#8Baisld z(sQE1G`nulZ9Gk-LyKO*2QBOE1~86j@!;yq@x<>>8OZA+-uBJqXxHtOX;=B~e=pvz z=N7ZdMD@W-B1Loa#?tUR8+WwXZp5T}VAsFIix^p<>g}ZzxuZ9SC z=^rcd&wGrLFST_1#6uGCk;XRE{Y zQU{jafANY9Su2%%bg&%#`0-J{sp$Gi7R~zO?O%P zQ7K2my9T(%6DY0_NbZhSRN#H*h)#=k{2(g2;hM|ove@Gw{&KldGpol`E{zz!bI{ySmxUS-g7-dWBh@glSTLmnj z^{k#*gRio$UVXT;;HU|j#&`OD+)H@#pOjl#QXI!z-ASVYPK`@67?Xg|F@6D3wp1Ac zMsh3iEMm_4+2|#wa7KK}Q%v5B*xXE&`K+0MnfYy$B5$_jSpd&`0cTcu{lTU6=jN4_ zE;HvBdV3{YCx*(d6oE;sd|c0AXkyD{kjJ3?d`eH3mnq2EFVSV9A`6;jR(CwIBFm$c z);IdvL54vEHNDr!-}+rgkLLv4?HiMj%}H;q=9DZ-58i5gtc^6U^Fku{Mof0tjV;Kp z9ELEPo3ntrjbwGed-MmBe9L?~5N-oPS2i{`$7)O9)^Fm22@Yh*O!*l#}Ib3L!Wf_4U`I`6oUttrB%mbVwlDFQ$fNqG6qY&!gff4hp$_5r(Y2? zKT1|Y6WQe6#Wm*8pW@r^duu0M{Xe{w!lz&Z>ZlJxn`wwe`3A_sfQFHT_~#f}g$t;6 z@6^m{Ah6MkMRnDHqB{GrAYV6NQMR@FcI&xw=Mtz>(4;dD&CouJ?SDHFr4q+QJw|1<^J7({r^_9?DA&s-_yKW?yl%kbH~GPKE_Tn zs&6>@2rymYIyU2Y8GaFwBb251UE+Odb@)==F>fm?MA92fig__2BsCuc|3}pPuVeOQ z#=)K6g<7S(u_~+181klQAp2$6!Yy_d$rs$@LkWQQE8AyJ0t6gdNJFLN@5GjzFhJU# z!z$V}{n8kPgSoq&<{)0Wh@%ttTl~i+D^HQdHsPcMMc>>{Qdqie+EZ zfg!E=btU~ask`Jws)Zh-=SIu_AHYI5-+|zo>h@~<|0}}($g!8lko!Fj8~=U@&L3tT z!YxzSZ2#Jdmn_5U5e**9y}w7G9KyfW!XI60_9b@t3*UZl!`B(YZ4KW zI};I+*V@M$Tolahw{aXW>=X04Oz&YYnjfkUcKT@eI$| zs%I)i?RqY6cq(RGy=1gJuM?L#(N%T|v99y;^Xq>fOhj^pIpCbXSPjz+%B{=Hn}TT| zRPLs~=r3QsAwxub?q7j3EHVK`5+#@FFB(aF`CH@slk=YcKeM|{OU&u~xg#c>>HOJV zVb)k6z2e+)EC+1p1@q+KCAnPHJg?MCec{L*V5HRv3(-0I^uO~Y8J}@wT_V3=TdzcW z6O)YdpWYz4U@wU;fBH;B405Ta*}ZiBt`lEwuLDLV_+KHqa6_A41P~#rj46%+FItk7 zX(OVP^ufc2Il9G$Hjt4RE|=5QcN@=HLBjevz)h<=pi1=QeAdPTgG|!w)d0 zjK!Yj`I^3qH~l@y`@2)Qd3nl(y2aaHdodU@I>EQ$PIwE2i)^h5?05Y;k;M zQf57fGwY?HiG<-TZT>HQm*Tck!0PPm!>&Z3jsv&d?QPC*!h)~DD9c4>$~+Y)lcDke zUFBjyapg*De~PrxUM%5`-G{h)rq$LynaMk=w4l{TWbfNkl|i(pY!P7Zk-B9~(5M8$ zqd>QqGlo+q@*O#~^{Di<3v5@0C@}Jo#?+mvA3uI*!c6PA*?b?`p*MAnnzL`wOu+Nj zY`sF!KJ;QHEUN{AcQ&%f*S2RTj+E_Qdc{I2-}XJLpo_ck=3j}nB<2&SbMcW)ZM?=; z$1G$&>@NP?_*tfen}qg$u9srz$ME{3%9vY7*?z(0ZxY__?@dHx{pKe*O&;mgWjh|Z zY*B=jb|f)Qve2%Z&5oOCYDOL&9x1JT*H=_mcN15$v#a^SNJtj68+>`RkL6;&MKfpV zSErJ|-|Q$^@3PfQdv@|`+wNL7>)!S~Fn~KGj5{|`YG%pH_pXgB#f$1XJBMfI<|-K) zCO%?iO}c8~@4cAfnQepsbrarV*wj-U4&tg!Jce|@YOl=(4j}mbwjzV_m0CZ4Zw^5HpKD}GvgfSKKSmFNokplc`XMtyKNbi&ny+EvP3;=S@+ zsFXp#`b%-u&;niK%88r3q1AD(+{5H)$KS|u(5?ITA2fwf)21{$%^S{AP^YgDOVnkx z5iy3(LhB`by6JrED`8nU94;Zr3#k4eJt8dOt9nT`2n3HhJ;i%uuzVj zJl@>fL|{n!RywlECocIhaVmV%(8DT^f)}Fl81Hb0fqS%GXHzW-&-tihL=IZUqnNGg zT(+ii5T)8CRW_F$=Dx4&f@a>?4;2^Sbf0K4uUF?XH}l(iq1BcMy40_&l~EXzPflgo zSzWlgq=Bq4Mn^nUm*;Mlda-1VUTV6vQeEyZ*4Z%TUMiq)rv+JjUE-}|rsowClVQ=lC|#V{uR z&X_V&K##uGF}dsOhYwfo@w=?zT4ObFiM0^K;b2KUlry$rI{YE$Zu(8AHD?n4W5S2BbIO zk4BS;KcDaVKYfiR#>zk5+qYQ-p5Z~C1wmOuYObogwtqhsllPlkMWpjxgK|Cxhvm@2TvsD{= zC^N+3)YCMDuF^JYiOqm~{$ZTYfJ4A?Jl}pnVTmg`hqvec2)`;!RCTcW> zK{YHx=hsTC*0(~P29K3t7f`tyiWjjtTzTm;Ennb0^CwZbOI(QbsgG(iyM$Xm1YKtO0ouDT=&r^euj@I6>hppE;6#xYKTmwIK# zDr_xo@&~VU{WaqCd;e0|wsW${WQm%`$9<}@25MM5=N&)({-G~7_=ke)=$_jx6*jGd zx74FSviF+)>iK*STVVP(jh%H9WUmyqrs4`K_P88$FT+~?O7fFI=ife1D3ae}MO%xo zY!UKgm?cuk!KCzcAXZ&X^`NiJ%B>o=kW@~{H?A&2=d!D(Ryyx%KUQ34eo-tQosvziHz|tiJ>64|VpAP2aI#sv8Qq<*6NP@V zf`V<-0TG93aU8Kin2$3{#MvQ6@s&T}9;>?6psAwfi7`ECY5!W&gLTR5f_rxjlXy|n z`3)yW_J{z~q~iHui9?qp5o2qfVeiHxwVPe8m-xzFD9?VfuA05jx2{`(38Fot;M_=HNDq#HR)>C zmr|isB-1tZaEw}P)a@w$-;c6i2IY@S#;@?e7_UXfb)@xv5zNZe^?%ahp}o11N^|R$ zBS$i*Kzl$XpulY;H~U!pc%w)9Gt&&(wHv!MOst1gF&p^)1$mQV-yY5)=kR?lS=4P!*zkV-Dmf|XC}jCto#?!6 zsMK?L`F82k<5{@r=es*ak2Bqk0y$e97_8&1>kNBZ%}(dbu{XqP>Ir=&np@_J~9|t1?K-6ihb2n z;MS6>Tt-#z0Hx_Vsi@I)T6Kj?E%_DaFZ{JU+DR{N{_~eHmvkjq1a>Wf0SVe!pm$0Z zv#w#V)(^RPGVCMLHF1jBrdy^o*&X#lt9@-11pH+1LLNHSZry-Fx$-sr!f=%l8fmo{h zPc`763C=9}uaSLO3LOld;}KZ%hYudiHJlP)Zyy(lTKYzL%n$KaO_6x7S1%?f=mXKx zVY86M*}MYSaR%WvDIDM}CrEm3XgT6EcI^1AJnN1@WYX&qi5x9;m#jPs!a9{VhM#sT#5k-cToGlZ=Z+jcDQj(sI6E)zwWg%J1DzrXA!XJ=qvd|3*7OZ z9M>vA$~u8;Ei{)Hu^Nt|HS_zZlC&RTv{&I~1(iKFALh7ABIb_;k|p~c9))!{P>^{q z=fthG7FP?IoNjmUA&86B=nD)CfnwBhe{HlM?r226W;bwOG4D~a5u(J+vrrEPZ?MZ_LGk+q$ zchEV#`Ki>piw@x{bX->eCe62BcqMeN=$LMi$2{`p9K@SnL+t~FmAcOFmFC`nSJMpB zlN;pft(lkZ?I7Wf8b zpSPFjlwKk;w(9sUAX2>GpjZ)EpleLO{sid-%bQ}}JcU_?j z@;I?zV&dy_((Sz<80Q5n*joJl^8H7F?k_u?0xJ8WjI~?p5)n3e;-2f=cR01fX-&Ok zr3kxPw*A>38RSR%j1`)@Bzj6hiPpx9H$3M)C5SuMxb29+Q7oC%_n$HYX>;i`Hbd^7 zx7h-L_7~QV+PO07V8RoVPaGvsQ`AehPFei=nL#;6Url~NH9L8=y1+K{$(rR$qU@k|sOB2L^ErTFrx?Ikm`%HcOvC;OOht1rNpzZfbN zPZz%tf2Jh4ztqR~RJlR`%qEOOS-gFnfRmlkZy7jUxzRo<#Bj@)E2NUd04;ei9_1Ks zoTtX%eS+)To{Lf+v(rPxqDouG4s;giuaCLEd<%JF>`&MOE%>B~8GBB62!{`O|07gq zvUPwN*6L`Ein`_Kyt)fseUJaD6!Re454R1vwkM%#Qo${Z`Puuu!{c~ME`$mVu`7I) z6+9>+D@}PW6qkNT@fI0f{jI03<1-&}M0CYLO%gR7<l3x&B15GJj-=o!kqLLLj9`Qh5+@Z@wyr&}lptW;I;3ZY6&%vvOAgSkt~37BDK^d3 zq3)x|)bL1@`=pFn^koh1x3UT5OYhM4h+r7g3x;T(7J;Ajv8r?(Wffm;>;{HE-BSAy zH`l4Bs%)TM*~yX>M@6t-_~{W;Loe(Q-WJ6^+V-XLeH?Y1%k1yAchpi#;|i~3(kcI` zRH^{g`>+|;qjbMpqmV}{T%!oShYsL+jP6nD)!1^hT8PHU34UX~UzyKivUt{6K|uk{ zBuP!UE7$z#rtlo)m2ag@=oSm=f@beGspn*mRD_@0?%%edFZo;JccPH~H^wR$m? zODj*U@ z3g*)|EW`=Paj2_bjfy}jOmxq`)GSaLOMDe-EGeO_iwi<;_q}YeT>e`@_2t`OQ!s^t zfN=M>MvsYzhgWumGu|xR*I8V3M3tlv6a_LeVB6V=MHFs zUsvE1hJVT55!DsN`s9gXt_m*AM4df+Sc;U4EaA1#q;B`Z?NYei9b4qzuTbmdpa~x^ z)f+(a?7vGDsA6PL_7$~xB3?Mcb?x_2!I~W_J`TE>Y4&!w(>yS6YF=v_%&A`1d%lz?EfE;iSjk~xsP=GF_)I{f65jrY;JHTO`%2?dAbP>er7{ucZLf zcAv4smIp7FIJSf`>?bD*+S=iZ3yre^6gMXSavE^($_K~ z!D$GC!B9~Y5x-fu3&g{R3ZWHu(nB4E#s`V?*wsTnd}x)@5EAdV)A1khq}0vI%;et~ zn@kn=EOFzQi;s_YK)G-m18CzhkhAn>zPR>LQ0~5hcG27JK1}q-miC$E&)DAP64f4c z6w1x>i%1E?MY~39c%o_xgWdH5DntkN=wW_$NxeN$@LK#{ztS7RL|=Oh7rXyS^`L<& z0qxW&q<0bs1mR z|5B@ra=pHS1=|KdI$H3Y~E8n!bsV@FF~`*xPtUmNwE%s^gE{C#a8s%1^au0!H1f^aEFK4w4YOZDK1*$Q;R@gdTju0 z(Cy_b%*{yh-Z0QeLM_4c|AN5N0(e3%Q(B+*7xIJ}z{u;S?rQhWO^tvW<5M2MQf}4p z?q0oUWP3U=@?PCiGXDkUdgZn{z^2Z4n=IYAXk@hP8Sm=VCu()kwsEAM@xwbcy<8WL ze0RnVZ)Uo+pU>U^?6d^HPJdqX$k4lRB-t5{T~=wX`Cl!-)QiRF3-EWDbg!#7rtbEv zK7*ZKBixWlzkbzA$Z1ld{(7oN-k0-FS0n>$rx5%@JL zjn_vCT95eo%dV%2p8GwlF9KMimD^)7(=J^43b1r#0_(!%3zwUH<;GNOG}jC13r7xK z14bSxcTzmK;9|-s-ehj%`CIQ3^um$(w7|%{xcFPo&n=zL$l3>hAVRa`HsQjNntZ^> z6}~6zAI?7$A`)Oji4fVwe;<9kXk?BlFmllBjoOWiZk*C5;KnIdYwq5jyUK>Bf#AX)RmQ0K`2(+8>H!e89=6R005?eiQ8Ce}+HP z9|LA_O)JTQB|s+sj=n#KELrC`Ta2k0&orz!(oK4Vx#Qq>ZHiM(_0VQYWn^?gLy9-v z*0<;vdtM5T>eF;=8W5vZQp76%+W*4)XZNg8MS^_q`!w{-`$tO!b}7*0thOZ0 zMJul;eQOBgp18&SmFsdN<3P`(+%)}n3v!>^Rd^b>OucxT0 zDk*Rq{_KzDk$#&3Fw4x(ZTZXrGJRJh97%@6$Fw6ux(jF48gW8$W!TOfGl!TUg|RWb z;90KqKQ(dX^!rT1^2 z%gRxT;RG|ywuHsK_oYwkz`zM0k;mM7jyz_*~eS)OdiGyrkJIQ zqZDf;TaVWHIG^EYDCN(&`k@fZr7&@;eGf`36p40Kfi_gv_n^3*KTlGR&bK9$=_uFzacvyQ;%9)|8-T=$u0+1%`08|&{zSR3;_J*F^ zKntUV10aG8Si3sShbsI$bl zZ^~

PLT`dYZ$8yU_&iqest8p*Sn=-9CkR0QQR7p6@_2>xCFI3OmI6?R1Hh0fYf= z<}=@~mKFtfQYYzJ3+H^qIXM1R zW+=z;RuUJnJ9fnK%&e~3HyJq^{#eCgc>r9ye0Obhz`zAvsK@8qP|{#Kz(&7q=T%tj zy|d5{WI}jfF!rBoyrt8{@LbiTc0iwD(`3|w1(1C_9!RyVrWylhHa46tjTgd@W4w9i z+)B-}n6MI)g#m)7!{whObygc6qX$-c)@R$mUUSyDWxD=`ss=V8(o*jH7K|fGY^5HK zQf%3(!o-dXxdY3*Ro}lSxQUq3sT*?5#%=V}DWxKWeiduwg*uFsvh;X(ya!|nO7rb8 zVsYWuwxpWHV;Hu4^?v$@JeU}N50}E1ybi{Big3(XRKnsKgc+Y+6 z-wb~aX}2E|2W#-k)4nSK%(d>8gq7CGs@v6TpLzPLo~0X)ZDNQ7TNqMmEC6AWaI}Z^;6f!bIJ*YA zaQEg-^Cm-7F0dk1MMZ!K53QQW+ZkUNtm99!q~fwOGd@T{OSz4Ze*SZq1c)W=sk?<8 zvNk|&@aU?AX(D7xrQdFamPA{xte^(a0O#>&s`U0*|P zNs1A!2pnL8CqFRt}McmlA#A639$Dnl)K^E57e0twzjr_ z>Z@U7Xm)01&5=RMd-~`5GJ6znt+79<+KFDs?$K9z5xDFs#{blD15i_C0VsF-2~@Zk zFhuYPdT!3LuV6euz$Ue8edO*R16AMy+H?{`D<3h#Speqkt+xK)2l0@@ZDjuC{T5o0 z5(SsV5hVzeMqEy;ep7BQw!76yOgV=Xt(^<3u6>?|WazD^tAo74uIYLj?PCDslxVz=ziD_AB#) z*Yqi_Uynwa`A<+a9WP~twSTzz@DU5kkM8$)U?0#pmpz-#_$OcprJv9s76nUVH|g|9 z;eyp^!ksX@m&mS{HgN;kOC`AbTpys*Smx8WNZPdRFaaOzv}j)qj>cz1+9(O(pHjMqt8wOEqdkrqY@7^}qk~d?VClee2W| zA{TpFKf@i`nEU5D@t?XwX8CsO0g>lYJ@wNZL-<=>)b%C4o>1r$%pPOa2FTmur#KF2 z2EH&4I;+Ay-hVa<2m}*F>Y$BjUM4ce=S6RX?KddL{f_LUxxk=3kC zAk(7d2k(x*yH`u>HbVO0s`d$o3-;g% zJyTyfI0(JIoMAu>lsEd!5)#Iy5Zf;jgz;--XsZt%3J7@#_lD;$u;KU2x;ST2UA@k$ zDAJutKXErQ2pru@5b@7&^O^^lbjQ6q^){CO;@5t4X=4`SXCw?7b8x~R9**GL0f3%E z{bcc8!r`!2_2Nm$RlUzyK!$|8@~b%|yz0;^L2TZn+G5|5@$7JN~+hTG+ zG40safIRmR$q8rcF|Ie%5k;67i8iSk@zrVE4|ZqoZK>xFz_F;Wnp(M@pIm`8IN%>CR7mg9Qh0}5x4^^UMy)wogV zuCBfN7W->4r}U?}hj@I)rKa`R7A9Z)-^g9N614MKa?DMv@WH6qPUz!geXXTO>g2fv z2##ChksJrixOz-?%4ZDFDbB^{VZz; zj^p;(Y)|!TIy*g#)P3AHR=|Nkwz?1IHK4Jb8-o6;Obfy6cqH*StA@R zHhvMZ13*}1{~FP2YKh%=iQ}oq_xKNWKZZ&Foo{RF+IYDlE0yV?l+>gvMp7=vE~Y&) zJf35Dd3gc(ZhLKqPplZ@gEvVK+)@?woBQA=x?^upafpiaV^|VD&yxPF@R&`z9-{MR z&wh?3{f{I3k}=Zp6XzOwj%(7`zWmAZ%6w$Y^RPb$%m1u8@Sn2+(90t9f|3%Lg4ZLN zfYqC~xc;2s{P#OZ&kDfJ-}j0C>#P2_#hWh!h)@sNbpKpl{I~A7dR72VeHA6SaMz|H zh=@xRREmOtIiC*?-98hW|DbofxF4YLAu)+@SiC;Pg)8Fl0!qbyL>8`G@NDLQ00jVY zVSMtP=AvmbYit4|Nu4@xUWAAc5rwt7k3cKZOj^ahHT0>b^Ait3N}rN(bkKUnp2EWcXg^1}cb zgPZXuebLWEhoYlz0~uy0w|=RNFld|ukZi{W1Q6wG=SL0}>Z$weul+qy;}I1e9{y}u zec@eaqL4E3aON5g$nN+tI-E{v65g6p__cEGMKDmweGUs#kDWgU22bZ8_4~X%b)O!% zA{>q+;^4J#AdOdg^Cok517ilN#R>ybfp4`=7%78#pGpA4&@rrd`^u8Igsfd5^#0$D zyVa@cfV>{4P-OuDf@35sRWm@N#77tm zuj~NGo94#ddSU=RqyA+N1gO*cYdtp}VC7^PBqSwGG_|xQz-h_J4o-S7Q6sj!uR+=md@|CNKWr3bY2?Nkhgk{#v5SqK6iOr)5?>Pk}3jv*v}qJ zJr!<%U@*q1fgp_TYQQbfBj%Z)hvu<+CCDQ?`tANdUjhzJz?)=7E>;2YyWq0B=_mk3 zcuxhAcOTY4PjEH~Pb`9g;!k#Fb~eX#zP&$Ri(UM>TczDl*#wNLs|ekhDruCNnd$Jt zHbu;1?h{u@xP3`AoARB~_2;M*DM$@N`)DQQUyo%>0a~%%ZR!}LejmY&sV=232;~%!PoD-S?r~xqKXCB(6-J50ju70+3llM*jeAi_Jx-%d}$sjhkuYfOg80Gh#kI@5kRI)I8t`AZR9#lZ797RS+H&GnUe zr-t`P;XBD{L-&{S(%M5A#Gi+dP*GER^1^`omtudg)xw0BwhLpFlvt0|U087`(9WM3 zmtPDWnq9fk=aXzZkb8zD?LZZr3ByKCRus`^8Bc7q(F2&XjdV#6U`-fvP1V5!gmqmYbYmSRaqF=G!vDj{i-viFBMp1F+2#2X}N z0daXC;J1Hh1e9^ugc{uzADngH?jqK~dH+7=N%42b!pvuQF*0 zrYxuQbQ^CR2js9F4jaQ6QI#uj0KOTWWTK&Y6QVb49(%1OY!u8q@C*<(RScM%y6<<@ z{5hN@hY}I5FTec`I2PvcuK^FMzJ`VMEKH8mV#liof{VnAT|ugg?n537s+Wu@wL9YY z($LnKO-yNO9rpfW4GwCmg;0|ap0izW_e0HB?+Mgm)jbJo`#<>qbV$UPx8(weM5J$z z0$q2}wt;{`-}l6Ke@)bpoDw3LKR$G|55O!JPxd_33*;|dx};vHjzm_675R&~{kp5o zBq_?G?qGZ%7qI$~bM=n_{dO>r?wE79T?cl1h{TY>s21!9bo~t3rsaWF={grG-gTOP zqtZ)`js{Sv?s+jM$5)k^YqQH_Re810R|&4hf0}(@|5?I!1bbow-1PU%>28BiJQe|x zyW;DrPYJcKu$b@70Ho7MN3?K009U!C6zCMTPdA0IvaqnAus~l%+$w?8+ve5&mOGan zuv7oITL2i@f3wN|&reoHfY*00^Y3N^HcfG=X0;?LOChX%FkegEK1|4NFdQHW+sCWj z+{V=wW6ogAWd9Rfw+Ee&on?rrX^p#WD0=yR1>N>t9j zwYj#j#y#CYRolU8RyY#`Z6oIdRm#={V4{xYlCPzBxPhmuF&FL}`S4S_NPRD*|I_Xg zUv|B-*|lf7{x9*eshvuJ6Cu%CSziG&7YHH3MZq1ef__z3C zvF@6fVNa^06%giKfwr=CKx)duAP&A=%=|SpG#1DW+9O$&Esqbk44%nTLiI|F{|1C* zaZ4LKM(~P2M{VtBzoX?m;pgj^hK3db--kP&3&H{e1NRNHb8_ar4eg3qc>gRS3!FLg z{`X5rAV7wr`LH)nooTr@;~fAJ$u0Dx@ohAmB9ouGJQLKoPECzyVqNvCPC!ErCfLt9 z+5pd~a&pjcI$DZ21J_69)TMC0PExCvr7%Ft6b|rA^Jm=*)1_n)dn-dx0L;{{yQG#T zCAnk$-lvuW|4pY#tijn7>mFj%ZSOxG_Qyh?arBCpP?*C8?rEBh+avf3;D|rz|CbH? z;QM3xn(`EoKEz1+?$3EYr5pmHc*>$r(f`p-{(Xpy`IYFZtK*;XyU}z*g>4JPXv-~_ z|J~r5E&pb|9DyW+qrIKCSF9N968_B1%edU+C?!Hb>&5!N6GS!te(avD%eodom>LQ(79#c(Ab6VU&>-4c~Y=3n}}z&l3QrdT{}^f3Ry{ zzR`k#Bslk4+o<6FtPUK%%@4jZHxx*KJ?rIHyPyuUhRW_QPo4aj*>oNQ& z3C+w-7%=;@t^UWuGaChxP&hk!iJ#JrA}#WE(#5kp#r-#4bGjJ`IdO_P%y%#SWpLO* z19UD%tmqWJY@x!=RZ&<86#=(Fo-|JDqIbxb7LNeS=~pEBd>qNcZadQm)$FA01fDAmV86+tk7Cf*Kh5nQN6s>UM+C^nEGv@NP zWaHOw`m%mqo4f+XG8h|{>u+25*4JIqtj1&c(T>0A8$EjsSc%_JvtF6a z29$nk5;`C=T59{*;R%bQezhz3%KVFllL*rEuzPCW`^luPQ&TLq12s9?MH;3jrns=d zLL>2xngm*R$%ZUHeA9hVAMW8vkLDbRRbQm^nrMYxpUTnhI-5WPj%COCUnlkF7<*=e z+d7TnW(U^bySHyYVt2hatRJFx;yZ5#kSlnLWwZVwMGG4dDh8=H07J61#m?G&9F*8A z47rqVB(1 zfPc-Blp}oOPSwYcAHhr0$%dkCn2%LnixU*q5HmBTEdia{G2rCJg;mv+%jI|$hbnw@ zLv$w@%JuAq3Rrv(Y=Rm`9T!>G&DZ)YT9ONG-#d}sI+=v->~&jx{HREC`!CC%bN=|0 z38=xJuiAfIL-JP{BzaW`71P}=1^b~QmcCkxvR$6;AjJH$e^NRwT_RCwwofd7AR;N* z!N$nb%MuS0lw;Zu7(&o3@SgBk#Lw>vmdo)SGzvd{+~}BA(lU6$Am;vD3g?%r&|-CQ zHO|~{d7IZ!vg=_^LZkcg_MLv1x_Z7*ZESJsP}>D zyD%W3G(40fXve$*HRTqtAuwNq8q8b|3X5McOo>Caw6uT*D-<7UZ6&#Ziklwe551IU zgZEO%^ED=SrsK=^zp(z|bi%$okyW_6GTE$q%W3p3>kch%x9zRihktgq z|2aF{gQ+2jGQvG7!(_gep171jn4W?m!hyGZk-PNA_wGF3SFrUm3%!aW1H==v&>w05 zIW%`o<@D_*psywN_}29Gb1qE!;MF<&jrJETIdb<~e*YfZ)J@Xu3kIOWwXIt(`WQkl z)Gb^|j*tnwp5Z4iDf;>Aa1olBc5j_m#KgZcJHb4mve=}djS8*uXTbn)VgH?-(kGex zE6!1ok!!~_XWG*AQqs(*h;{sGS4os*@_c2v}WiD`PxM zY%wHslR(!6bAzW5+X2E64d?fsOcwl88bm}=LXz`_%9!`>Kacp2L21wdAe3^G&fNWT zcJ|+urE8ywUp{rTD*m5yum9dofOoXL0pOIBdJ%5_3nBgC%L6sf-rT{-`;h%YA}B`| zNF@c0UvysxR4TnclZsS*Nxpp1>Z8ekbg|$0jwty>F_PmBfa>MU@VnAnbP<6K^&8mZ z?%zADS4&Z^@$wdh@=@lsie9v7fWSts5hY&<3giKpg(~-5nt#nHu#BbD0f*V191OFX zNrJ_$+~Vb0G|;DYL6w-40TMn@ug!GeZ3JhUfHR=T5bp3dkoLVFq703CC-dytKSd_B zx&W$hmS_T@neXhC4}i*78OYq+Mm{xrQ`{GIeLh@d@bIi`-=0&XxOz1b$i80!6@B)z z_gB3gy9uNm8gyn+3w*|p2BZk%Qp02zaQW`~s0mx0fB_UwP^Y+ZJ^YpW*XZeojB#O@ zv`6OV8KmEg#K0-Bv201gj*(qSA{}QHqT>6IkhAW^wJ?Nd+g~!+Y;OqD(9a^tbW@~8w;`z7SyutB^81qbwD&$`# zsa2L)_=&3gNu3dL)K5F~QMS@oSE#G^tn)ogtuB>O6(8eq6P5R2T|s}rc0=Iv1*?{* z{xdN~*)iN&lP7x@x!cl`2DHTZR=zvX5z=&k*5NnD=1Bwy4d z)TBT+e+`Ub@Wk)|*j&T`yL$Ncf}8*+#Tws7GGrcM0D^jC(WK96ZcY%-!f*AQ!z&Ny3Vgv*7&x*{@ZMlP#r!?_2~!0 zk%UQ^pUA}1(pG$u8N*1eC+w^>5<0c|mX64_F-IDp(PMc{YHoineS^br%?nJyr)}lgLe+(&(Fuf&MHtppl(gpemBVq78nFUG3?m47C(7MWAEx(+k8ke5Li! ziqLi+ds;Ptz{C9^ayK!Xje_Fi!p5N9_NtSAd;=*tE63wj2~c9&*GsU7qrDZe(V0$s z5duRO%+BE=2v5i?`BWz4FfQRX0T+OvdS5NoVF+4`vDOPUO0&{{)e3 zU!4KeG+5#wXQN}?`*l#={&u{;$pd-l+QXjEg|cUgHS5*MWS;-#aM3P-{rJD3_Zmu* zrGQf5ejxb*Hc~a@*8FNAy;96;vr(|%t223#JBeccGC$u+6{Rx+PpuUTbkg-eG$#8^ zdYA&9C!b3-aXWA=bo8ORq|{Gc?lm+5Lspc4R(D%ew$fS_ayseZUkbJtz&QSsQc$)T z*X%lUC$4(p0EOXVee`IAtP0on1|S?4O}!L@CnU4AgApb2OlsZ=etwWn@~DvK()tik zr!v3!F&A6<-{KGb9meWjoZvgJ^;dS_wg+3kv@Ah)G90uAyB(TN87FF9ri`URBATLF zW?gp<9s7!GLksQVpY9YoSsfBQlV*qEL()f9A-%n>q9CpN8@)swHz)0yH35&)xg-4i ztlhDJu%9H!M+mP21U7I^#5W^A$1=BQ7TbzNT&FQJJ3uVBb=hn4xcS@KegFQQ|4c`w zrUsXNzSy0T0|=PUUd2KuW7k@O0NDp z5l(S{cx1v=Ctvf07@|uF`aq{_kh|v4uU=^ro#dAi;jIH_?4N(u1h9yN!Fd+e{FaAvG?}(kS=>Y zF1%B>s2goOA3ih&Vd|?0yksacE$$%-LVEeKQUj89jL$vQwj&IZy!>5x#zT6*%}V?% z@CNqt09il{jL!yuJy~U@!s4HLBkd`dH6&;0_x65H6y6aGhqzCJa9&t*aU-17*Pruy z*X$KPq=mU3J7=wlrE;6(Inpq>Es8@{Tdy^2co+#+n=veF@u{5DdWDUT=0+AbLM(rP zDEKo#fanRwBc`UQQmNJ>mcifWz!d$Y3h5vk$>Digp$t!y@z!&Qj0b(78sFa=qMRGI z`{5c^y%A^9((I?k77_E#vYpi<$F@1(!5vJMZ8?P{EDF$aj6y9-N`|c1)qW*hjj-BY zk~`@5)wa<_c?s6NEvt{(5g&CHaSIS{@nasTN0VAtHS%>INmRCb4!T*Wu%cv^2e%{^ zPj=sZJ;+rPV2b4xMxm9v2d>VDgJJ}CrYCtk#~(T+`q$Nxi8(chH1eSa?kX5 zbz}dXUNNY?O}}a#UnCB>E8g2H!xg9d>@hmlFk^} z-2S`{Qqd3*>Fxw4l(hBFbYT8t)HfJ-r4y*dtf7(}x)FBoSKrtBj!3~Y-Ut3nttCqn;8C93tEEl(E5-~^gF>OC zgn~v=X+C%ug^A6Gq#V}Y<7EftRG+gZRrl8Z`p`tMW{GN=G;K1b@3PL~Nb{ITi(A|G z)S5!9><&wLupBj2t%6}Wrp3;39YcR!Bi@j% z$1v3{u>*{6TzQR1UJLYt_u5hjI#mMcaj4HAY>*VJ4e%9}Lmv!@HR^plmI1+&-wAFJ z{L+fD65!RAl{6kTph|SK_T#CS0X>3oO+1QG0nJ$11ZAESE{id0xXXi6MW*i6Ki?3B z&F1p2M?xW%Q$m*jyL(z_@meN;P^LT>ngXY(GeYgmQwbdBTX=QLXV`$tQzrbk|W&9#cK&n=9Mpl7xR zd{h9i*C{1cxrargzC>&Etv_tsT?Qz!%7f+JcDjWX=l1!}&WEZDEE$Qo(%pV2ttc!o z>rLzT^lz!Rx~US(cAu0GhY1tP{*mh5>mZ^l`>aPidfjwksGh^SiNhjlbHt- z%EQy8p;v$HW5q3pJ*7vevnsu}6JyZ!1?x>w4MMC~A=~acQkrs`G!@~8(LgXXCO+E5xN+Bn1)S#OWr%!4_Zvdu|ujJwU<+)33yk9p9~5vcRp;MiB0{=Owb zSxm;}-478B>NO^6VWbdP9xTT&CK)vO7*(jJ!1&nzVE40liE5#}P~A|j8M0T&8^SZV z2q&vPGJQQ+=e;jlB*!gcuUi%41xgVTsYoN z9}j_VP$L{B*q9O*4~L6^-hD`|+gR(Rg9)os-NhkSpR`O^AKme)Z!4g3|BcMOUhDbo zFtH_kb+vq58sSgt<%%`N>qky{K0U(Pr0yKi6-kS|2@EAG^XW2NcH?a9!eV5pC6BW2 zNiKqM>mg}t->x7gBwCRhC=@y(?0Ouv)bTIB>eZkG_=BIOT9Aoh)WV~k#DU*IzmJ@h zAk-1@(Qi+?eEZ(lJCK4v8#`sbCo2v0{2LEp_N#3cq6ld8?rJK^?KA#gsIEO1D9=Xg z){}*RhNg#sV4Zi^&9+O4u?QB21!223#!(Qbs~$Comzd3XXiD2(syZ{ZsH#5UGO|qb zF16jv{b#sD>-lnSar0n}?(yHpa6KeluZ&bpQ7Rz3SKL@mn(u1Z@33GHDDWnS(6frb zzi~97^coJw2l@80AP>HHKaW`05gak5twW_n2|TMZf%LVT`SCRY&iD}zo& z4M><98Wc`z0!XLo$Yul~{FR(03S5$3adgsBoyo*6&Z!#8C}~}Ilib7~Yd~Iglu<*K zU!jOXc?e{oe6&4umA11XMkT6>uK}cUa{jFZgL?(7@ zg5O2poOMGmey(#(Y|({m|Ae{hw8*<$-x*KC2?2NZOWqPQIk+Dh8bz|6+Ysk4|UzTNtk)U14>oQ-R76 z2G74D9o7NKZTCG5e7Ep!1uROHQ8Zlu4ajARwmxvgTlp71W?F!7Hf_`zB?>z_NO?`z zNLBP4-Z-)lAfKt(qqq9v0(%{7l!}<5^*$PXVjaJ|1*TGStbqW^|M{`D zd+r3o%57N9sXL#7DNM-bh;CzfHE16dg(@01)vDy|{U2w%93~x?gi2ZO-W=W=TM0j* z3s`PtJ0j&G&=+TYP)QOStxhD%6H8uyw*dJF@02xNXi>_{w>t&xtMjkFx4}Nyy9S2U z?dSSE_Rb{q$Fck4`Trm8-ZCu8c6%RIL`+0Q;h`}Am6DbQ3n@`Rx)c~Xq-zL~P*NI( zkQ%x>h7gq=VyGczP-5r-1{j+6;)%VVz5mbt`ThN%$Bf4<+;y#Mt#h60Jn;lJ%7=^3 zs3*F@{NL}=;zUNj1aUW-r%)6%@(%f5qwO+75nX#4?hkpC;Avfd_61lzShhDuqQ?&< zX0|kXiSf~j&(;s8t5^hB2FYro+3S=hQd^y%iF2{x4#`{KHVyixA4>*8bsfsnF4+pG z4slydxD%6*tAYf92S9*@W&taVpo(WQNfzVcpUgG!PlnEX!!1#3ms-?_w>lp5G{l)T z8f+l7i_rI7rd86HsNJ|4?o0(SqnFFFV`esWI_68_P(s*8Nwsi<&8B4=VkK zT`R^hS@nlrhQ>`zFyo~QJr4q23`q@v{SE)FzA(wqi)9%q^SpBRbnU=EuvZUmOQ@eG zsYjcVO+IWzcPW;&Bf8UNf6;NjU5wk|nGtl^eRK01>kF?A1=QPU25UX0sW9=KawrAf zr4cupl8C|0Z0vWh=!n%+x{AlxF9a;E$#pvRAj6G+M~sY>q=IrxfB*R8&V7t3Y9&nR z6FhRLgI%83`I?WSFx~9I?)UWr-c%*49GV5T=yx77@mzy5LF6))wr+yU@3d~%`NdnP zYZvEyN94-7YBsPr>(OJR%?FdtAuJ7gZXGMA#qejxR%C4-re znyKckXFY2+nEPQVq0sA~;*^4biFn3RFRHgMc?^W+^YKoe!S#=&0iEx4* zMZwPjIFlUKsWYT9K}AxmXR!o7KcyWY;`s7MFcQ+l~m-|lOQqQai=ogzBu|Fs`liVEH zRcTi>F*$q_T$tX1u0i(HqEr{b9L$gR$evtIR@U!8Kx`}h4oo7sqV`CVb<%TwP-scO z&gwV}Ee9-4>BWlrr&6H;g`Ga`4g{Wdz>Eo>qHAAAtgWwn^zENZ zs#v!xO0bhLdY^PbNaEYY6v!9dVR+v%hVrhm=u#JZE3KL>6AAmsu=bls-Y-*;vvFD% zm$WYDH|`}T6glYhB=mcIS2GhgMvM;^mX42#d=cKTdug|D=3-BXo3fw{8X~zt=Z5!% z#EnSzXE`g46_CTtU*at5n)ZEP!94kPf_~_aoybYc>9Dub+7VoDf64px{g>SvqdI)` z1Gao!186~pQq@LsaqJR4a$bM*MihhM(c8k4_})FnE{8Y=IuS=xuflqPw-Iy2$y!$V zkA6A{4qDUtA4s|rPcl8JIBmOq`KlZK8NNUB{Y{1_)+f?WzUf`QmU5QlJc*pl$AfeI z8M)b?pI!fi$?MM`(z*qZx)627p|EaNw5nkHQG>e{H#H)<$4v(E1b~aQ`mfH@wn(9 zuD(IweztUeBrEeO(0m*9E-MlsUsMrX>{1Ik!bGUbu^arLer3Tytg#Bupsi> zoagS2*Rp#NWMO`7?(~^kj*dI?RM;q|#W3>WG!8%h_nk=WCz8dU!5<{K9yF$}j)J`{8>EUWcC>^844 zQ8G3V2vV>KeQWaxDikzVv6>byqmgIgurx5}!EIsGAu@bvQ+T<7d$<)K&w@gp#>FTS zAi2z%_G)UgCS2QD@==R>(qohRS7_W8dSJs(aw1s1sQTFA*-P^O7jmXevAzc5~g|=+5^t~aTu52Aj`a?i!ovN~|i; z=D#u1h_6WAcSs&rMk}KuI`9b*9bPH5tlIAi<6Z4g=)nu|u5LoG2qb~18x=O3$RFRr zX1vDtjispl>Xsio^KsC1E0bBPd>c9G%@XGitWH6HaRI_Dnxt{KKB-6~3&8!iQ5?-| z-C`z%ig=x&x~n3d;_SWtN&lFfd)k#z-S7dpVV|Jmm*3o} z%d_ALJ4Qdhs%AoIp=R;ezA(qelArvdxFN5rHot{Aw@56fik5l2UHmRX z7wWXOcnXMj?8}A($zdwX(%kVePWu}gdmFPA`0hn*+}=R`^I@m`?YHhz-Z4oIQSpN~ z$Hqcqfr(ZsY#0--P=aauq97}sntZb$ucqXRRY-ig0xoHJq72r}ff_1PYJ8FRWO_;C zB~IAhYKzR*Yl_#6>m$|O+bsbXZLtVKNsO$cO|-($_mP+SaXWRfoxiCxXyYiBH$8`6 z%q$7~mby|{bbSH~W?YxB{uVSZmyh(2UW;xX2|gM2Sqmm|N75}z-9lR5clC}GAAFx{ zpD)dkDgg}*LcF8S^LXCg!fw>=3XV^LF@UH?IYD%>kvxNd_Iz9tAB6QJyx&TWLV2i} z`R9U1WFszA``ofJFcGn{WFP$Gh>QN(LMSl_Emh1@inWEfsVNrZ8flhz7yepuN}b}c&c z6qro+vY-v@6CO_=8<))c!nZNdC{z@*+8|T6McrqiG>nqFZr`maYpgJ-%#Jf1jHFJ6 zj-tXn-e^8=)^ea+)e+@4b@FVc~%OkJ|3#yNxrJdgxRlSPBU~| zmQ3};zt}quzZV*ceW}^{R_7D+>4ICbwQ}FgiuDRq#=-jLZZdB9cySJ)9_Y4S?|VSM z$TC1+{3O})dz8)fRni*H{)!dMx+R z5kkSnzqe5ykv-RKp}!Zpw5dDrpsorGZ_9($Y)hAqdiIM{cZs8dMUBmOsNq zBDma`TqhgtE^H{WZ}}`{p*v(Hv+$Ok(}wfc<(o^4D&{~XAaUzv>LJvOs&KK!j!DKP zY}2u~mo(Wic?yix!(3|~#U>08t4L0te?O|@JLl#pmL#gw`DM)6gJZbyM)!hURPB~u z<2i9_PU)oYnUB-BP{I;}uX^$&c-(u&|~&{CDyJH(WBL(Z8u4XiQXgRU@*!4T!S?*%z23VdY9 z7iz1-W^KNsOcJYpUr8JA>rgMI)tB6Kt2*V=M=VJUhN~MQeT~@j*YCaGIZV6GvSN(7 zI3RbOu^7uE4t3t*uLK<1cJj#Xh0)L>ZPqczc(zAMSlzVs+Eso=n^C$k zHZwf*Bm>!qt{UwLJ4&oF99(0nbwM3oyRTV8ES=XWZbT*+;+Ffov&jUW!Z_|9oUxUr ze6Lk%={M)`TuVX|CvLxAem_%!JK=(-mlc{8vh8RtZc38rZakAKuyyn4^kp zDH$Bc$NYJ}&%E$yd|*#QDRpyseLh4pl%7wo((0%cLcZXkQb@hWZ;(eQnJ+QdRBH9R zo&vRXXd#^^<@c}rBSl|a+I)63ESDZO>KKo4q>IZgO0R@#u;=6#5{K!_4v$iY`@!G*4t zyYHNaF^GG9xdyvikXg6cDAKBBRPe#I01z%8vnm}l#|WaVhVyl~wbuK_;KuesM-|^1 zo?4GrUxAeQ1;vaGCqcuKwj7;uG@Us)X7dVy!4uA zKfR&_lx*D(J%9UmBD*EtInlpaQk5cbZdqKmtjm774U!e!+wXYfQdmD9r z$X83IS7;WTt1X6$(0I08#B9HL(eWD}!Ftj|Ge0Zy;`! z8usCC?FMf^_T~yHF~s`7L(d7~bvm42{o86hdr6WracYX^n3W~fez?O^@6%b@3d*EHRzw0*U=KNJsJ4P*RwxoewY%Q{Q(({pEQQP zmcv&)DXMJv(QWyAUO7qJN&9Q6JhC}v<#4Dfd({D6g^%J{@1Q|@yr7hxAYn>mG;r57 zbE5uHzt_yUzI?PG3t!M)smwBpsyH)!SB6Xlt3BLym~+#iQ0Nw}V6-)Y9I6Dum=b%C1e&V=Gn1$TJ@{Nmf% zjrr-U`Nj?ak_^-g@i^BsG$Qt&xR&Gp%#FM=gVAkn1;&tLLVzSZBlYw=H zzfS2u^)$YbZ?1Ho`St>~Am)WVSdBz{PWrOneT^ed-_2q1jj!wI#_SpL`a|bwjXpZ6 z@_n<|Dr`ATxt8*a&W^3QiD5D-fkzwZ7<@p7+o0#hm)$X44ByGgyjgrfu=r6ZRiB0A zy&@ZOqnu?7!rf}v9*1;XdE_N)-0|aBp*pLBO_VH~;CN(NTFyXl3ZSia{Vc7P)TxcN z;XezoC__3iXRA-bi?!rT<_0#;;~&h3%C5wYlZr1qvq#0IBe2U1DrBx{^?R5zg6tZ6 zE6LDZS>liPZpS_E`1`K8J1d?j3`csAq7tEeK~dn?&Vx{DE-QBc14`1C*$w=3iZ~m@ z@N#WU-|GdU^CD&YO=84iCopl;UgN2gGl7 zg%q`rp?fmoJlX7+(z9AcaM>80?fuT>Wt5w*sv`majw=cC(ZN$!>0qMM_zHqb94a{= zC&5I%J>r>?t6Y=jz>gh{fzfH*vcPyKxq_C$bmyn^ZsO)V-2BCvJv`Mg)$ef&{!ejh zitV}EflblKgQ_1PEeF+C$6TEyB^ZCFH{WLPF=FX_)c`A;xz#%USsJ<*Ms@I}h@e=Y zQ6pFW-Y$feBB4$!tOLvXDEGVXpp}0prX=eqT(f%BS~eq_@!>f>iqykL121nrKk94r z*rbh|;O)ksX(Fj$C&wX*vB(~ZSkjisK0+KL3 zOQvoxT`*x6)Duxm3slDH*V&T(6W zsSq-H=(vzOkXSG8RKd=WTg%-wACXeX1Q4Yah%UdcF+q@(*yEmyGHtus^F<3L5!7tV`#5yTH~N3d zNU^{07_linx9wbl5;8^Ayx!ZOyIsI!amCCyd7FmC{liBov>#$YoQivJu)w(Ur*VHf-b;S(9$x;DRzA&bQ_seLzyJbtu~@R7+-y zJ80;|T=|_Zu5%iW7vb)S3)UjXm=lCf6WM3vZkdtnPsGFQQ{O)=RHlj=4WXKPQzu3%zW_>0c4D;V_{mQ zGkO0|p{}SoU5Qiu+1qGhhD)C!y=dQwf|#&jrcuQ85d%50*gJXyntqREA_t?eLzdQv zb01??Nw+bdR*{;P!Eppex{n*bQ?PBhkJI!;6FGmXd#W$?Z&lav$B%z{ILp;`**+k* zkV#t+pFL2cxsK~zTvFx^mwdfaeDS{VLiyLQn5==Tilh9+TG%LQxhs?0LW(ujMcs+U zV@^vK`4T~eS!Ex1U1)|>-~_BW3TTs*GL?HoAdgawC8%MpPs)vw-8+pto-sbKZ6mX( z(5-b49*`*KpI&6Wljl6E$KL}LcgqJQOH+)4#b9X-r_42toOc{L^{V&OJ(^<7>3K35 zmlr39?qfAn#JG#&Xo6=|YZ?oDU%~Y`=c|mxLxeG`JFX9;fpV_t6YNeHM$QkhEnPD9 zqvJD@Kg*61mOebHRMk85a8)3Cavt_%BJ1d~HfMIR|Q<8_oP0RSE$F_0we^;-x<5$-}yvqII9v?S+gZk6W`Die^yn+6s4)(^r^R^<8x}t2u`5P5oElA&vu?o`KJ*W%wG(s$-1LI$N0g15Y!&Joe-xqXT%O zCE1s`B8h0@PW6tQ&!|*EeUn*A_t~7*nG&jQqZPc@`}2Vd^&wCV8lb*qbl|VZYdostr10t#d*|W7 znIx8oqtV)KN%uOqp}aGy*R{*EE=K5)i_8#27gb zlk}26TXtw#IN51aE^+Ca`&y1Qw9xm+QXtCC0toA)cZ?h(`c4W>;bE_bw3K8KTybZJ z+W*UMmjg?s3}!y2NtRb%U;Vx_L!BHlCf!@7PJ&5fFB17f&BW)ymEIHJKmKj(qgtIr zg1U+P)a#BN%-M#!Kt@798a2l1V$S*|_#2$2NaRc*l45Vuq~-R5+h5UjG3N?RSL!Vd z#VWt8S9nlRVchYukuDXt>!Fu{3gS4Wjmzq&F)*Ptr3O05T)hv zyE0;S8!j|9ax_(zhk+NF29z)^d%EqAS%bUQv&K6`G*#)D0`?g5_}RJ2AnJ!b0q$e; zuu)S{hwVVs`{+J-g&JJcU6r;22-b^B>rIMw1te*_+Epdla!|Rn(p?jN!2c*FA@~>8 zGhiCVg?m!?&D_D(+Xl$9XT|Mb6mPvEImP04j&?-=o%goyp~9q7zcXt3dSvu!Rr{U6 zt4NWs#oZ9tbQPNLWof;AD6HdvQ_N#GK{z=K*d0ybjM2xh*uSTfZ*Wx(xR zHxT?Xsj9+k>Zw!n!${pxkXE-F%AK_!5C~;HT2??LqWq*PLkjZS*g%&L9d&{2k9VoF z!uhls?M8cKalHMl3c@qp%JrsKa&%Jb?T1CwIM?!*>)YXj2D#~GuEyjfbzDImaTloC zOmG9sklCFB)27x`UP}Tdb__COF6z1eUZ>txmPA2~_kWK!|2{}_lC++Bb?2gvcoa;? zdgRvmbC*Jk6-tN!42KC*tk0v9Cqz4cW_B8lg(mU7U3cy;AZSAlCxRhN3cfCNC}?!n9gMpFZ@S{p`^VJ_s_x zhD|X#%+0BaC9y6+%2G99rOfox!}XSo61&AMs~U%$kNY()Is2C%Xqdorp5LYS~YNoJ{q!5q$JAz#JIjyV%vU^G6%JX#8d zu5la_tjo7v9%XIelcM6(G(S}bR{Jv>lD0>R^V8CgBuk`?tkB)`%`IIX^?2euTWjby zU5LXtBMpL$#RuQreFo@t1PwmI0F{YrTsjZb_7rlHUdOBUh_#0Ndrs^>KTY17w5O@2 z4c1+4{qn+O9w5H2V}#$;B_g-4^hWd@!ubgwBH5Be6=J!PIN70x`#ak-r0)Nxo*a-Q z{B!|?aG_7`Y$Gkl>zlJhEaNDkQmiZ{vf+)~JqpIH4`qq=@5CRFh5qNs{P!TEci7p> zO`D%6KVA0cIT*%1_5vHqs@KWx$64P(rGWp?%o4h+1Vw{5p7L6|9X_slrw=yv$EG8z z&fKJM`g+&Eb6Mi)rccLMR{QrLSE;_z|XujqLe~ZcgIG)Gce&KSH z;yU-q6TdpLNuBiU#wVg-bXX#=;`l%Wp-2JvY)h@?WQ_d_8$FuVDoaI{>dW` zhQ^KhR+~|GJ*4t477@5FV1qNbH2&aqrphmmWnLg5wN1DFPW7ux_m)Zo&nSdaP2^bH z;Qzk)X&Bj-6xMq9mo)dw7C$koa z8=Ef>x~)4}zP|TG(insHYD4PQ8P4RhD6OzrC7W_8(g{TA)Y!>AvkhDtEtA>3M1M8+ zNJrSdEvv=9O{E8MjeT!$YHzCNTS-54(yzuqrM^(D)|{{|V-1=1!;Q)xRjK znC_^nJ%>$}SX>Z+YWYLgU4yq~Myg#(($+PCW=U-gpG1NI>*IHARon+8S)G9O0kts* z2I=3w-@Y$rGvs5R0}&W1i16={OLqpZv;4&cI6ls2`}mAk>hSfPFu^01Qxc3+tS$>p z=t^k7T+aaBD@sqiwtdXTDe&cqs#yStyr}Lj<4y?5S6{LQ4~oTNsDQ#=qST~^>tNS| zSy8L9vd3)Jx=vj$VpPCl1RKktedCr)SOrUR#fIItGaW%GDJe$CMA=d!B*!s{nfp*w z?mSf+Hv)rat+B^NfaE%2g4I;abnfhY@5=QYl{`2(Gq(Eeqg|NydZ?F^Kh2rHgrk~> zr}eDXB@xQ zqAEIE5FxjaCclgc7k4M3KQCpxO*aBfr_$Fb z2#xrPwi&_2!nI6=y3YDEeZs>pV;Sgg{TUH`ZnI66sZ$ETD%=L|ZQ+3Ic&TYSult$`pRV%?hSMI$9Zq!j zGU{M7iQ+jrxcQWgOFpJ6wS!+KvrI;z9Y?W85ivPwP>1e9+dn*QTV*+B?OQdv5i|+z zGI~jye6qF*$a=|dS)#$5Bw6WX&l9^{g}L?al|{mDf4*QI`cjRJU|TvMd_DVb8IOp{ zrsc7!NWl{_e~H0JuuPVn)KSmmH|q~1lLH(R7At+XSI-k4%zJ2^s^+nZRX`hcJB2*& zjK5X4F^`^rbeW?rlv8u**g82L?jLy#`|TRvuMetbQ%WkeKa?OU(3uezf_N>E9>+K? z`TqY9bz`V{7QO~9Ei@f6m z$%ki6+*cUn%PF38UQZErSM$HL!1m-k^;J%6qL`~4UzJt!v%N%d=j8gsh0X{GU6DHA zkeYMbxlrembryS~sPpsn>GtKs7WFdkio~)?fb4htNS84bYb;Vf_4=1u7pv!dNST^8 zg?xrYXT5mLw9>WRbAPU73I>Xk7=!#@Um%rY{c5X2owN<~=Z_l4c z8Le;ktxMIE9-oHgM8hM&ge5FfmO}U;(-zp&`PxlDa8$x7MwqEIL_3(FI*#>zU+MoT z1S;i10(8ovkEN&Xs^sdA0kJb~edy*Zm%P1!bvhyIHe`~hF;M3L5@J-s7S`2iepIHw zTQCvSv}&4gr4%k;pBFMHG5B$4L`$!6*rHP?u3W6tVo}ugS$1m= zVjPK}`vW3oo{Vk+TJ^V%T|*m>4zRrIJ*s{_iepPJHULs< zX(xw(aFXkIu5o9~v9q!~@W(O+Bl-PB`jU0YYBg<1qE-Cn1JCr_=2_02J-b?c07ST+ z`1b5-E{=ls|7{=&cHUVuEQ!U(&kYHTKUq+4#TM3ci8hz6{5_8U8PS>7&V!7&$|R*h zxo+0i>G>$h4#7RDXve_Ob!t<624Y*h!NjjRREV8?D^B%?AaJ-UsS_T<2_yq3$*s+M z1&uqRO06eE+CSY2(5ZE}d(9VO`TZ&E{_A(wxb?)wPZVZBJ+{y$Y0=#L+oERuxBEU5 zfd2TG{M=4pV#@+zZP@`%2z#zjw+<4!jBV7n#?;>h^u0@Ey2^T=)x_O4m|b8|`lR&# zB)KbMUC5!?I1l|*x)_2*@HuwvrVAEwJ^>nP!5MIpWsegNj(-5)s~jan4Rf}TqzFz&P4+p?k&b;|Eb z6h@If0mH=Rd=LS7Ct!MgEEwM&!wKWiDsMw}Vj7_CX21sdB9nv;7&U0%K~-ndeP7&s z_JgGDr1$cz8&%iY)!Jh9J@0}U#}c-!xM$_cAAu5$Kz>ZO&|h>EaQE5#VgBL`K1A>FW=oo~?CZ za|19e?g0Bzh91Ig9VjY}DU5(CMU$xtoY)4sU9v#+63}k##W{=eeSU%$!hdvY^+$_f zZ?+=e+fCPrMhK0?st~aL*s1{&&3>a?sp7q#7n*!dE%(&B5-eFu_4pHjxMV&siBF~$ zrv}<}mC|}vv<8DsyFdw_6O3mg$VXEiy!|qjYVks?3IJicM}!{9DwZP0y<=6N1%g0D^DvOu2!ynnUv@#49`$e*o%{i;ar+>~ z=Kckcc}7Xkab#*<^KiKtY81y`Ogji4v$#Km_(}ljS(2_9d=Ak5GJs5ja=r$SuOT~OmUzfSS@D@$}L$J6iRx6M%}3XnpJrU}M*K5AB4rRp%UV8e8? zn1Yx~Nbo*nujt5=EK<_G;LxotH-!|E3E{_U42PZdxdp#pOMzx1Ze3oi)z>XNsV>tQ ze!~~xs>qkJNnb~{u$gE|W$mI^<;YLIQCpZ7W;0Q1?0aOM03_3KwQd+nH*Ybq|Dj1V zxkz%3)q8OtTbGG+%R z6Cg)gZkne8fP?P23b#U?nup>;rHx?vzlwknc~@2Y4ie5f4VUf*PMvLnDi`}udizCl$%OdDk*uskjlaRp|6Y|RNZxW^_UuMf zV};!RtbctpuDSqa)WtmR(`+<%q6eb-hcp0Fi|8u0y@atFGfB!6cv<*+nT!fViU z0#>3~ZTtGzsOHwVD{z5%f=gr&w#y(t4=f*1kTo}ygY}TlsWWoGYdb?JMZyjXB|fP| zgCJtn8pEwGajab^M(E;Wtm^YlBa3oWNO&t^F~ngatIwH~@1sxt6Fej`klr6_m5dmo zf`6_}wf?S5GhPnvW64Y&yIQ{Ka337E0o-t-ot8(@I3Qxi0$4bKJic4lDjR*XzBE5h zY`&pwH%aK)rMdr6uGdpNQ-gLS*HO0D*sLqM6Ip&|!d)$IYU=?m02}hXXTDBec{WW_ zWrM9G5P)v#FxdkETbPiI-d*iV%lCwa-K#;6PT+VXBxhUzHQNt9?qB}(B4pgW4D?d- zPK$5!K9ZdY7ye6odG+7->mT-q-F1(HU*^9F@f z6qoMke}MFV{_x*_jZenSNqp6gv#h&Jq-`YH5Sh%Lb-Oc(J%?Vh_198b+ri$APtyYM-bwwW zX7+|{_wdO4(%IwOWA78zB*HH*{?d&MU`<{>B_D_W%iye9h-AJ$GxA#yH5QgsrvCTy z4~+2k^!m5ePy@5niD7CaiQ!)l^6}jlK+NN@s}B9Of7Yw|nskB%h_1yX|GPx`>n-@N z+v9WR8~~86QnUX8(Ff?^Tek4ea(7HR5}&NkcC(#4JhWTd<`H&We-G4H*;X9percg?r!ge6gKz#P_-J_qu1)dY5 zS2b$VF4An7B`*7h{_xSrQ=<_w;>i|%>=t0dCDK%}g)&4c(D2CuPy|2+`K7O0 zYJW>oB)?SUlJS8*TU#Cg39L76+$hC2N$*St6+PO7wTKa477;UAyf7hshxByAxi58N z3N&U)ioCr~xX$=hDkIFV%SPYJOceE!hV<;|dcwqergr~%)BoE-_j%7bNjN#KnxiZW zJce#NCyO2Dj>1rpwvQ&yQkpqB*=hJ7QQ9}E-gr=9@T0Q4kT&KNsDRuSlbC54R6e?1 zADJvpor~w2U2C)X-s<8tD*fZj=}g&{fG^~em99T|+N1fh96YjMI<+2}cC&3aKt}U1 z8j3pi&o9Zpai#5K@18TZ3`Ux~Cf5&YoR)KeXoGxiR8F^8wTuyAHbl8nVduAYwHzH; zxohmK%SR|pu#uVXo#&DMp$I#=gt7s(M}`INsI82<(K-bsg)dVQzws(hl?qfzniWn- z3dtgh$H0x2Ta9JB@=ucvDHC3w*{`u}L);loWrx)kBfe>XB z_tVfz6_Vs5hsHz0lLeKLV1smP@J!O`U+9~y#CNI}w(TKy6F4Ra%H_{qN7n4+8}-Dz zvL3I$3&^i*1W$d_D#ze|RGh501ROU)$Bpyku6J~rQ@S{k+NAftwxE>iPLWL6&+2r4Lv|bC?i9-! z!Wf}xKRaf`Dvd`kwfHUWiSKR@sykU&i+7LP z^dBhMjJkJ21W%!X#V;qPRf?zb?gpLF>*O6)+R6ATIqWw!MNsUIZ-)52E1`S z^}!y-!LC+N0vi@IhG9L4&^p}&{v6}EriNMKRB3Z?-oU}P8DW%76@^4Oy47k-%)0fy z=^R^szS%96?;>r7g`CcXiKI43ChztCM^yPM$OP7S>vz=!!Wj8m%A}gVMBGsMeqXej z#sftLfQ=50Cm&n6h_XQcT|3epeC+^Ya728AOoO|ZG*>$nvpld1Bt)tY1!M+ytWdAHJ!_Tt4hjVvN} zXbsd0wCmtq@r_MnuPcP*#LuV|nr@X~L9;xm(N-GLmB>j>H&7N}7cZ?*Lq?mOr*9KZBeRHY=_U_ZNGC6MscUdml(#m zh3#iznwoN14P2jJVt8P1=#H^SVTbSA4t2#N^stWKEa4gJqDQVR@eHu>DApmnmQbg) zFW+7qU<7?kIQ5sT0N_-0@i*S_s4(R1Wj)uIwaz@E^ zu%B^5RmNEk;!<4YzAGiXkt4ybLMU+}A{0x2LMl>bIU#iD?6MNHJQbL1kDXkqA@IIk zpjh82mfp&-hu4=NTNg3q!FD-&^6#}0#kHw~4c}FV#tcSjJ6Q?a&)%2D)}6EwPu`>x zYPTuF)i_%**^F<*9`u#=F>Nie0uO~!8pMB~r2l!Tf2;`b;`cd|8Uj|PmaOk@f z_2!#goUj&3E+!wH;jwdGIYWboPifiMeZX~nR%lT*TBimd33dkg=7)YP#c~2`pcy_B zeQg;(5qOOFKVX@7jzYpWdP%&0`+ zQklwl=wW?3vKvt5=Xl)BjpbrX?MKZ~{q38JLlL^}TcfQ(F`Th*a;69!*6mzQ=&nO$ z%Am!t{HHH|86GvfPBloMJ&hp9dh1V?t&+;LC+Fo)M;hlTw&sE=BELaYa^=et`7WKR z5SE@sonj$bhdHJ0AR4rI4~YRR56%Mbw^j!kzX2BcW{Vsgk9X5zEIaO+gRB~ zf%4*+T4n{V4OcjW#yjbKAq!h{{Hl8HJFc#EhVC_x+3F;V*^WWxigdH^s)oCt_IEqE zM+`QDv9lxjT2_G17WE;rG158-TiUE&q1#|y5lkZ~`;nUc9s>037bgTY`-5T&9FP@@ zONqaVsZz|NB<*rBdGyh84SkqTRdhpnN49aVs$fk^?U8It>te3!vTI(asza~)+K_dw z&jclnnVoQM@vjhEmA}CG*=MXt?)n$fptld1@1FILG|P`-cNW?cyGzgA`hR7+=aiao zytYO9jS%^p?&k5lCZERPMs_aUk~NLf>@S+4UOtD+HX>*+<{U~f7f=0Fqn$bK5y9@! zIA?hU227Ovhu3+akCX^s^szy~o8D8ff92#Qw~m=?A#_9WJC;FlHLvkyJ{nduypV{! z_33EU9F@-IQ)i}UeV|TAZO&9nn5H6=Ma>KW{(hAVCG+grv!%0r7ygRLmlaQvW5~$J zihI!f9D>6awPm>gw*qEEq`D|%pU-NHu#t`Gv8+%WCZO6+BaBj z>2`xnSv$=rzmkhMDw8OaK6`ebrb>2Np!3ffCj2ugzl;0{A?YMuvY>x0wQ$nY*4Tz5 z(y)X_f6P&VHq`Z1^ohb#9Hn(w{&4x#A$5Jd;0ym4tFhDuqm)=lnczPP6`zdTld(~k zVhn%XVD`}TK2gY>!tninAQS&y{<6T?$2vk}f}Z1#M|Dnq@_PtfDPZktHhLle*7*b^ zy0GF)%*jvPC!0>XF63nWG_zSE`^OU|{i)o9!!?C;`eq$lN`k#8qP7W)bZ6){diLjQ z^34zC#YP$)!?CYh$Y=mqEPiXW0a|ygatm_O>*g2z&R>rJ*qE%8RFgQJw&n6R$lKO| zFHR>&P^Wi1(-wY1u%#M^S}FrirW!z~q8E4LXVujzV-$CLf8G{=B3gi0 zeGkC&Z?_P(KOXiOR9m1XmjO|KDGh*fG?Je6zv3-!1y;1kpV{#cg@jFp?+0^N+VMN>FrF!z-e z)jU9&%u)cBSC+3+qnzxyYnG#3Rpy>p>)xeRxr~SJt_dSg4M5mr{i^9H==ts82oY=KI19?D+hKUrEk8SrvV;5 zgE zV`mKT7Rk75AG>g5%EyZ6hA~N6`z`?Moe*15sIu=W=yrT`5Lf%B36CaY(OY{Y7&l8IYxgrUW zcjm%+x=OzJ$Fnj}wS0{}h%KYA-Pgk0lRrfq7e;Dcv8!eq@JYpTYEzke#d7OANi?{u zrI9nL<*6xtyv`26eGrH4mO~HwGv$B3dIzLtw;g$rS@G64YW;GdQL~+&Alc{u4S}Tv zb9j7jLdbEG6qZW&Qa(ij5yh^KBpa^ij^}HQ`Fx3cYP5oz9K+_Y7-;Eo=^vw!KIJO0 z;v^5_pF1D`d4N$sxa8sXBM{+CPWgtyjl)`x8$YH3pBLIf2YDL~51kw3jJgvBYZ|yZ zkHPKMP=g|5UM=u=p}RN)w?~_wGZ~((wb3m!_5%@!Ga)|D(3X^8V)(+KEQ!l!X*6&z zaiPzNQBvb0uNO%mb01V1LzkI6Ih7YmrAJj{fdl=Y5}KZbmwBPb-9=#ZRaf|P&6#{? zQTX%UcErEvVaNE_{xPYD$z8_Y~MjbD~ZCf z$@^q#XzSQc8vj{MxB`uKD7p`rvOnC+q^T=Z{3G7-*`7 zRMnE1JJKZ))Nx-2yJdqj^j=L^*?tOT`BoB^Z03SLqsXQy;RopeXm_*4Yu*8 zRb~bnrvd?JdZn9J9JJEtMI7#^Iwv5siw&f4yxpptuX3X}zb%=9tU3bpk|k?fRzEC* zEc7mDsT>g3#(ye0!-PbbX$YaYl7d-Wzc!)S2)EJKcJ}Ja;?jgjvPpxT8*F-WpTw zJZ&+rPtIrossIt^LbA7%ZgdZ9KPRzQ1HOe|^(ffUc0gxq`L*N1Ksy92XfdRa>~-jx z13J%1UK%iw+0NLW!lR|Kp3$B6i1v3wydAW6hJ*vf1;nXo9}Lw5V?79p+9ErPMU9mN zTGanX-CM>*y>?NA5{W@cC8aTGQBqpzM!L&D5u{;+Aw)`Q=x#;nE@@DD z=#&_E_IT9eeLr}g_rv>sc+ZFP8)2CF*LCf^*IsMw|B4CU|4HM99~8=>ym@9>EAn80Q*cRwCg2{ZKg}-CpFP;t&f=8 z@4l?OSVnnt`$uMjTWFq(1VD|{UHbf?8HISS6$}Hy|1L>A3(0_USIDb>{Co0og6Kfh z!F+v&%=jb>4Rb_;azGCW0mWxj9*|-LgVJ>Ch5Y|IIL#@C1W` zW|%2+ebcsk;FV27{=XbK3`On1QTjCs^b_cL&*t4VE4cP3u2`ZF6C>n&yW3)bWpic1 z7A;?3Cu4*)w3dis3XKGq2G|o!{dPNFvi$k;jB82!^8!3hT^y^dy1v}?_OjK|X9kHF zwkVs~#fY&Mq!=EaTrC9Vc-g)4xQ@9$HuERqzJHj4d@;o31ibd{tbsf(%CxADVHYx0BTN@&HPXYa09-nXoRrw zHrpfD+e9C#pEh%3Ugw zL%-C?qS~ab3kyFHhDtJgP*7~9zzHEbF zLY-X`4xNMaAkF6ZTSh{ZU$JFt(y%j3#{W34WMe)!55xNcG<{q;`fpu%{>HZqfq5 z2b$c?2)o`J$?slK%TIgY)TQ?~?$p}ThSn@&I@_LvR5aGY?0jUnA47X`l@m+ej%}rnO%_C-J+N2 z{P}{hfufZMkMeqDUax;zB6(n!ywZmrE|dUxpS{t#`2Lr~idk7;k&nHP9)!X`KHGYO z+8>ks|M2FIW$=gv! zvaLsOaC>p-#?@CEZ0fl;b~~~j6SnWNiuqIJjK5xJh?4T76hb&IG_YPpR62k8D8py| zsDg}L{Rm0gUmfRv@D=~rf&S|iP2D%4QWbgLtV`Bt9;l2PAUeMnjFJwjYiDrxQlTCs z_(kI|mI0H_W{!*0iJi0IwH`|h08$tj2fMH_%3SIxGwaWiN8H}MU2N+n#i7?|_|Zu$ zEJKwQ2p~b9KfI94h#s6n6j(g1{jA5VhsmFt*I4{b_3&fch9&v-o9JM8DM2Sgd2jUa zGwYqHyS+IU%5QDC-m0dn5~-|CJ~~`5E&<+GeR#vNSEcVag zV?26K55BwE5XI;}ndx5t|W!4K>ohmlK;5B+KP}kq*=9}{T~>8F&dRD3Io;*xQ zC_yjw?!ou1P*nTGh_SZz6(7oj-{18$&EroC!jY}n=?C|J36b|ap`@kz$;XHOcT9`# z6VHEk)c<_7Axfk2_Q=zX`+v;-J?IAtkcTH}JQ^DQb-vMw#glNKg{^4M{Q2|1e|@xm zIVk8gBYVF8PD1@Y%)nfpNzJ$=b^gkgd$>_Sa4-D3*8|OLzI-I=EwWBZ)2h$}3JEPR z;a-}O{B1|K&x#<<^>BYgE%f;BwL{~16gRno+IjY}^C|vGxiA)$c&D|QcA&`BMGHBX zQffeJe6GCA2t1f@0EYyyjb>*K95~Qk>S%rO&T9`|l$cQzP<|Ww@=V5o?hu;~Wne&O zieke&>bHp<4_pK9IbSQmZ>LKr_ZpI4xl#v9+(0Dh2rdcu9D_a7Wu1>#M5u{IX8d{Q zfRlm*%;w6$!eSYl9DBOHVIXPh9Q;6j4-I2}$68{v{+pBN_x9*-N)r%B#zR-0WXwpX z_1gh>%e*#hdn1=;tmp^>kM%m=-hC5}21Fog4G^!pBh%U~_c_eE6fZl$_>9eu{*vj&4%IjqLS z!7Dd(@HVHW?K!AK?+j4hB+wAW(`&oUYe0x3^^8P;2 zWS*ugU7}NT{({<%v!T5MXESGg-RoFZcnNMCD@;;Xp0C(*E7<|N%P<(ft<;xq#*7;m ztQSE=Mqj?OELG%&EhfUBtPOmRUg(3SH7&0C+jg2xK#q0DiiE;e9<(P#?y@KylHmqpe_4cpB zxYa4jMUbuE!~~F4uA0e2YV*r&n20I`bYN4&JX{vjTV|lxFwIgwxlsm4k_3t;T|;X!x=Xkn zsHXb;P-aPhYQfA~Z!jZFxjVat+{TWJ=!i*xsua!k_V%;7_%fHxY-*Mcb zY2)U8@%?~R9;~ffLqUoH)8cX9;4Eb(d1dD?&@#_2l&<&*u64?1 zLs?n!@=rdXQ_fi~6uaq;R{pJr3)vH%yvz@Fb8jWJQbROmc4$bG@ z^9NwO;&09KZe*KuU@??s5#a*P>!uWi-4o@SZ(lm>n=ate&O4s?RFz$gF-J(5!)K#B z@ZW2d=-XaYD~`7=HE50w4jlHi7j}DND^(XLPiB6S(IVHG z;kM}nw)_r{*)H?#twfw^j3)W0;R&T2W7}P2vxvDA&sJ#o^q-5mt|Ucj5}+8pEzM$(1PX?pO#DR>$xjE~DFCu##Z+kM{qX(Zkb z{upA>NON4_?FE>Y%5_%IezL)5I>2hO{-QM8XeH#4>8I~W^a-{}4o!D=^tz6}I9_|SMVQsXcAkwD#fuvxTsP}j z(Lbps)Td4^q%hp9QfO9ldy>abYo;^hysTjNHP9V*c|LwNmU>r5+Nf2Er@zo7$#1#A z!g?%WvS0E}tC3@cy_RF_oV;ARu^xqQp(E!#;XUJ!**R$pM3^_F=}APz_HJrnELu2GbNd3_~OLqWLlchK6G3~LP6 z{W`L1wb=Tg*L~!*MuuNq_S}}+xgt}x%t@~ByD`Vl(VKLqBS}-c#p||xP)8S($D!xj zZ>!P3U?Q5Q{dAdQqQ5TR-7K{Sjr*yVR6Ti~MJ_^JqSE+WC54OzNCe&Zd<-rE>qRy@9{%vU1>}FFfpysrKT^v_x zN9n}o)@@CCf<&ZSd&?BLt2Bv*$~UUSaH6|pQ@>dImigw_b{DN1TfRdD@_4I}xn?Vc zL;=Uiop_~Kw1!HTan2kuY=h%7T_*X}HUK-se-Rj*`{2Y~ZrX^eR7AB;e_d{1pOazk zl_B+lY3O|;$#K4xvDcpJPPN7^uk~m(JRu~RT^2j%+G%B|KLc!E)3cwU^;8do%MFkw zeB+!3&9$GhbZ$k}L`?hF~3uGxA!>acR*7)0@vR? zO4jTg<(axNY^>A_d(L=3I2k*SDms#nUKvfvVZAQcKe&eB)$JbGT#l^s>k4BvQM!1y z6h!d%pM$Gtrb&-Qh_ND*z`?=>X34RyTWd>?=6$xeN(rT*Y`H zT2reg7#hN)G=ljArb~?0X^Zqn{HR6FH=?<}rkpJ!FYU@7(j_$sOOFHV9~?{Q9~5Pf zNMTB+iHVwfU5x^U1&#CMM94*{nmYl5Bk<4Exm!3~hsN`W;py~0Z_t^*Jo^(^ON)bt z{<6{1J$DEnUmRL-v;HO&LQXcX)}T6I-}=%=&TG!nBC_Z5%9cu{0xetUrzOQwu{D#r zUQ-6c;}{yVjJ-0F!l2D#)SVU%bm;f`3>bq~ph6`nNJ~~4!ZZ!MvF3Fe_U6Ze&=GV`oJL5)uj36F0u}i*xu;L7Ol*ycf_pmsn;xdf_rByIO5CC zSn_(LHmuUFNRlkt@zM9k`u4L`ow|g&FLD*qI13X7)=1vDEIFDYN(&<>^ zpx|UBnCly8ViLa7tWPY^r%2M-z1-fH%as%+Z^uP-J)`_!Lf*xqo!JgE)9wX-kv-b; zY?IZtT07sAasgKeaw!4v-P2hR9*IlIKI9hzGr@yI#jh<;;l=V^O^{H=?|D>WcZ%%9 zDFTI41QZu&E?n5XdiUDJ?zjM% zDz<#~U2|O#@4NEDzuWLi4m+shDUWhnstIK$&JJV^(r=(;&hS$=7ag6{d%tC?f3EWS z+4WMt@G&#toRCbvtHHJ8SFbuoVKG)AP*#P`>udGJf1c6vj=8-aUmGg$u|i=Z-po#l zq}PNvvw~eca^i;myYf8keB*J+CG*qNN}_%d_$gjWZP6SJ7sWsh942c{3&G7E^-w!v zvAep!gq}++%Q$bxCNHHoFN*Da)S0?r=Z(6zZ93_$!v;+Yau+|H2C% zVZ|$t<~b=73H`SB3dLSh<~f2^L#0m{vMk!;na=P!_JVzzzs zaP7spM$K%$)|u9~R089>&hu7ET{A;jRaMF<67uBLmhx4qAWES}MR83^gu)MB(TSs1!uZ$>*B>(egH8R{D|CfNjpE2H1)q>hIa+DAx>A&hede=w z)-k5`C`AAKoc%D8T2>HYKQyFyJ7V0`Jz7|b-+p$aRR2?L+w!N!dx4hcd`|&UmQR1Z zii&$8&Y|HCM%%}H70pQS0IDs#OgD}Ux7HmE`npYhdvpHKbk`S&qCxrqG56K1!5F0t zFRb;PmR!E6(WG#R#9B4ISu+<4X7>;m%5Ktxi_q; zSdV@F;2sugSLTm+=tIg%`+kVhH03dSeOUTk{k?&w%?OZ5hqY9^qQ`Ct>IGM;_U-@| zjKl3+^^Iq!VR{SO;o-{4KXNLT^m>a~C55A|Tx`py{1;TJ5{2)Qa-&FBRnFw=Xe^5jDk{1dh2c#x?F0<*GD>nrWA_oULAfK9XX!pcNba2Tta(>%@DA2^sU z#R30qp1T`mU9I%<5sJ*x1g7oIBl^fBg)A4oWX<#!zSIJ2CDP%JzYAX9N)E6SWhD?~ z^Gub!8eCXxgJ!EiMbQbeC}^Hr%~t0LtzGcj62(Yha>~BA7 zzFI$cXU-RSgXaCe^Pg}3{+ZOrYdL>#0si0qd^e=+J>;5*EBdd+?5|(13^|XzI{O>7 z#4j-0NGP7dh|{=^p4`8kLI5ejj%m7C=?k?Ki=5AobsPWn57r3YRyJ+51f2cl`~JBk zzr6B59uBBn3p!NC_3LB(^D_T}uF+tQ2K@izGr#I#FJAgV3>2;8BmfEl0@IU$%rR(j z8u$a(6oR7EYJQ;T7=@assK<>PH^hNt!;vP-e{J7WFCm0eH~2nTRlM4sU@2E%M=i5z>kdDIHf0Y39`dS79u8^EJ~wR(*2XYX!+=0JL>1{sO{ zH-h3DOw8!v&}(2omDfMT$;L`eScJY@=Oml z?<&lZTFBDTzkiti)D;{o4fAKx@k&p(dv1(%#EyqZz%Z$JXk1aWLDanUeBx#V`Uwb{>%*sM!ImqE1JQ#17^*LL|S%E1rYAcbdFE8xoS!s{ia8Pa~fV=v*xvkby{PxkfD0eiqKKO3y`QggdJm(b71@>c&AQ7dx@sNHugFM_uC*qKWs5uUJ9DZzAa1`vc}xhLiL z0fs&_{V6NXaL@Y#;N`lYyq{PIJ_Ak*0oos4NOU| zSc`9dIXD3N|4$;XxD6;oMTc-E$x4~do-NWPE_UPFsUB|8!g)22GAjhV9=XqFJEM@u z_|QHg{!2y40NqJN<@zlm3dpK&cO5=Tlt-HSc<79=h}by+wg#oNAg?tHKS^OjSVlmX zNjG8_A5A@H&g4)cw4RyM^jd)=K4t?Z`xHeaZdDc(?!JuJI93<_P?>aQscB!O^CW@-t{J& z)3d|~ql7B$Dl}vYEx2ih{Cv|Vs8Z&yFl*QkM41S{fPxX^`Y-Gi0X)!ae04c_cKRdl zaOQ)@EHJbfZ9YnlL*P*s<-KXoN8P_1nr=QUSctcgeaOFwO0{p_-FoCD?wK9TH}eVM zl)5l^oG>e6>~m@I$H6RDH7gl8K{A6QI*s+^Jx~0pxkBHPLoHCyfH&Mx6!%1U>8jyG95IbxGJhonfT8^eUHA;25IjN^lJ6>dF2tMW6Qx0@>Uwsp8|j7 znSYvqou;OSvz*(IyQdB zA@9^#*v1@xrfZ!uHUzcoRERt@QOEq@R`i863_%GpV|D#LF`tZdQvU=S#@YYzYHp8`gyE z_HMULEE`UC6ev~mhnd-xd9sbB@oas_k8`?3QsO7xP#8VErq!EiwAAPf{KJ@e1C(lR&;t<}L!y6Ulemz9zzFpIHnmd4cqQ2S?Y0NkPuXbXg z=hEg}!7x3v6PL$=W$WR!IV$~L);pycpv7u{-whp(Kny6shu#l3_K=uAHO{aEMM=$N z7@%>I?!nX=uJ5$bu7}*-SYQV=e^wLV(zMWQ3J%t%cmj`izm}8a8PL9Gh8B?H2(!Q= z?yoShoz|to;HbD@9AamrH#hv{eUtm)F%H6h71nnQg00G4>HdLnlWY<#^;bFaj9zta zZF-~$xmE2vbKGg6atbKTa+M;29%Gu(z16s0?@^gK* zO~~doG>g9r|E=}eAyB%QhP~9+8n}>iY+=aNy`L$vwe^xw>mnjqVO;X*UDe5Kla^tt z0T$PtMfc)YWx5B=ctaaGK1A``1wg-~x8;M+>C0Liler5UsFcoNM(yfhm!)*Y#Jd7^ z_1KL820m#9wAcI|Ib~#deD->d_BeU+z4FM;bjA1UsdpP$_|i7o7$T2T^V1jeW_bCf zYoL^r)g&T5Dpo3t%=Z@zBP$7S zx7RQR%=)q@){{2JHPREiwvCs;PgkgCWa{#q*mY)0aHY|!De2mw5G5(!Ix0;baiN(w zRzi_iQ$un*NY2r!b|uxXf!UoJxxw?Hma2l9SW7;B$5e4;;Rq_SjOCCvd)>S1lVjsE zRm5Q(kv8;Zb4DBUp?xd@=eOJ6&qg^<&doJxR$X3RSygH8rH`Tt?6Y*;`anOuRr}a#p@KiW%*DUXx3@wP z>!h4g(7D;+tyM>(^RQ3h{+jE9*DJzX2*gB4ss6{UuW`pEA&-=t4ZjyIY@N^YRmZZ_ z&gEOEEEL9b-CDIAngY6SR%kx?mXG9dk)2Ge-fNhIT*o`?qT_bis3L?_t=m-VPIEa| zZoBP3p(Rh1YUj>!fY*Ei=52Qwz;mXLct>}0aU2rJv}%FJYeAByQDPUmP_Z|p^dmX?KygAx(BBI3{BZ8i`%`KKD3Q_>@y->8XXR zx-Nw}^e}cQ`IqPf8yfr#?ug$V={1PSBa|ab_p*J$c768VYgL&FW)^q+Am^D85_Gd8#-^8Atg}a zrSzxRjT@hIm%$G;N=NDw+tAJE)zM`U($>1;7|BQ7V$#k?6Puz_+k&gFHamtX@41bo zxfEeTY*NqApR=%?z3iSRv&=jCT}t%d%g3P*cXcsc7W8dxVvW1mVq*(~0y5d_X;>>h zw)r4zc27&oFukp{gl0~oMOR9f*@xM71|Px5h|#|ZSr4)Jk|7sH2kg7o(8cyn+Odl1 z@FeAi78h@%D~%7?_Gm0c@H1(xy+$~$EsTwfj5wHaWu-0+IWP1InNYHNS3nWC6cJsx@(TEi;m0}QM zZGQG)M;m1je%iw>xaU7w2YNT)uM|ERDpc>ejlru5slE%;gz?yC)WkApETAw1MFu_e zGy;IH(m#${WNvL(2V3v4CxOGWb!aIT%oVQXSFEHdO6kVTZuSf1%l74L1R79fKS4T8 z81M$i2isTIrgC35y~YEf(J#s;m^yT&jv+XhY8NSC)9;2x7&dKJ$ZCZ=!1y;*lAl+e zFq2JU^TdST_dW6h4Er_H_MBw}fNj9mWG`fK@e#4UW|cmn9yX{uPg@*$R~YEigHj8v zRRG+t0natP{lD{^H(Xj~(z^>{|N3a;3jI)kJV> zDsCCBM?C}?vuk;v(dk)DZXm}D6+#(=Op11@kM2o`OrwMjq0a?=_$N53iz*}>>70`su1gxdQ?kzVP_ zBuQNjfA%hbC1NUKzHW_WHeA41)w_(oYI2hcXTv*7bII{@4e{Bt;Rl4;2=ET8A3va> ztrA>&_wHRD$5iirFazp;l8JbnbFDF)Q_Ot3Bt+~lTghndc2GneJJ%0C90ya+=0&&Z zeVLD*v$P|Dq=ke_+$zqaI|SDEw7y%d9o9W`KqH!umiAqFwoQCC)4Ef0sMhn6=)Qsd zHHsVf**EZd%92}u-t@&A2U;{{pWvezcT4w8Xgz1yMDch__V6#cf8T{`)ejs;S2hiJ zcl-vWjlb!EZ?4)|_)~WHP|f3rdO@<`Z*;QP@Q~+z5@BdKacG~k#@4Sog`baTB?f=T zROUHWyKQo2jLpa2|4Ug<6O!;J2ee1I@-a!_tf#Z9`>8^TeIeTU!(WR#p7Z>(-zAeR zuB-$bZ`xFmVD>|u0hM?uy`Ut(!P+1C=J5_5j7KvjL%^+{UNPa zemXD}(%p%>MYQ=4>%>Q4)g3j_lP4o8`YKJW;I_7o4(Dt+P6Jn4TYC)S@3-#<10Fo< ziK2?(xBekv#NZr=XyM^6V%zwP_~+PveKkUb#}YeB)e@+(Z`JoJPD+NuNgq9{J+<%G z|FRKO3gC;6IMrC|{;Q+%2mxT&Wh3V~aD%r0!AJIawfNTo;=-XN%5YdH|NBTCJpUk6 zXLoom{jWUD((4}hXnR31{hy@J-+i(sjVNBvQEFQG|9z0~+l3R04M#d^f&X=i{jMCa zaabpTe^jwC7bt)EGPTg^kWfqrc(*mQaOyj*UO7wouV>@uQKLNa=VSx>+6;Hd=MPen z(WO`A3JvcjYb2FFc}CXw@I$HNaxJL&nevQpB^EEBD0n5;xTlL~MzObuoTXlzMXla= zCmiFlbJD17wtLm4?l&!pf9`a^kpup+BT8s>MK%q;;PHmA+BZ)t8iGC?1!825T(YF% zQd3~odkgcRPzoNiFrI=uae`R!-t2?~v(&KUVua93l9J)CvW)drj}LVWq<_a5m(Ven zP0(qYD+UqUW4{{t?t9L{%^+Z@$D-kHoSg@_TNU@ozn4`5QHrN43| zhEl|i#g_ASqHSte(^yl1SnUWh8i_}6jh=r?ayV+E{PdeV`y!h3R(r`W@$uuk?1 zh{w;41rL^NJV)s4xh_=1*U1nu*w3qHcd?A`%url!TB2O;43-s7crpH=WmpUNn-|^> zQ_x*z)X@cSa$T7J&`TUHNo8R{W^r~Zv4AVEWWH3xDtyukV4(2DP33I2FNl8OqRah% z{@B=m_xK);zcA89s6I@o>}9_@u<1a;=RO~aowZ+cd68oicU5=oFe-Dfz@nltYNI6A zxK|w^yUF%}d1I$cxtznhSAah^m`ux&RdZV(aZ;d?Qovy9O3H1 zeG*#8gwt!YE3`=VhROrj1T#z+#~d;|-(L;I6=tw~Jbhk@^e$w(p8dr4QaWr44g60%j?@b=8_d-BvR?tEpFcEZC8Kw-!_%!i~(6D zCk!r`8+zX9*D2rGOt_at+^l@>-YcPK5&CMS4E-BZ*>xQTO<5XEkt?aWg=-Tw8`$kf zPa!^MaT}LJ^10qR;`OY*g*AdV^y2XD{h$=G@i)oEQD*aw@{hOHBR?jltC=k;U2n1A z>@gwD6lhzW_{dY2TBr7MN~b0YnZ9lESZ2r=d|s4}Xi&*YVvV29N$138)2XDcsN`#h z4j9jmKVS9bOW3ylJ6ZY}(*Apg^qi#`$s#SRx>_Yye(mP=F~BlSwFu*Gc+2T;4hQQm z^c*CVO_<4HlOK4kNtLWfC+CFSAapi^&QE8myi^#QR=A;-u)gD$5ZbM;BHr?5sSR|P z_B!$hu>@n`nuAewos{~$UxM{7>WD=OT5@P^SSCs;BX8L;9(h%M{9KtFDW*@jn*QCw zj7^D(R}sK+66zWVrvIV;$gJzv*g>>u;G;{wR3_+7hc;n{H zI$&Op4|H{1=g{8SvIudR7-lOLdYtss-2LRqljqM*AZLHW_7F#TIG?S`U5i4ex}XvK z@-x+pVq44))$$Ax@<}qtmh#Bi(!r*e6cQ*UR#QA>=KCZ=VjBgv)#LPkI`Xk4bJB{* zEL%@y1~xPGKhdCfO;EAqd+-H6287oSNUHsWT&R*_zGGs?IJQTPNzrV*lqzKrLax2^ z&x3t*5?}OitE8H}msz%pk;1#ONgafV!XdDL|2rgALh_z)H|`eCXvAI1ceB?kOnW(u zVCdQ{+wce2DfU!Wjba5bCJTDt+J181D9|fIgY9i$VM`3n1ukZAQALwKZ!klH(koZZ z28q~5quD*PK59d=7crCe2~HpiXqOwBJ%D-sB~djWJO_d}4Q>~3PwcD%UwhY?!6I64 zJpyJwI`-+;HntCBDNEL&t0P)MJa2YpZAME=K z1*V|${wq-YnMaM%NTSZ|)#}@)(Sq?P4()xa)P?br4};YxF@v zzTA2~9HoBf;-E!#uiAzu+eYow$?G3Pk}6DxvpN(8%UNUGE=v>(FTWnx&bSRooeqc2 zdWPIE3srio)*tTtOU!4vUROl&XdT&beQ>|@{LW^N)8-7uLa$W{`(aol$#AWuf1!M` z+aVZrbn@>2wrJ-WqEsY~+2Kqb&h>kS**C0-(&&8SWvtbPTC9v85A4gsBwlHFiRy0f zblsLS6~i@b?=M&TGjMPajWO!h;L23{MelT=`Op#=hw z@RJ(9k+Am4Rq8MUj`or?{n6UShU{|Hl(0!wqH4&u6y`L$#ATPXwK~uH*%Ke zD6e*@#31LlD?A)OQDwRRvH%p0{$Ykcr#)_OELFM>Bw)GNYXsq!b-ctFAFdt9HSUt+ z3Upo^xw<*}>|8vEE0(JcofF5|orrqkEf4SQ_QXZY!xq!Q6%7L9dJ@wjas z=RJGmG|Q{RUGwUj5guSVo%QwWS8-?(#p~7u5mQinYj#}6d8vRDrs(ALl~>M*A(e_5 z?2PVoVE-5P>Xkh4X;o2klQwC7pp|L#?B;0>o#7B1a{04trxb+4=i9!7GApjWD&jn` z@9CAQcrb*NZBBFW!mnw932-td(9nc{nq)}H36SZ92m#|aGN}yiJ4<5D^T5H(m74J* z=dO1XcH1e$mV!|VwB`eFzOh#QW(5+Uj?ry>eH9eRH^aeK+APO)+s#cO~iYjR3(P zIJp|LXSAH>xKYy5XCl;{Vg1dO#=0PBU>2|CG5``I%z?-Wv zx0s*Unv?UFgRH3`ULttRPhdWC!)<%6fMlrKZMR}?TSQGF&AM|t^(9*kB{{iqi`dPZ zy}GtI6g}E`K2Rk`pKrU(8RzWVo?{@3NnYucy!SF*eRTl5GRA=UnA3xEW?40$%X;qP z6AWH6y~YMn{=1a)X_;NyQ!d=l0Kxfmh2X%T$%LNq#&G%d`9Tx+_3Uf9tIKtM)n<}d zKPp~u(2Qc_rb}(OzBf%v@c#X{kA%GL$F!nmhN!L##fFLHRr$TV46q^Vx0axiosPc9 z5SsIDMca4Z1vX#^MH%lF;X_=NPjmFBVOKihhV9wUu!3GFeL)S@eo(1Hyq(a_wHZ%cg0`*tLaZZ|y;4MG`M`pj-_2IfoVuIW-{e*h+&|sc1q; zb@VN1Cci%z2ltPqBb03YpbQSg`BG$T0%zL{PdPZG?kS?gmi=Co0a&$+mn@W9^A~F- znQ>KtfYCw5zBnljQMWb#&iJOJ7%)v?amTJ9bJ7uS7s@s?Q7qk;UsCe5M@!Y;BzYH6 z-Q#GamcBYSSW*C9-&+yeCbU{4-FMgqPO1fJ7?dgk|y)}KMBpaxRy+s3D!0FQrpJuR&8%?+Nl#> zPgTy7`S60&j3K%C=JizVt}jql+3^{qKeV;y8xf;+yz$~Rt8ss-)H^1H^n2Z#Pf*4U z)z?U-on&P`8@KPkR-5OoFY`#?S`1Q2Cbgou#nL}sJ@=6^tMlsAgH%0Rk+G?%sT&$x z7c)edw_MhCBMiGIr(sI3eKo9Rv!DvF(zZ)Brz$Bns)qkcn&m|bQD3EH1foo=<~B6b zy)y2_mgYodWMqUe%d7fPzvOAS8)J*GKu8^ym^`$Xo!kNm+oX`qg1U?n;#hi^>spucIDB=kVpYUgr*4)P;wJaml+c3W z)y(GWBq8%RptQ*e_tPNBN5|IWUgOTXY*YdeYX1a!dvvC~-FWnHkF%lNAnp>cs>+-( z>B{nImSN7I+OV=S9h$oA>IM!)1?=gSGM{c|*b=3ycGFiND!JRzysy1{GWS^{gh&{k zV_RvF2dKhSI|LSE6A5+dvcpEw9LBeow`UafY3T`;VV#enmGkDlL4rfEvc-+SxT3LS zIU&_8cJeD8kNkr4P`sEn`u8;oR-Pvm`0j}zMCLP3OCwc!}wnCQ`O#N z#psC2t|z83!mg$(a6u&@GLHezA&a!AcsQ9ZcS~-&Yitvry{1h@mD~2V>+HIpd(&? zGoveh4%cs-j92VcRUCMGH_jw6!FwI_x9{hL(r&3LrnfY6=RWEQRPX*0vC~r)s6kRv z{LBJu3^Jxg1gON*wz@1?1O=tZJ9#VUv#j!5xOU~k`L>nM^1H-Sa)yr1_2<7p9%fg~ z%~VKMZ!1@K_huhm8k?VVViOQLIPv0Fmhq3hK~(>6q4Iq2S^GrUzppOy>pH1HcFqT% ze&YsP_8CYzxc>$6&sP?|$LN=d>ZUBCNs;wg!uDO-#3%|w^Q zszb{_2YAseLsDJLmG{1}%^sYZ=34xOIb~W+I8N%1)}!p)*&F8@ZVM@L6NfqLpKs7`VlOih-RND9C;zJPG+$@XdInaDit zfvA~@PCqT=rJf@Wvc93r%1*PN1lxQr?;joR0Dtlct;;t|e(}lynW1U95^&%xkir;u z&A;>wVLB&I-mm43WdH_!PFF%i0D_pTH6fFZmUfnzS-<2?; zcBg4PQBg6%*8BN@Eb8OB0y{S0Ke{#p4?P@8?j4 zlb_gX|4k?FmxCV3hhEI@dw9Pbzb+augvPZ5`+qx3(MmJ8=jQTl`!+p)oXof93VM#j zh2a>fgw;SYTg%NXV1%(ro zhyLXjLyVtg3%E$AezVMBH0TttrK2qpj*Qc9eaf0OZ{GRWQ}Vn)utO{qao`ZIg-;NO zRO@yhKZ`6=Ojo~~Z`#jB@cvp|LRs=uAHLidEz1-RL>;6FV-l?unNE68Oi;!W)QYb&y}Qf4V-Qf%7T_2$`6e zILMJV*5LoX^tjSUou-4hP)+8|dUUgWZRzIGaXIx!{6piRlx}=uFwJv`xDb_Z8ocSw zlHb@@t{&c=&29V)3y!Id;a|H7th!yMRq~}T7A06--<)_BGg}moHn~%fKih{bNZYcG zdUE=3;JTS=-&p!bsyVfW1$UM}XoN`RrG$>>pDw7~*xUXPP50xrdHSCIRA?Co!{lla z>YPk4Kk+<37{O4S=_?@5cDF!jr3+Rqz>Nq#h6(;n8`vB#Jpak^<_eka!tTNRVx_nj z$>oEEMya*q4NJZo=dKtsnSYrzX&EXbrlcGbtZ=Pi10L~}ha&;WABpUurDphL`eyiE z#1!lt+Lz{LBwA}ZCLoO&)d(Rp$S%K3w z-P0pp{p>VA{mOGUdl>Ei5<7XcvarF@j!*aH7+S!JOI0$I#T;qgE#%-&DP)`hV4c58 zGkb;La;0nYE=VESi}0-Lj8+&f{Os`RdU@<}Qg&NLbJS!1T zcPnk!6qzI&6BsAvU#BczZm;z$?8jGlJj2Dr)VA}~;V*2Q;-%YaymaL^dLPsgU1I`t z1Wfn<_H7Cc(42dnySp4eq=+QAqQc}@-(<_=qBRV{WbJgM`o_>5DgCv^iU}#b*2*OB zi;vGo4!ae&-^My7<{CQXa8=}am-(~J32qb+^scsXe)pa^QCko4Fa7bPnos-gJmRW2 z2F+l+64UK1rsG1vzz8qGG_Nne@6>{=z$nK6?ce#9`oYGhsLR{+a`n{wHeO(a+;jCi zg1*c@;H^e8Qig{!uK{?i4jf!Kb%SsQu{hWlr1sH8pa;*={(ys0 zz4O<28xZrP*GV_ENIisE4R^R8|C&w1&+OVh#pFoQ9L?Y+x% zI|HBIdP!F+L*&Xtola0u5_Y8WhR zC1YII!xaEjZNo?F)Ppxi2s9yIRbWonf!rqnKxQlWv&3ukwldtFsTsa6;)ANTq))SJ zng)M}sO)z9@bP1xj)2{4z{+Hc6d2!f7@twejtL=m>41J! zuHe7sRMmR&+|!Y~UdQ}-H?Fdauurn9i?2G2OOocqlRVy+2L#PV2Sq&PB{DV@^B-g= zLW10&6|f}A>;jZvGjU}VM^+!kY!Z?nYN0}-)}bfN*hWS0C;Lga`EQwbzde(eG{bRLruUa)m021Gugz8`B)73l@I>efl!C308NhxM`r`w%V4=p(dQmbXBjYz2z@9i2lRTQPnof< z)7iy+NW{b7k_E8C9mmZ+1DIbD5Y+^*J%<|Y^jVmUX=uCb!(M&?C)WjV$hqQABJxi< z#hqFCZ44nW?9^F}YI_Tlp>~kU9?%axK+yBE9RaA!Zvk9FYHt?{Q|6fRGe81S3zAlx zBRdW*FJZBIS9qWJd0)XT;P1|!X^9Y;2eQ4ZQnBv}pjvb7^?emdVv^q7xqc!EZZ&== z8rT#AaHNH7J;{b;($q1)nX6k`WczZB&--E2@=V!aVo~<{3###%v!C+%%Viw|6Sfm< zsnwtDpUf^1xE%Q2GA=o6_-+}1cZqq46mOMur>^Q0ghO7tJV_M#GPrr8;wgE}BXLG) zt2rM*JY<$P3zzp|i_k`-0$RP7y5|MVD%{+hj46qmFg(M$ ziFNJOdR%O1VX9JkHhOD^YZL|gN$1-nAA0#Z*^_&~yvB4nA4YSvr(@nHF6Sq&x}ys= z!;b{UxP^~O52fIoQgIed>*K|~4)4B53^I={&F)D5MhkuR{D>`S;aSgX=f1^*p^LBU z)QDu*5T{`TXaH<<{3N9sC3bnCNo{Ry&GE5HvBqzdt~2YwlcG0lLW)*uGqz1N$+q2E zonE(w*{5a#8pVzr^7>j^fOquPtE8uO)sH=iHKU9TEe5uEKIz9|g}5`2c)rSlxApYhVBjn6&0jQz#t?B5SXDu zQ9?>;h6a&v7`mHxjYrh;y!f8)&-V`{X2-qnz1Fp^AZ^-WePmz1ex3UWBOq#XtAz>O zg0q>YVUyGEF~uam8E$HL$S@Cq_n@|H=S8*%m^PnLcTbk0CJxyQe11Ha2hL^cgydHt zZzEgn?xT3xFrr5H4t9SJtjnLVff2;0JAFX2JK`w%Yj{*Ke)~JFn=e$qH#V?6c+;-h zL2ySfcr1K%3L{vfOIyxpa7z@=Os0gx?ARHMAknSUo7``uO~!JIHi?}-Q@cll{w-JG>s#F|HG@JUbL)0}m3@uioEA^(Ii=#cs56Z-Z^YV5b*z4R5>}JhB*@&k@&Yy0 zVeS49i)PMrxo;lSv|^TEC&Z~YK(}e9u-{6Xkzo0(Yy95Na!#LeYnSLO%wP{{vO7=o zzMldU|2ALQt`wy=@EAGp>uTau!j3{-Y@udfE8;*z^R<$NzTIj$7SYC;w>fUmKUN!^ z_7`2t7|JG7;?Q&)?~YdFoAg83Cv!=px|W*Wxs>-EhmJCb5oFJ$p}={~F_F(eW z<`-KALNMc??6_qIEb&*>w~5r%eqY{myj0rY0vNd4=b7R^TD(l6ut%@RwBB@B7an9scNm}Z;YG%)WVWahL+&h#fslP%!5Xv6H(H=(RreYF`X?3R-45c55IKAm; zK7vh*+`@3Uk?%(>R6%JB^SBfkmfVx+H?_INp^6Z295V~@i&Smi)eJ0mad`W7M&46? zy z`aYDco8GjeTyWETf*LnK68-yL%9128iHfpcFuOsMKu*mtANt!@fz2PD$|JCs9{ncH z{i_vuO~!8I^vItiN(<&nMrfFjQ|w?kO<3(bUKrD>+~BTD{3Rljh6jXy}L z9C{Bwr#MmZnH#axHCI3Iba{CTUOh32QxbXB*vJ$i<)YPuL%AuT^Tt;{F z(oM?#)s1fo*@3r?P$qB*EfLNs0UYPT4svMKMAbz6%E9^rR{VD<`}{3QR;X2Ibs79> zIJ~{R9lj*qk!=&*W=k$<)y>H7auLb(NmJ79N|JDErn5pGdJ!$($@JKEVM%i4-8Y^g z{NmK=x`(8>O7><@_`i>}k(s2#sSdjy%B9Zr=?QJfk)XmZ&t9+o+9(w|gxMJnz_#?I zpPtpqR_)8y6?m=UZy{f7cJ$~v;aXd!ebfs3Ph{(^u1u@tR}$c1>kfi%HL zVv9D$U#bFc^M&O_2`ANXAh&McK`t>SPiTK#i1_e@CQa)i>7mg)ZQn!Z1iHUpg+b>B=YTEnNtp>dB?D+&q zhxaF*Kmd-YK|>(34S#es>%;r^FL7wKyu9_^Dq^P1X?e+_(TMl<$fG1tIY$=DS=H%; zoXTKJ&um~V6D|z3O1AGBsOC?XAk=m`mk37HL@q}K^SDm1bmfS4qp#H3-%R83AGu^bV+*NFJQ!|nJ+FfL|JRqkQgBdnDmO}PKCYpw80 z=TPa|y{RcL5BUbgIn$7oxuam!S#o{XHSN?{l3oKhWrEOw>w6MN@PA+ zFbCP;zQl(Eq1v#gpnP<+Lm<6meoQvg9dE&JGxN44;uR^*&bYHS5=hbB{j-mYYh?5q8HO z`@|VSR~c8L+u8?meh{4CiX3L$x*;3Pi?&VGkr>dFT(V-#5}XS^5~zXQJWkifOU-klZ^0L8$SKH+cU8C zDllhSe4xE6Z2BDfMft27`hj{&vpLRnA58+E35|SQ*mt8!CupL}oVo-SpN6P+6^&?U zWo6v@eE-t3`+_IE#2gNUlbmIN86;C;7OMF){7;}dg4t@M^?XhNFwL?@I&$Oyk0i_? ze$VZAq)NZBThYkQfN3_5YhCC4hgoYzSsE8MFz{~f{rmSbdU!Cb%W;i+?yvbhNMr1v z%#A8-=^q8oVH}vNwADSL{5g|?S?+}SYa@}vH#W*Cty2IVKzBTKF5f08rlaP&`Fhhje@#w*Zv+4SN=Os7uN{>OzqjGPd<8;B zlGsqlWboIg{qcI*ctU{SV2Q>M!r1|HMdsXbp*pXHtLPzn#3?EDyL01&qVNoFC zGB*-&Qo;Apqx~mN#466(uPj)bfFsLmd?7fBK4vIs*uiJk%1D~=0PpnEG06xXgZ{xN z%R`=?>&JwzjcrV*|Mw&Hb75Gzhc*7^Xpu)nj3#$UQik+$Cs{9Wljydu8i`T!5uA9pqidD!5K0DuO>yLgq3JB9#WOk+B%?_}HSFvN$f0mnj z=_nw9quLyIZ$6{5mw7M>V?nb4Gzr0s1BanNK}QQV<<#&ZE*M*p{K`oI3+7k~u=@QvTpE*Jd=e(Ry-7(N`ZueXs)^G7rGR5yGz6 zgPcgkHBfeU#2MdtMcE9#{%!r=0a?B-n#lY5^=lH)ItA#4guZ?p1X+GmE;79`8(|c4 zKxRfZ{M_Ya#iUaZXO^Xu;kPi?VQB!~!w!WI3zLl>cCyy-#R$nmVj90y zuUH^2@)HCqU0+T{Vv;qf`7y7mZlhyJe7jEf`7Yke1)l33YT$oeG!J={Y(TK{n+DXD zgk}$M&aAnBxtJku6)7`KFqFj0^X&l;y8|07;+~J5FbBqPv^t3i4k+ZLkIQf~+mMmW z8RF_OUNhq`7ZHe>fFt@C}oc45%0L|3=8!o18@9Ad>xUZMC)H=;KaqP zq9^DB+O)@Ft=z{=$_)OAu-NJ3U;4G|p?PNW0T{w$S|a$7$%>@+i0WySdY7hnEE$$Hj-(Yxu$GkF8?Tp`Da~aLedb;}30!>^pdb-FoLg zKpTCPy0CVfc!1OB!oN1!oe*Rz-X2&eBjG#!^O&qolT)uJ%-!&Ni8LuuHxcw$aY}+PQklT=PoJttN_RqHY$)s+Qfss6o(AH9yqwuU zcF%U5@K{?MvVqqjKWGG^Zz9=s?CbJb$3P^~KSO9DW!%C<#<5V>WYz+@*ysv7N)ydP z?TB~Kt{8`fuxzY_A6=h!^RDNGGUy|tKO5;@m)*C#U5h^Dognq^V%US>f{tn5s}BHK z3j;1UZ7kP*(0hZeNFoY|zr{XgaRTg@ixhz{O(&xR&+XUzWs}zqK;PrpfRI)JueRX0 zuW&4XPxhEK%)3+zE@p8Z>jGa!RDOf69*H2=MdJiPFm=F?6Z*lBqx?(#T-xzNO;nT_ z@FJ)7=^|<4qTJ3Rx1xIL^l9tMj8Z#|Pw{CNyEW!mY6I{r#py_ByiT#_2qPzWfKl6u zk27L+sm)hE^YzWFQn&vShh_1HQASkvSbFvBPqSCwvE9;t?uVtbw5=FaSds4gi41*9 zp|4H#Ba0+ZIBLBlM2c%^npRQ!ni>ES zsAH~#16@IUBp-sm$os??3qW&T%Ow~2k4LONn>Q3aq`B0HNFK6?lz(}YNB_}k(7!8( zKkn*;7L*;`%VrTjOlidq9eN9!5Ck@`syR{Y`70-i5p0%C^1i!h2c6#GJV-RJTm9ot z{$HQvy>2uvQu-zt%j=hZky`x9_oCB?{nzrzPU&pDzJ0e%%abK<#ygh}Dk^4>k-dK8 z>wD_u-AAu?z7^-b@?Ctqh$)zfN$kp%sc4`~M&A#nWYT9@93P6Pu3=jqnHJ3ZaKRGS z4a=`|_OKN}|6+#K%ZocH14_NNBe3w?myYn*vok_1}oWrUp+T>oM0jj*Z30I7F`D zuxsGTgI#T9>c{T+`}=PvC)do9oMw5ZzaV%u?R%p28=tB789C{#brc)F^owow<0@Kl zZ>6%tr>cF^x@VZZaSmS0y_vMR@7`J4u${kMD5PLm12$j1?|-o?El%#&;oSDlY4T3a z5srI*u+!nsJgZ>%{|>Vb^` zGaH-4SpJ*nmD%|#5&S5>8Q1(U#bi}2H@97tknw9!S#X+(mv=6|Yxm)weyZL??k`YQ z6FqOIZ7SCQZWm{7=GL_2G0_Zd*=P~w>!~I|Z}jdk@$gLL>*9B(am*51LOfP?MCf2u z8%|N%juqyut=D|N;^ew3YT#T|*tL3P|ns1G-JkVP4&^Ps@9Ui%Cm zA4EN>C@Kcmg!5P5&uQO#T!@LUyH)Hi5qCb;KXzxC>i@58fb`PfAjZDQV z4p|O`d>}H!W?PEd%!IoMSrl%kps1`~jSZ@s@8%R$55eU7j6S-3qRJyBlNW6`P^OYS zdyMySvEA^%t9v^nRaJ9GI*W#UzqS7TasSzhE~=CcB;1+<7)qWweUA$LiQ76lFAuWG z_b11;gZnj8Vef@wysq*@h>kfN)j%T>Dp$rum^LX$Q#LPmcLcVRkpn~o@4{Y(bUP6jc#+} zvHmv}N;>pM)k?h-w3O6x^)hyPgbm*j`b9h+;wo`Jh9PZ zvgH~Wl&28nxAh%fntey6rHxANXKE`lN_P`9NN$_2PR~kB3K6XSeqcOu6;L@I`=xre zWJmf6rKVjEdyWWInn@N0Gd>AhJ*|$luob#L|M$cCx%j=Dnkh|Q;GUM`-B17}RFYEG zjRZWN@C*W$V+hvANhi>{Jwav>dF9HLE&nhR{=K>VTC*C;r336%`{)IjmR|qb#s2#F zi!zMUdA`$8JLjML-s{Q9v!-#>OG(GU2(99OHJSH)(D5(jJ z4gCM_OJ1B4eiC`V{;#L9@eMI9%Kg2A)Iwp`|8j+Xe}?>Sr^N2k-$YICkprs0fdS=~ zzMRp_-9N7gKRXG=06|iH1L_O^#zxlrbj#MX3zElw*+gqR@bbw4@!x@c`}|WbMJfFL zEYMdYw}asAg~%%O{iGr?(SJy6<5DuRk{1SL&oixRcN~5q;Z_wM)Hn0&=jSgj6_Oed? zA6z9y8gF@KDSfApANg&0I_qUO4hBk5r>OjngH224KlRLd>;$W*jc@(!lHS@XcjV7= z{maj3T=m+5N5pJ<^XoAG`b%$12aNvtE8ZiARH0+L2*K4K%F38UM6_UDdls?^>&L2d z-96zw$sommW(nXu4M3{Av^5_v^&68ESRpHE3ehtF`s-`k zYHvKF(`>-QXgCg_6~ls@oE(69Zsa?Rvil27Rnk@n6zGCErF^=UFq=x+i>yR_qBSU| zX{gE&-|fvH1Th5Y{Eyok|L34K{^?!F0*fCXb7ua>LbKA`?l9iXDJMJ|Y#jdf6&mD( zscKm_;ML3weKA}47bx$|jy6HBMFJj7C~~p8XNY(?)8@A)IaJbu;V316Ko$>BlUi}H zPXZ}99(0QXl3poabGz?7eE2Z02mTg`)?9-niI72%G5`wp&r|N!WE(60f8GYY!(`iY z)7I`E`O&?2N$n!3PN_jd#BQ~^vI59Tj-};VXMtn7dkx)v$lb`R4IGVV;0NJyOIG(7XY0mLEl z(~;+N?-owi36h)(G<0ptsQAR8wWuYM5*`7HirAvETs#!xst<;)nL6*u7T1=?DBcplj;Tcq)?2`|&D^}ir*&gFI zB|)PD>#b}1TWE<tEYy!(uxD$5u>|bfb-U-xQjSzzcd7FGj&ob;UYBA z{SQxgoYU=*;x5vcbzNVbubm~yZ_AV3zw~*ZugRf{INqEszcd9X=c6#b?c$p~Pgg})j zSt|4^w9kEja`^O)pVRT8^qLjPCJ5xW<1f?;>7}L6W`S=U*~$&~7I)scb7y26 z@f4S=OaBIbS1AGD7@lPXIi=MShR*5ew4hWiWLv5%uj6dtWcjgL8IwopuL=d;=J29d zl-1n_kzZ4lI+wK60cZng;q;&|)$g}~_sZFc);Ip)9pfNIkG^cA*f>g45*-|ClDna- zvAVpKOyjWInLU(0t{aBDu&79e_AN!2nmNF!!K6&WGASx~`$%sB0rfjA*!Wplbw;l!NI5Y;7t7O-3W*-{L9PRmMw&}qGVT7mS=2- zlU(d$DY~#kQ^wRLgpnP6*Lds2w|n;PJ%p}V1+`{vE+$@t>yw1V!sSG1oU03nmuqbs z&S~M#;RvtohfOhxH=`xn3}5D`{8|L0{rJ2tnwQGj{43{A zI2PE|9J_MeyojUU%-tz9yCX$1G8W}8aB(REE`t6X^exbdt$|kN=#Oq!Ol1FCg+#xz zYMCEXwNt#)vSi9?ARD(0AKEf~@ht|^y!EYK33mU*Hz<>V1ZCZX7Bi)Ye7SpytEnL` zunDN<_GI6t{7|22m#65qx|WRF99Qi*H8sECCmCkI_4yXfCDT}e*>oS=Q6=s$HU*YX z6ZV{V@PCV7Y&xIY{9GU%5zVWnoqr=U%`>%$aUX+_D$x9N^N48$HKXmg5=@sXvYtIX z&q{QomVydIKg^5sBW5*1bG7johvRuP8CMa7MO)?o%n#JnwXfl`lU+WmDv%!v0vi$u zu&9o|{zMrU_Nl5#P>bUcs6G>izVQ%J>ia9$w5u27M1o}FVK2s{d4sxoM^At3B&g@S>95pVD*+6}}9dG<{@9$2+~7YQ=7O-}B@1_ogZ<013Y` z=~zqBBb9V5bKLzFl(tmUti8Q}z9yg2J(cKul|*sugZs$YUlMawtO9J>9A(`x!-7<*g7QTlUDCEqLQTJep~I$4f8yGrK#g0cDFv1$%<>NT%Vlg zFjndh%_{!L$#Ig34oRFfhb)00{D*?}lMb#KPlDeixR2mHUtUuuj)h>^AMZLeQ_w!f zBQ##`y!#q{`pu6HAUDS=?E;A)x(HP4fui~D3rg8A=MGvPE8s3WMg*U|?{w)Tm8hIx zs#0McDN3>m9vE%`nW^U|uf~DvOx=snvGe&JqdQKx>EPbAh^bVh5qnIVz9^>8cRBV% z>~{o5n??*ug{GW@kg{l)0oiiT@k?Khrz;$Xmkp6bcaGqwW5YN=vE0Ah6n{ z4Qs-6MNpL~O)G{MG3jaRDX-r7l+x({VWp#Z5M5XK${qD6DlC#>0PI-`7uDoXXvV5W zrJXQyy|HBL2s59d_>MuXjUwsyu0;BZF~sX;^z-tn-Bo$}WdJ*9%r&unHz*PO>=;hX z+bH;`X2YpZOiP_=5|89Ea6TNI_Vw!1`Vc4k&DI7h|e0q?C7a=BC%|(wR z8#-1}dpE{p1y(;7I!PVDrIE)yvOLT1l(4}DT|c4f@QWpgzgo)7VO6d2_KcP?W1j20 ztgBPXk(Sit=+)&pWXPpNW{|btO(oEC1gD=dK<|nxdl((%!Nb`MxL@^!BG*X!)hqZk zKH_{Eva202@NR5hRVn@<694S^&3s`UKYCu9r=3lcvI1o!b`>(i>afyP|p4Vm4~WBu@^$# z>)qTJ^aX*EdDN9Nzb;Xq7@Jkx?00@^Mtb@AibCr!ue<0xA9Lg zj{{a!2rGNeBBqq3IVTq4GQFrvvrytGeD0yK_Ss_w3*Y_Y(HP!Qm00()`$X+ZB8qRR z7j(2&p77*8_Z5wWVJD{yU6(#P3PU$ve(adIRhNKa&m@iRV0}i$IW~)~t0)e)S*)KR z%>fhbin`-gc^LC15@UzqJsy?O~kwK4fp zu|9d7uFbeGJ@c33nj#(Y3gmmKf4#Fds}SdDt*UluXlskoIBDezab|kV&CFzIX|cuC zYm29u&SuSNqdM|XIfZ<8vXesHhu0axE^mtoa(w6?O3myG!&V=0K@KwvW?K1Ca?{cD zJ({PjahFaEx2ySz&c;c{o>vIvTCdoiX<4{h+-WIOuwp!K!Q=V$&LUw*Tju+4D@nX| zjL%&5-Dog^Dod*g_gWqu76ot0`xWh4CzfJ5@sNAE*el#tXdflLW)XSq+Kq(o{`)p= z$7Z*P^nbk~WL!skhx4)IsR#q}QD_u+i1nsYb~`VdSA49{uHm&theofI`SUn5pKD4? zLlrozQY^aH#hPg8t@_BkPA8$8;2Dh`?yzdha|MRKi?j#>Uw5(})$_1rQP$}3B6W`# zeva!W4&X4y%aC1ajk_%U=|y!#>)5Z!=3KA%SQ(tuWH3Avi+;Iq(s?bSn`frz0D+-? z?`C)4&;PSB-x~Jf3O~zIs**X84JhLmUBE`Ya?0RIEeFrACv5^VI_W;<)3ux0L78c4 z$ByjRS^AO`)PXf&E|?oZ#2!A2yo0uP4GYe}wY4OCOTHzt=nl9s+TJMW-oQ8I?=HOT z?b~Z%GMX)Zz_u_=&UIwLn&Y`_OkkT?Vdo((Bs;x@C2PDSbI-#x?~ZKi(_jY~|4rAV z7@riuq5kR}FM6b_z_R3E?s1z$XR>1()X#tKxEq!7kLp+>lWhKb!)av$Q?|TUhBA+l z^t$B1lqzCNi?qR?l~N)wHnR&Tlbnl|r?^YL)bG-BXXfIPUF*tJy76rBqg|f;vMkE9 zFNtU3lTp0*t><~&Qz0q(A3n0lXO&Y;mG@pA%)N$s`U77}O?sN5gg(VRLp<%_Q5+Z^ z&QyRtx6r|+kbb0(g(x7pa_MTfi~Doh*?`iV1B{wq;Lu zTN(ea2=B`CTfI5x?KYt^50L zbV>k96&-U(@4pa4Zy^#WnRtSm?>`C2V*qp#W#yi{`}HRM%V~+l9AYf3ZSoI``p+%g zk$OV5v4MrK?xMlq80h5G+Fj6uKKGxOLaek1{LAgfhbq4R*OSb+kJ2d$*>R9IN3mz{ z)lfBh^S9&g?bz!WXap()~<(qB1}=_IcLJU{?sUBQOLu=xBvdB<4$(RFhTG zW6b~NpSmdHwS})l*m`UOU`&ewDA>Io7f{m)B29TlF~nTh?D8enaVZ=9%0#S zU!i9s>y(ba^n368<16nO@|{*qIl8~vE-M)_q;mnkz+~i7Wl|7#xmG1^Lb)PIcLI<) z8`H{}O(A@-;{8^HAG25?Az`M;#t>~c7iSlVJB`c|Hbr+s-6rpq$^5)mUO{ABEB+x& zhZ&-R@{j*um;HK>f8Kbp7#h-Kx2H$jB0nj~$=S7P&Rm`8?8trk60^K1`4nY(3Gqi^ z2-FqkI&yqSwXG;y=l-9USR;DNNkU7W^`VVR{;$8is0jN&=c&ur2c$omJobGW+{Y{# zx6?{WHP+Frhy9ap*z=bkt}_YEd49DJarf)w{rN|7Q{kyPe1$x%dhN@(bDKQU-fm}m zZMIr`eR&GN*GEpSuGL9FUvUSkB;;S~o0zmE-(NlN?CdNB>~ReDZPS)CjuwlzC!_e# zP+rw(w!BGI`bKedvilaQ7OT3vc)0J*Kvm+Brjln}O!IK)p-i(+l1BT6F8%ymtD9Td zt-23VC6IdjMz45ExTpg9)8)$yK-OgmV%$kw{ z!tXzPXtX%C?}Uh1ohG2&q4l+OH08jT0}!;fj%!*|n-s(gEETl^2eestp<3Mw{%<}M zNN=JqH%d`C_eB>spPSg8qnp0h!>FzDc4^#<1`3~Vaib{$g_n5Ob{c&z%~~C1@NpgY zG~?Gx-_OO+_1L|camp?bTJB?{;SpV$xYw9!qBog+WiTWKU+E|+9R>)wLUkpQ=>cE2cUb^P zILk2LEi1Ti*)F}9+1q?eW}6P?sh?jch$<@q!Q%qm{XXy%$R-$Y^W09rCW*e%+;!aLeIIEF;BctkCE6+ckJf zh3(lj{22J}6o=2w?|WWZxwF9wYuA=()3;zf{m7S=o2$X7Uee92P%%}5|0Y96JJqp) z2$3S`UYCW++qTbm(dtzz51!O6FOL(MAkHOth@$W{^VzAv-ph?&>*jb|$FvRC(VUh6 zTkla+gHuYXuP*nZ(~MPv2%>UTw_T3Z9}Hklj)&_J$?*tp%aXNwHHTY1`5p=gw;ie# z`GHf2;kFBdo9fnKdq)wP9h`yzy# zGlk$vC6vGllK^DAR`ue721o#!wvPRrK5)_YCO{B+_dC6Zlu0de_lBUvR+FOFIM*>Z z-ebA?y6HLzetO};o9Fp_8r6&2GZT87k2XMEYS}kE?4g-o?wPCW!W_1K%-qux7WY2z zHqHX6 z<&mc*v#;H_CT=JF)Y+4z@9AP6t}sXI{Lq~m4|mUoWcGYqLQ94Mt4v0TmdC4DCMJzQ z=IT(XDCL~+vDMV1NDP_dWG3yPZ2{I?f9Yui&Kej8?$+z`D-UdJvl8ZBjkFeZ0NucD z9sCU9t_Ucp>Ea@bKcNY4AgE3EL-&OP0fW^hq|5#M@OHrdm}A|h9+Sp10KK2?DsViE zPRqu?hW@#1pQu?f`w6Gst^9XZsr~hyJbijm;S|c)1Vxuxyf_#&S5M~v_KlapskHcD z1z{`l{Ss*~0wgyuZsFo_9P2!|D(LaWN|8gTz@BJGrcsfgN3szZjVfLm=Ae1a!oniy z&mhdi&Mvt$H;O7xzMR2}7F(NXk{iIOTZRB%z6zwiH4aqgW^-W)9NX8Gu8ZzY!Gh_V z%zLNUt`OZtsCgvt|*@1o$e};kV0Wsq9ApIym0}QxbFbSFFGoJQZ!6#%WgA8?wmhH0 zc31?F*f~IMjUwE#qgxHra;Z8#4}-C42zKHEp$Q^(R=@~-^mMr&JqNTXELJVr;+Y70 zk{QRfvR+{IMw&!n5a#X8sp}~fu>$s=J=}m;J^*xbUIhfvJ_fu9vgFFNsQgQo#{_BY zz*4xtaQO%2wz$yeqe~&hC*=F&LDJ|gFD;Ej(57E}8AJs*uT{{}29W#=lqb?4!*P3# zzwlgmn+J@`X|iF*=+STmb7lENS$Y`9>G*1kNfOt1rW!AQrz>xVfyGD75|1J`7&HwU zUEemzh%zBFr(-C%ZhNY*6jlsQ_P+%0fP@y}vc{482iug%&86+0ZpSAX z$i#NauPt22vyoWF4<{dZBa*4omQZYXgN7vmGhW%CH#M0%iCf+No3&H_A|zk^2Uu>w z_66ol3iQb`SH-DpFtxFwJ@=!xQS3QKd`z@fGbfS#`*6)mbUMSq1$3sSh_}2{WV3Yl zD5wH~-W(OC9LA+x+__Yc;NmL<4C_k8=f$w)&%Ij#IX8<_Z7N|FL(3+A4K{59QH^y5 z*U3+ZYkQ24qi^;2EjV}FTAZ3$r+Yp;Q{Fy|L!;O&F(xn3U(pmLbcLn{le@VKbvQYD zEe-E~F`zh}{>D2CZ4&>EB2D1x{r2JZVV9UuC#obwGqBXxQL+tRH1KB~H1^Gc1#bup z5yHCs%x%_;OMy!UgJOBHl%x`EC=VmO(SgjG%^sS{9z~|? zq#pP7#U4@J;^*n|m`GBee_p9P()ZGbWaP7gBdp|Z>ngL6G=9^EIYR|4Em=c2l%FGr ze68HCTJrqY5~H3TU5-G+PxBLZ+o!NsB4cl*IA1^oDBD{^@Wj_#d@i7rndY2w{lWp| z7KLouBPX(oJGph-`Q=Eh)0D55vPpZSk3SukX%jmh#?n!x7dd1Szhe++#ulqaYmw0-i}zT zE8ZM@S+Zllet&%o5p3R-kBOL4!{fn}=w*bDfPE9&V|(9z5JI?isNOs!?n~vO>h<38hr(@i+?yVxko@ahC>Ga2s zo3Y!@q9u2YY;XY>%wOpZe`_Ri<8xS<1^Dmxd*QC8ext8zST_oH#hK$`MQ}cd#5)7a z?&li|3}3nx2|63@r|A`N=VX2OQFrsk+Nz5j?pV>-E*yDvFc-6^$NaO^#{9jO{xR;g zL(J7GpJ~?JudRji^`t&Qp-NT+q{hY@)o%DZ;qT{IK7;vKw4Uw7Dzi?P7|s_h?7HrL*ue#nSyl6jxE#%S z)Ihpk(@>g%0IDTj?~}1|V!Lbu!G5(@gM18I`NU9>Q);nl=|Yt#(H{M|;}lK+Qljm8 z2E6c*2(_M){543c>*p@BU}wRJ(sPYFjv)uHxcHba8FWyr{lS|3^Bt;j*s5xaO5&|F zMj~s3ZJAYQx(>R6^pRS!18GLtU+aEAE^`V;tX`5 zgu9MlN^WS@Zs)e-7$O^xDwAkh9GZaoY`1k%miAwkNs6ep zw3Zx~69UiP={4L~%gnj? zbcI_$wr6hAImgKzJ*XDdtpNQ&Ke&4hW?A3~@fdm4#5`O=lel)uJHmIDi>y~0O_tvn ze1CRbhEct-Ug1<9^*}^B&gOtJi=c~CTv9RSLGIF8W#0Cq7=(Pc+4I8gOn0hIqP3jH zwoN<3?KaYksA;9a)^qX>sS0PtJ92LBMQV5YJcvFwK1+M_sII5ylzwYhB7xXx`l(?|Q!rXo9GRA)^88^p1Lg)2mn|>0w6=AbDFhff zmdtF5d6EWYd2GRYsoci*h!4agGI1CEBpCWk(9@yDGPX&zWn~KNimCeDuD%bMhRr@R zNDLM!AAG#-DGA-Z-yn@?3$j`}dtr z`q@uW+8o({m#|*DReJMzkH6Uzq-6Bm1qAFU(G%p38)Qvq1#n<4T-3<>rCj)9%L5GP z2B3sS8U)&nCrSL!OR})o?VFq+=>>8Zc(jKyE*;$X>B>y6-8*tqy`u&at0@0GgI`!$ zf3BC2pSJhzUqCGYYaJcx!{mhVYQn|OX|q$A<%j6$qtS9VmZxWDYjGlkjcBER4br_= zSbEKs4K9S7WC$AZ<_$E#6IuP;mujj-i0T7 z%}vb}6g%bJqxcv&9siU0J;qW>mpeB1@d)?NoBHe0{O@7)t8FFg6k0aUJHPqu_&ry! z;saKbqwAfg8({ChuHDAnBK`bSD%`>t_w3G%CH2=&&y4~uae?sp@=amf-w-?Wgvzjp z>P3(io8GxUKfP0?v_q3(WFW)=_ac}Hreoi^a^7G1FBpA`w;j0#Z|UsJO!khf5O(F~ z5Pb}jx++Pl^%ay>TOq>Hs_zO9&TyQOi9(z|X#vp^&hZw&NekZMx!xSL zxS@yt;~4(uO6SIVRfnVx2UorV95T=L{M`PWTkr4k-&Ie6nc}D1^ZbqTEe=Q+kR~10 zm^YOh68g_Yphr5e79Os#*QuH8mU?y31*bmF&d!FAk?+bq?_7S>vMcjJ^S-p8$;%`E zJxOBgwNW^uk|eK2-AB`3+3<#%E*}Y5Hl_&@I6^SrdcpPKmffM~4r~?J^k=PlyUh}A z@|c%P=fyiKupzS_DUrKrCCIL;jg_PaEzq)`SyN`7h#OC=TB3@o!OSj1WDSaEu{^tW zZvb@4i!;^f%t9-1ZRsu9!m&=$rk%HB0zY2GrFAd{6-Tij=GMxN740i~Hzge#BagLX zJGws0L}P*T{Ct{salkB|Md+0ydh#9G**jS@c10Bi^lr{`|_BW2RrqA{rs?wF~Q+yhV<%I z$FpejO=Rr( ziajD2f|_=uc4SES6s;y8qIGq_`y}@%-Sp$tz!OiGRF`I4t`x6MDLj7SA2v(mtAwZA z;8NV;?l95=-k%~T8kpx<8y1meXyha$_;af-#gN-1%kw5K*_+GU*t~A*K5Uh@W&Sm- zoePp!v*fg_pPb&r!KzgjTqfu^9?-qI)REqlH9pOj#&3&zaWHn)WnN?=_FxCE#gd9) zZA{dl>ghMH^%vgyH+Ci-Q_z;nA@FmT@G^DTw*GoSzumHxOLWJk8+5-6X)8T^R`t79 zqjIY>so3h&d2;FIq3OQMYS`GjO6oTHZj*5D?!C>nd4P^Ck!AvIzc%1#^16_TQ zq(-g~hSmVU(3a5??b$tTD9`ua$%5j8zMC(PhTX1CzV zpnAx)s;i6=X^W3d`DsD&@8_r2f{g2MZ~igHZ={{vM*Ss>2T86IB&S{**E4GQYf$w_ ze=i`##+jq(wZL$a0E&j0kv0Wz3X6SkvgipZoGjY0J7RDQj9eulYRRd;l)J~c)EOe> zNG^h-crBo|?m2Q!473Lvz}%3tl~(J@1;GONboi32S0GXE3^-iur)tGh^C*|GuS+3@D4p!p7&?k~c#1?E;7~QuNG2oXR$RO-OiUQP! zaRU$7;F1LKg{yNND(0^)58gb%ET;|TMbb^_Y9E5WdU1+0LB zDi~a)N%?;uN(V9{@9c$^TV1$p7g7f|w?!pKaIBt7rHGr#*ZwSg3`utS*k>)@92|pL z&X&N$D3fSo(I#iOHO<9cbd*&s%i^BW`{SpXeGdn9bab)I+Z8tDt`!)h6!N**`MP=% zpQ&66%MwSqjv^6VjgK$??H+IcRVY69_EP3320r``myPBm1&E`zO`x;yE%hEuJ%fq{ zvB=G8Fu7nldGa#Id|a*%i~%`bCS!@jhqZ-RK34bTxsan548=ieGXN<%Q>1=!tg9d% zq&9{~^$OBBL_y7Us$YVp(8LLuZQO9M!mKm*HZE1|G*s3+dS4s>YnKEq!&7=eWm5c3 z1G`joJ3kZCHHWcIHg&8Sm>pL~E~fw&nV+=?g)wgUFp~4Y9b2C-Q;~48pSxt`PO>1T z1SBfWPGEN(Nw|yXZ&}7~kroAWg^roTrUeg3(MiyzPw`79O<%MPWfJLdw)Qoq+Mp%7 zO$0k<1sOqb5@-Vre#B>_CX670UQ3~`tb%?*dLT*G(hP;9Pm!6IdvWQu$NH+{bSEqf z(-_x)Q`c*X0mg4r+=hCKuD`|Mh&Y2^6_9yHQAQfhDjejq?C$I?8Pz~*0p~CnOnRH8 zQ#w=CE`VpklL(~RGHw-lIlAEz&+=lnrs6VQ4}&miyf%zaw~Tov8=X3z(xh`j*riz- zovM}A&9fVs?ywRuE4Y^OIMZ|%Y0{J*4=>g0xKvH<9+_ya?(S|IJpJeh>U(!XF}fM8 zP`&4kMjKD&dhf|;k=ePLG)K(*d*{s`f#>q2G(XZMy$hLND(pqHz z=Ybo5?+Krka!|cV=3w>0qE8QgGn5gCEig5-9Oi0TNqs*G6FX9->0q02M%q`jPYB4j z_+GuE$e`;qok*rl@RQkQOVw+xa5%B}5k;1O162s3SLuX%xt|Ot!VPbf1@xDO`u2;d zxTFYe2!SI_epkSJG^v0u)}Bg(3Po&5F}mAl1k)YgZ#>6t-Vlw&*6jtlfkw6o^B5^s z8EE5tC6H!&?xjWh#f7?hnQbjITC5*F$T)RmPs%hF41H4`Fh6#5rg2(%r~f-T zp;C#d5{DGLylSeg*~gkYnhKPMM;8|(tj0IJE&30kqjEUYxC7d`-aBM;T%jB)b<*ck zpm;2LPEnqNdp3`OcK?VK1RwRx8`l@NUj04|n9>7Ju*jkI1YY)QCmi5vxXdoZtgd$^ZMiY4X*`XFw97jDMcWFWmb z+jp_|{XN4lk<+WrUrhVdE%L52xO{(=&2@5ZZLM!;$OsqH;`)WXzqvNTI&OBF&?*Pf z0;}JE3-K&q?FHdrE4UlkfK5$S&*Tu(>?I9??XcGcK@sArL34dWb&1_A;8V_h%f6fM z(!!4WKkU6{RFm7*2C68QAc_hiqJmpR0Ra^OK`DwIumA}Vnn>?RFVa-(C>DxTQE6$^ z&^ro9RUm}kI|P&#>36@_k}lV~OphCHtuQ+L+BZ_E zqajdW!y(P|B-fxdPRUo%cg{;j!pQ`6IzBIcjrmg@Vm8$^z4^%MCl4MR?iIJN$z*5V zIH8p!?jm4g#Y1%b*3q+$TxG!Y!aQsuaK{c@7%3KsW((-FeWb4*5N-Mh2HAnMWP`+N z*Bv-ydUX_XcZC_PV3$*1#9tO6Dnw=3n-nXry~=IBn3RRitjq{!sX^;tai6B*ce>-ktbwt z{)x0{ja{pBiwpy&>&B_U{8>yMqO=2bcYIlUd(d@7_v5Wx2if-b0c zA3zF6{0L--y;-kfSFRlLR!vqqBvJ*xm)!rV0APL5UXx;{;U;mLC%Xshj^$E#ZvwYP zpHI~;y&KHf0^^OjBz&z5%Ii(_Yo8^~hZQtV;|}B@N;!aT3gN0?HJ_H=zUXEF`kXYu+Qd8-kkY@3#j^Nrwbt z3vSY`$Z8NbNLhD1Pd!_q(nkGg?acGV_dRhMy zOZ?TwBR{DKw3+j?3Rm~Z&ZaJ6O3P8PC{LXMdr$?H zLT{>%98+bSpi$fa$#-r6msgzx*{>6vV@MS=8n!Td9`-%GNz<9zY{K&ECQP=4*be)r7M#AK>{N-V~g!U3b({cDO0Jz$(ofU3+f6L z*;Y83ACW}xR4_945|09hJ_BccGSwJwcc}|_B!RB4MeL~k5ASc{vdGuZssKlzs*?)T zVPuZ;t7s>UT5Dr>Dt7mQ5;zhdq*0x>4Q`iamT;u$m9wewJ|_9p0N)Vg%uTK08G_dQY`{tLOfNVcUdankh; zy`dCJNT!%S8h-N3zB%hPxXXN-ex4>ikt|4fdcEP^OKU_R>H8lfHZ6Shji&znV=#h(l@tx1xG|K0qEuyhNac>e_wRYB$* zh~`_hbxyqb#fvjrwr&lP3SG5?=6Vk9{~V_yTc7Ea2zAV!MnN?&U*m-s?0zaG@Loz@ zULHyGP~lIfir;T;5B2q_8Xhi1G#YUQb!xQ={>uEUX{dU*uzCd4d5#-@1h*>#te8FSIw*)@>zZ`@=uRly@wO9aqP`PFon8&t2 zD62`S;?mi%#07xl?k#O2VLwbzet*~h`F*C|K~QIKF9LTNy$>$3#N6YxZl9QL#*cO> z&5@`qiW*TA0Rg@GM`d>gH8^&%|5sFYC%e_-6)A7R!uF|^b`(miCf4uYy3I||nLZe% z*{o?N4P#t5+>#FDW|^G2y!;aW3CHKoF#^OjF*flsvOMq+xr<2HsJXY7*zaqT-anl_ zk~Melkao6W&-_G6T2rE{^FvJU<$&X780~@($aE0pN1;Ks#*PSRo$bFL()UC zrqJs&xoaQz@>TpO-zA>Q^QV$6T6HF+TVtOQ)N`(3Q!>>~4=|RdC}sOUb!grLXymI+ z=QH_d=v=R^6uSFXr(9h4ZDB8aX`#Rtg)64|puEN;08_;B+VRc%R)&r>VJu!|beFY{~O?MenbM-#$7zmqMf$ z={Mi==4qm}&{jIR7N4*ltucV^5lif zNdLiDwcaHF_dnL&(v|_!I6e32*X2(Ez<%}lGo`8tWjQyuO7U(gSV?5`;EgGRH5a!I z%@I-<>Yj6Xzx?_#s;hA%vgC2)gzuX-`IyfV=Kuz#715fqih#gb5thTvv`xTQ9eYe< zB?;3vFJkE_NoY1_EXPwx{)ik@*r4KQFF`92BWgBFZQ=TvQup&K|BtuozsYK1GstBp zb{N-=m$0P3d2HR5n}>IM!9n!Qu$__~Ri)oYlJu4<3s9ci8CZy+=E#7n$*E z5u(kSlEgpG0|+bkaLY$p<5PgRDY`vpmM+16yx`LP8^jPgY^{Ft=BGUtWob6G=?RPq z`z<6*=jtTLroD9neLIq82v(`L>W@}&zt?&+Xmnw)?vlSCq$HjRRM@=vId49;83S6k zE1IEFYSQY7$D)j4q#~O>9e^3-HqW`Wiu3=ROSZlA7bxl9TU|yJm8#%@rxW%Jo8Y%l zw{>6$SNCx8D%#uKAzRQi9g_U7NG&Kz?WCujoEcZz0+xx=7wBS{M?T!DH4YdtatI=* zvYAK;B}FO?Te+Oz)ibmWdUs?fe7*_c z?CF1O#{ctLSzpfGA9Zz7Nclp8>R_=%GL#ObfY1?H#4cB;R&QSWea7(dB@VpxWYI`= zJe`e`lRs-_Ld>-F>B6Y#!>3P=#5#?!U&@h^)UPW((o=`VQv=BsF4Fa~nVFe-JtH>y zAS^U!jTBJtzRzV?tRA~*3s)G!7B;s1Tu(UoB{XfE&3j4B2~MS=9MZ$G;0c@ZWc%Dr z=lcnNwF_MOjz_`Z9~91lA}*F0_U0d}3p!E5V82>2ziKVGDWeoKFak64-yeTVaO|(* ze_Hv8c}J6|agC3U$bskmoSr*b0z|t_*RQ`w3a<1V?q8l#@Z(aY8m#ok=W51X*SRNV z_xmI?iWij+5@`IyL+@-*G@xumiD%R_3-`O6`8MyijJY^3)8 zTzQLsIO+xUM7CpD(^76nSD?&`L3C@wp%)sCW@(d|sfU-HTc;g@S1;YQvDI3x6X+N?08WmT2^$aTE7>!Ftm+dK z*889W0&P_U5(!RFjUURE-$*~tXt8lswdAs&+38Yl;~6q9gL;1B$%(sZ9E(@|5Ys-j zoVsJ+;ffd^uiq#Vhh*S&KRq$*1BI;|P_Po449^_^4^=gYIMvzs4MMXJBjH%BtoPt_ zz!B0TIs;}=hQkqHbfC6l4DwI)pqa1+G?KL!O~j%h77t9Pq|^q4s2lA;=rN}jwS0B! zVY=Qiz1C_w^S^ICP3UV8mwPc-Eq5cNR_GJYTV&8g0cDEgP`$r#*L$GP*GmCBB|SH; z!~snbYw_Bf@ z74flXZ(8LF(^DIoCly0hM8&>58QO$yA6WXr|17S2l2@3vMbh#YwS^$5LaYLK!L9{~ z+B(?eJV>->CO#p;=xYObiXd`O$T;)?xCN2W&249PXBWWk1Iyi`bA2-~9KR4I<@z3y zjf_kDAa{C)n1$J-@zoe=tqdI;qmMPhc-HjxRc28+zeBvRp&et(YZz|;O1~fIcrKnk zecP7SfQB#d0D`$4GjCAVy7ld>O_PeY>waVc6mzJyq*koOvEXhEyo4_d9i7@d*OoaV zJoGfH_S;j0Q{Z!Wrq+dWRpjvD&&ul@hU&fyRnzzE*|TWio1p*rm4JHfI4D}o`@s>4 zLmTmfiidfR$jTw0Bp-xt?kJ_q`H5C(Z4J683UPRf{70=QO6dT;75qcG`@Xz0FwuA2 zCfFKGuomd+-h(I)UbuxGH8D*Jewwjw&SWj3Jb2$8ymi!4FH_QixVcZDvKHmDDdqeL zy?D%H>dne_-td`KVGo zX{|Xq-vN1@7ipt-C>JQ2gW3lIVMQO1Dgk7$IXy|B_ zoX~687WW0$DahYbxQ=(FfU9b1pBuCDu13W8$!B2FlIOZLKkHNv z`i#3?UawhF5a^@p<&{UIRVNH9c2@Uxe0;3HhQIeA{aozR*7``cRQ-}yM?B+2nRUpw zCo4{j919~?p$lqYnjZ8>i&-7yFC=tEqvl;!=WPH~rV`z;m}--; zZx=WA+CI`X48*K(adDB8k?{yV=~NZ`c4aitSU+~R4FW9Z8e0XbRZkcxiK*w}s8x|V zNurI0yJB0yv}ExnATTo30-ol@Yas+Bp~k=#({uDGAVI(8(`SA!!fH?GqDa}M8-o}M zwP+1R`P?8%vmEGD4DPzb^Y*A7RSstkYe@_FntYJ zY?0AfGXn)#tt|hjFt-Nf??C=9P4?50Hs&y5A?_hvuAGIbcWJ;8-LjgprwWp` zI78wZdyPcO>(3Hr&!<);eNa0>D8p zCV*o62*TmY(&LhO@9nabIYyRWLFuJ}VXO90uNZ0v() zOW9#N@TzRb!I9RSR^_#WfpKE3w-VKIFn6@TE)3PNahJpc%(}s2MGdi-FM`0^Vpv5a zD<{?^RiQ@~fUfNeHuA4|eZb`EAS6$G8V@BqV`Mc#ZmR`d&N~USY2(jtJYxiF=VA)9 zY1(&88jqF1NM&?ksCj*`clW}=x5{<89BQZi5|rM;``@JE8%&B*XMs`LUZU8y3~Sjk+`s7p?K$^*uifB_r>XHBZJwbUe}&) znk~IHnvkb>6wR^#NGFNQY3*=GP=RrGbAQWja(&ayA)G*Mj@Cu?Vn5zjm7>GbMd_4- z7Bd^W5}paoHlkad_mJEc>>9OP%)YcvhP|982F{D+Fbf^3FgTdG#6JBWr}zD9@NFFK zurXaMl=Om_^2=QA*0e{oz zwZ2y_>g}qa$uAVwq+3b(W@rf)mzI)uaPkX&@P53_02CM_Zl=P<-jaUT8Z2VenovD* z@grix$-{}Fb@|>4n6C7x^qut9HgZ>_N7Am z_fl5o#rpR(gvP^$3s8hB2#kAFLRM+uPbg|HqpA@vlCJMR2WD=1;Qg&bKSr zQtz)T?q2rs`+VWyijo#QOOJO#;vqv{+WZKmS?X$jeB=%_V917s?biKa_TgE_{-Aw@ zzoeD!LTACceScBxK#eWcyp@R}N}{?$iI;wNlAc*cX^WB*&00U;3) zk+-f@izfg7aa}&~z#B`DyxH^fo$^>!T|7|F^mto+#fuYTL!s?02Svz9Afw8)AFA6t zyuUtF1sn%~$6=A&`!|EtyI_{VY+i6;>Eh(>Sr68eRe_@B&KF#*jx4(uuiNLpLhj%J z>XxosikjyLVSvlkLkXY@ZG^Y#-w3V=$Wm(DYMA|FS^5|<0Kx2mkt5!d ze*MmbO`7(u$?S(g z+yB^d{w;M6K-X|WjPz48x)Hx(<*-h7Z_l!~$r;2m#w5x1CwX19#!rGLx4Zh^B%NQk z$l^~jH&F25dTjJDOCPQc-r@RrkJr1Gx&LLVP+f8juZ3^I8|A*dy2W`=Afx>rr?p6f zY?`Qwn0(vg$)S2(NW02b2$P!gF-U`OQW$)OK%AEL{hDVBA7PYCmJ>|dcVlkK;h4*$ znJIWWn%Bj(`%KfPr$AP{@JIO2h@QXNQCZicy@f;R_@}(^@9z$FE@5KI1)TYiwv?z04hU)t$fb2 z9U>)+VQL~?&yem~a{ROGYX%L*fHdQD!4&Gf^j7faG=oGe!SNxWYPo)IzmI{CD2MdZ z%^Ab#r4Ie;4+OW(Xzsz?R`J3?-xzAwU-c33LO;>}{^jkKORj)(m2w~n)%LBf^m;%p zgeM&G7}-;)^D9>M=d+DRcA^I}86#j46a)F$DowqJxO`HEqg8>>=33a7KQ1t$*Vs zqXj8FJ4g}_0!PQ?#yM>fJZK9rL9U+v9wlfDZ=WVU1 zl4>9erqe5=X3R36J)@=dh9&}Na-?r+p!9@0+!&E%o|>09=7A&+oER_UkpN??GhX*$@>^Px~4uWe9c= zH{!w@0Xx;yPmCwg)U>6JQjXHgQ&7S;;tLDJP zo&*|m#yrrJje3J^o;EvndJm`dO+DFuB)?pNF4_G`N#jkd)7oUWx#@cFW*?Dq0T1gG zm*KP`S1FNmA_9#BUDTY2f$L@+WKCpqT|)%~DSJ26ARSg0A26R{~tSdoRfljwum6_~kko6nu~%|a<-ZGQ_2 zKa{&W^%fFM=ece@f~lY#lEEoh=@}$`*;10=z6cpfJ$(`#@RUQikWmSx!uF=wsW)Ue z7&7(JSmfI+;v)a8oloZh#!&~ZEkg_fUe+jmwlYRhuMY!C;cpA8A+6A%1h|nSxI1i$ zI4%K6g3W0W#%$C#)>+=wlYSzT6)F#U=k5;3>V(}MW@Ory>U7^^;QSskgFJd{&Ak#& zdLV>>4PFYrVG%TGzIs*)gb&j7Jz$$nvr@|=NF6{Whk;*v22kgk4bPp5 z_PYsnIeeQo1%VI?%B0EGVL%z@xb_w2#(HLuX$`2$(=*PDaRCa(q%pyv1&k!7%(RGDM@EI0!YuH;ttG?UDATw7CYoRU-IF!LMefEUxt(gwl?z#V?t*1i;}4H4aRIoNJ9Rx}+1@bF zuQH|~DU#pAJXGpA4%t!?(oi9pk$kdf30#bX1GH(R7uAgiRM;Ntm-;aq<8fygqo%Kk z5d031wB}m76-s^idna3&%^Kt|(%@v{a4M1S48?W?<^qkzQ6W8ADJGN>uY0%w=2~EC zw{JAPjQgO>7DHuK#!c6l0bXM={jTIIyIm3ogTq*@^G9|AAySuJ!JYD zWi$?@C{o!Z>J@gBQioo7$W+AZ<2(%}1h&4ZC|~q?!hk;GTdft5gPDflqb4u|egLO8 z^46rGuxuKG!Vz5MrHyjOrmJ7nn4oMXKCWPFK^%wr$HMo2peU~=@L|&&6{z@hH8!~B zr4D%uZr9F|RGt$nBmH*JV~aPQl=jm)kGB@VyHRH?`@arQE`RkRqsE`bI=|UM&wWt> z<<cC1|6Gn+GjcVEUP4%e$p+BmCr8;I`0`w05NNe^0!^MfOO<)eE@31O};Sf5@ zxjd(&yipp{>$uXQZNf8lPF6|a{y@$dq85IOuxhn+5w-(Ec?lJ!L)0ul+R0F>XrCpW zPQT6;rR9#ggg!;U$uWA&(^5O1CN9kON@vS@vL(*Q}69&{78&|E}XzLm6j@L*_a0P{j{YN&H z)B$vP!2$^ZCk3ZVh1_(2!iqh;LY{x@LL{L=3O3pg}DqiuUAZo#-JAvKC5C z)F=raMk_hScADVwDZT9gw5I?mzsmJBH@;`0ccGg>K$lSI6F5K7T3x5!p<3BsiqpXO zY&TQW9|_Kl(Ov?H)OvtM&D<%U=AQ_8@L8m|wRYzKwm4Jo4okAEKI+zYLHe8X=E%2ZuTv z%lkyh?)_~^v^6_8@&I;|}ll>Eu&6Jzo{L0m%S-69g z`Ao!{dxF+Tbua+~Fa=6Ny$E_T2CFnPe-Gu9m5r2l5T#=4n~yTj;)%_5af(Hwom-rG z^~Ij}jNsp@a$L?sOw(YE`&9>DFqy|j;TlQewD4LR{RUMoecXefOi_&$XjPjmI*-etHbrYvz z(O$U2nD8zR!(bhhJ%x4DiLQ7y%8!a>Ax5~8U&Z01*hKOFV0FUWzq@=^nB5p%qFg## z8>`)lPAK_DH5cdVgr?!HqUrwn?}I}9{R-T=o}brXw8D5sW*Xo#+ zh+z)#3okP*Xw^*HM$UO0I!5DDPeqU==cZXn4TlM~Y#)ppWXdH5ip*=?Zf+I+>WHDs z_4MX8Er$xRJV=5q>;2h&NI-glm67|*7q=5c7x-Z1715G9V5-p0w43pL+m)FdK6$in z*PBy!H2UyiNXsF4nyn*yvcYuoSdCN!>gfr)fv!O%`saCk!-6%$=?Z325>jBGRXLfB zTEm8t{`O(3#ey1{f>+5%bA~QU2XtGKbZfBHA3h%*o_|fCb7$)6#F2atZN0ZBWY$Sh zR=|nsm$1^`MRHq$EAg-c+Rnp5nxe&LywpZExe9O_w7Bb3SU>J7sZCH2sl#U<@4OAL0F|7 zmv0;E>^ME%FPN$vK+~o;AEYa(61&4FQ43Ou_p1!w$NG}9$E~1?I+s2eO^*_?LBgv$ z=&zwtCtJ*oR26R?nPoXq)ABi9B3U+ghySu2vCjcycDr6!4A~!!GU=&^-&ZkXf;&qg zkBAE-2amyAzxhS^a}$&m9BP-$(TOH$9l#Sviy*={+^IO_OMv@SH@k`?@y&5eL8EM_ z(FR)&K^K?^)r0(~ zJ2K-9)u)VnFxyfU8y z<&Fz3i=A*^WK=yZev#{B^*L@1#vA(UyY-R`E7tA9d-z?g4gK)k0@VikHI9CZy;ZHV zQ)6nU#s7I>`$yc`k0Z>70GEqr@TDOVN{W;baQ(jEa=kG*PPg+F{`iGWI^MyM=3XpKAfco zf3Z~d#mazlH)6I1QquSbd!looxK=x~CY6_$*TQU(C;#*9{hZ|&XTkd%rltNIp%yE? zfzBuy1fNLGiC=GbS9!h{6VkM4K{No}WO1_pqW6kl@>{)uw^1U3J?x*zVq z)0{lHAMrqk-@qsa)Iv2#9u-`^S_t_8iNlM=^Oz#YNYl@77)b{9{)tb@0fNh*UPy6s zMy7)ecM6c z2ccmJiamUL_AwTmI?AN$1eBwFDACvUW*;c|oA)@tuF7p|PPH%DM(@<}j8q7MsI0~z zzzk9#O{NsV0$W2n--;tcT>U z3EqG10KZ=9ffKBY0QWN+SpK(1A&-aWTp^|wdTi{!u+3L^2C#GIdQYAIuwrRr``c4< zt06%A(xCBgk3#mX|9hMNcQyZ)_3{5^Z5DHl?bY*GI$mXhQE+hPL&}yO&;%dVZBSHF zLX@A$Kw5e*!4dNmR7`sP{r!N(f4X3I@%MbPUx&%Q5V+l|B&~Ut4jQNZamY}k>it6| zjlC2^X$HZV$*_~0!<9amNVIH~ngI?Q0gN{`|BW_$K@@IGJ(rHMC8MWN`Rkx2*vxDx zV&#pH_dHXFze5_dcxIwXKb?UA3rPuu9 zuP(^Lhx>4gREGNT>n$4a4)eGUS1(sIT)=wXx_H8d2k~2nQ~K`e-{wb>rzHyw#E`*& zB-nvFNu&aMvL5)E*MT-k20XJ4ATr-5`m+z^tV!pl4{YgtyXi;G@M{lT{ON%LkREi$ z(hl<>|J`#t>vup+Y0uB^jt5P1qx8b8F2LZ4Cx%lCAdJBRIm6K;4e^e5^MDEw;l+UG z$j^Dq=<0`=N?ZX%w>7{ZXYfQf2wssh(ZKHFnO5~o$N0pS6ie+$(83Z;$^%6bfs=Y> z-0jQ2A*^r0mjN;C#^s|FRxq@~_5Cro8-WE!0Ab;^v@6%6phQdroJdN^1DG(4xz%qcoq=bJ%$;D`6~Bgghib$n zUo%)?!*yUTVFnWh`^kF4^R)SIpKsc)BxM#p*=1;x9byUPGr8)#Z-TIThz_lhe3R5F zq@lM-YSu9_W@BpXGn&-ZYrBUWy|?0vRx#-=dsJ`_BQ^Rk*PgA57aoSM(0r-`;gd#4 ztVjU#Uwxz{iwG&9q|=D|z39!3Gh(lh$XIw!L;z8TQ{Bch99q;Zv-ClsnI;0B4hYtR z8)B}tod;f;Nr;490?_>Gp-s9KMbyq|LAal|N0LASHwPDuVM(wY0BlVa`btgoSIFa} zJ;mSn9^tQLT?AI>y0Z5+d_yPW@)sfO`MH^ll3KvmQ*Xu?5BY0YKb+C*l?02_VFz#X z?_b+3`i<0@U=)|_q$gH+Ro8YGml5^_);GljMmk6*jSL&n1l2FzIoI=UCmWRSs2+Q8 ze_Ma|%d9rh47dB)$MPd@iIxvgh`LlQyEI?PuWGwstT6ehtMZndMCk~jR)AK!TP!0C z)m@rKKfSARIJDlYo$-lkO;ml2#t#|$V4I=CQbBEzFS$51J|=AZ)?$F zX27na9>Si7E`!es0hziAI$}6Pe{^i?zJ}epi42fQa31mCYvGRE5 zhC#rE)Ymv6fRl!|tQ;r4few+%Hokc#*pBZXwq8kUw8$uzupctw#}KTF+`;Z;1}IWf79mGT@fXRVPMevbwWt(~wZz z;J!D8kCu+X#Up6xA7{{Dxf%UKz$^0)ij^Nz<~-h~1N478wz!4^wK>KMb@qXdI-P;+~+#HrdHeY&LnKr44sV z>9K8$?O+9CKhrX;5>g_%8;kKxxPNq>FfFi%l(qSXFsE(xnvFaAChwzjqvuq~ z@;Bjh+f;S!I~HuTGA3%(n_rZAdUl;+UoHM-|0A{yRJ=+ho#b}|V@25S&t`->iuTRY zGQ#EBLbA3!kk-<0+F7wPcwYJ45Gnv8r!o-L99MD0U#-u%RO`MS8>yy1DP-fvB*AQZ zI)^r`bbJj1l2jGzTL2$$3aEQipw&M(mq z5Y|h|P&`$6%9(;z@#+qD)gzBvgFfYGNbH;~TNz&yIy$ENCHediLg&oaM}Og~LtKQL z63S5iSyD+{#7S|=cL2s_0nFVbzMCeFkE6#I?Y8k80Xrz+5PX)qm_?J3Q0CX$jh!mG z8NgIHJ=wc(F8auH*gHx06!XTOLcUD`Q$sW-{J=F@JDx>sH#X^Z<|j zEe@i(Jz@xhqV`+WM*DMPk%GAsB>IA8X!z5jJ0gEM-Z!sSG^sUDmEO#gzY{5?hE^9o zb*=}S{-9>#%xAzKJfxmnCgCtVbh-wzZ(5+3>pWe7Ot67p;B>+DK;y@TF_lxPli$#e z_%@6V8TW=wuSgaWaf286tFjcu2BP{x#xd&;C!{}YBrn(yp3+#N3YVvEc0B}gr&E5} zzmVOFvoh!y6O;wn0YCXrGu<{O#IfVyr_(I)P9{^mNJqW3QXu0}eN%-1cCN?%q{gy_ zbt@R2Z-xf<$=%Ct1nP2Nj&{`3>%i+Jh~L2 zGY ze%Y`)&j3IWy!(p^+Lo57C&J&#(>%UBxi%9dc!e`t^=5y(K1(&j7Zer4_q^i{CPVQmCS6WpYSZmhcM?uBAYP~Bjqq^Q_bx8y7N2aX63s|$Rx zrpBB5m-ZW<2pJ$kndjYROojsGP-W?-ATYa2hNCpqO_#`3|y8j)32ZCJOVRIT!3G{MSkK=hfDco zB4R0a{Lc&X`!jKy!N-e>Ilk<7^v9DvAVEKA>)QWcmAEYHpxzTRo8soaEE}q+dRKY z)k!O!U)uqTFhl#ARFoxzm>Iy)`RsMP@S-0bEYk}XE9YB3bh*u!A+#4{xxYR1=BwWd zv65ojC1(=YIApdl=$F2#=+I2uyp>09O3L!bcmN0(0zN{qmc?_w-x~)>Ck47jkthwp=`E$v?YR2yM1q88wC6)VAOLPhxUi3-&|fj zyzT>xX}<50*t>Z1U9k5A!fE5z_5zS6x+Oxfq6UOg0u*-kK;vu#ex9kZvGKLN)6hDY z!+^CGMq|;SYC?q(NROTFc65e zat8J2>lPfiZzA;*RNpL)7d3JKt;lIMOa)W`mQRONwThNggr-#vb zo}o3!v;rB?kIX?{yr^C=OLd}j$Ai6Q;O1msbM1T@efg7P-(%P>6HXfUAnrT+0&*c> z2-$Poo*7_CnC85sz7yN{i8jRgJ* zW)S4UlF%g%*HqdX3T*J2~dTUT?7$tKOK7YdK+n6_66pdC#dyW+On;wgla-gRi&56@^o;{n$c* z3^6ze^|vVc%7BAcx>iPiWYCcG!qhVtaS-n!E?imA0@MN*aR%JFn!W*Xr%5nl=%|DI zDJpDsuGE=@x7xG1CKm9?_vDkJ?8;)uVfmnTY}Qj=2{tN$oAV_2d$ zq6erO9md9nd!j-e1T^??sV=qp5nX%YJt5Clq8+dZ7@xV!ao+zt_w0I5Nf zL29hSJ(MV0OXZ`RitZq zj*0gMck&rc5R@rMCP*3y9m0uwi^)rr+B)sBH?#cH%QlT=Ha^cYTVZgXbfDxGe4C#8 zHb<)^M&iE%3BB!4XGJkPf#or)=a)=bT01jH}Lws>HE+G zE1{Z4gYMG=;mlO(^6Uy9nWhtVTroZ z9T_QZI;9z_5PbZLmn}jLWwHUj-zRx$HrVruf>j%RgF#t9JAxLm zfG);=6^!GJgHFgpc_rbrA+3P3E+H_M;RITm&k8dUnUD1<#JwL6%-3NoGYr0YE|P@4 z$ZI1~uGTpjXvS9DuPrdbsmg)ZC+SB^vE>c~gG`|jEG&m6wI;OZv97RVQK%_?P3VY3 zh8qH0L_>n43MI+R@~ud@N+|}vLqm>-|HC1r$R|OO`EHEiU~cfv<%%}XSA?{47_BgK zbkGh%1czjcST)92XM02-9$Af0dR5ql=lVFN#azFgLX)R=@-|Uh161?}-CICM(>WQ9 z`A&!w(mMDZy+1vBd-x+8fl^}Rb?nSZ{vj@~otQCOqi#~4rbt;((8iH}V`TFrjV zE+jhu*ZGs$z+DT23SHX6!;4*jXB;DIU%$H*e=#}^H&B&}0WgZ)8HdBP2k=R-?Ve5n zmdlJ5UoPz8u`a}1rPB5Mb?9Q8-%FFT&D0#mHDLf9S?%#{{1oyL148y^qUU6DV?xA50W$vFerUtUL#^{qH z1@0SgcQIBmh9|)lR6CdGvLCB-f%M2gAf8xxJID95B03WHR!t|(F9kD^BxQ*DzLt4M zSH7$3>vq6EPxjfc8b$06B_hz zWE<+ogK3M6$VoKCNm1F^#$Q(%N(M)AyEdiXBu!%!!uC(x1no#hrH`Lm?TdO`WVwl@ zCeYFhRH~29;!7s#m3@B&(IcA!$`Jy|Th1x^X8$;6xvQY?e7-G08rjA@Pj0>%od(*p zlzn&x0rY+oj*eWMJQ~N>r;L8fw~<_AaNP6lWVfZX-dp)~?~#Y10+6-z_U503ELe3~v=< zq_)hMXPxej#2zoYBmRW_U@+BxQ_`X2e3LnRWd_a<{S6m~l%}HAUB!29V3(-ulXF){_WTj`lp}a13l#BnGiK z-hEYWiO-~_qelc73ly1Nna?J@D5*)SlTIH;w`f5P3=H5crPz6KE2lmvuv5p_hE2pZ zWA$Nq)?p1)*m6*r6WC6)v}dX0TF#{WB!lw6dU#y}c!6L}o1{R#h%6cPHP}$9Iu^Sp zYx2PapV&K*dj-w0w@n3J&%%%>O-6a<0KNmGt@_!}85u;S^*`Q#jjYR|kTe_7ANf{q z+HlP-l;Jwf^HAqMXCJA;sYnDUSw}(5rOw%C4bzyj$NnJzelgvK+NEw8El#N(rwXi+ftNz@pT3V-4~Y+q9<*!6C| zzsG4D>?G>oPo!Zt3`4V~gaUetODxl~EyVp*x6lfN&l);!^3^4!8U2B`ax>iKWD=s( zLWBu8gP&*RVn3F`(DLXk(g2PY?$w&3m&P=_;Mu(3aKrCqufmUt=fOp!kqo$XXv5+Z zm|Kwn*P`r!-+vz>|suHq5{1hfn;?C|Po`iLdWG;|{$qc0NqZZ7}% z)_sVCcEC)E{oJCMk!6o3Y<|rGQ}_rqG-HhZV{#K=Ug3kE*_gry!|k8Md2<)zZvWl$ ze(x(~ZXstrb?ipc;(rrojRr@^tkDvF@k~CqD_4@I3P)bv==#sUTbvHaSb5&c+hp@I zKWmxhc4-HR1#Dyt8$9zjhSaZD*s~f2r>i&I|7{ol?RmMg8AZ+Nu5aa$e=u_Ku=9_r zd_e*c^ZzDx{p~NH>)xU*(~fwzZ*hNHwnPEiav8=NzZg}(V?4_ZGc;%hxA7O~?ELk9 z*6j z{JrqpJ8#}R`d<+N7D;&I|2^mL3wm*3{`n7|{~umY&)F}7fuT$Hh-cTf01;C^2$2;@ z+Z^yaK6CRQA3r|>7?3}G`Q<30i$FlA3wp3@&bXzQE%gK&@gDh&&?^E;Lhu|La8Hk2TYk2D|HD{V#rhQts3hEQ4;B~sQdk}Y!#{&* zgJLfkQE@`)rz81cBm(S;V;+lof|!rEA341vQLX-DYUv_FHQw zxLn7d3oH7>L~@UHJQhlpa-F_w=W2hzX>QZbH-ckwd zCPT%mAvULx}5ie^j_&_wnU-$TMoN zxBnoJ`y6BdY6yYp%W(RjAW$vBm<|IP+8@*c$dEC@pF#-1?=QX_0$F&;v5BOlV>1xI zqOrYS#EXO=U$mC26X)f(9=MzYD(7;9gTuzBY;`JO`kGPz8x1PQ3wSW=skzgU>x9rC z5T&;o%yJND&eO7Ynj9K+yXmoDdNI6=@1Wa1PVLZ~A%G`>Oa_C-R1Xw>Rz>5CD_sph zy*zZGk%K`nkus1q(;&n}HWZ*mr2XyUshB1%qCiYShi$jpa znjwq`aBTVz%(UvKH^Lu_^b7b)DvTc}n}y$k5Z8#K5s=>oHN%i@oE3Cj=HPYnZG!YU z8s4RSy}p0i3b8oEJpfKa1KdVsB{m{%7R*p~IGQBKx=;5X;D>>{rrT6E$yvqsEo?6K z)PDL}u3MkyNPG%&q$B*tC*2U(*ddgUlkGvwz*W~Nl|xTC#VXM0q5#vD8$&lhssuE# zDSLKQPAN5V{+Oju0LG3$9dCiBY110en$7~NBT^20N%gFSixPT3r?CJbn-%-)k>b=o zureo_&mMR@lK>N{0ff?=ksftgQ}QJ&@z3B`pzAP;!;`Gps6of8Ds8vYLzxc;#zgv$YZ&YwcJ|B8L!qwR$q+*1-E~mR&*x(6MK9Xg00t8RZBB))^5WLo6 zyn97*;#I5=;|HJ(lEI%pqwTBb+TB(o#!iN`Je-yF?Duc4{oFT-`>e8zzU>4gOTjXj zUK0>779l*PuqO0`qf`Yp?Zkc3(sk+!zpp`wr>+4%BR(I>0s@p`tySbYL6pz}%4-~& zj3A$0EdW1{o=W*_lR8#$Li0Fbpy#^4tNRYaP^OyicswkvTev~&fWUnLOK)8u(GS;H z^~?bz@ZIkMWcwE(l z7Xvyk%qsu?Veh?zqRhJW(E&xVQ9%VUgQF-k5)4QVVwR}TP0k=WXPO`=X2b+Y29?xJ zh9+kNDoKSVM-h-LB8`B+Z*3IC?=bgF-MUq`?z!iWsY0gd@bxdDWB>ZGiyxXV`w>&l3M_l863R6=T0gx z_w(5C-ugmveOPz#(Sq?r2r1&_#7(5iqC6%b_1o#$$Hz_)^WM*UhGgs@N18%fmu3f& zF*3-K3sPT_Iw;JY#Ers_vS~GW)_5Ru33eA4TC85T2QK#Gh|Abi$B38lgaie;m+uhV!)YMDIB+Z+P;C+h$DdHBUHG=W_`_5bO?f|!?|0&r^#X$8Y}WG{^F3wc zz9b)e+|>>c2W|*1l%7%SzW!?6r{bKYCJ@{WloVZH z!_ViqT*%=&JBh(Xs&7**jiD_@a)sgk1jTpenD_#GloSoC3z3Tx#}rFEuhs4QOkKV{ z)PJ;$y?CVtFz|}!WV(pw)S|P?gan4giDOsILb~CW8>&|i zL&JAP_3CCu9F3V1;U(}2t9Y3_ftYd#=Xtf;7N#^)S9$leb(p&iH(fnET0&Iv?FIgH z>>Ew-P1eDECF9afFKTUP!x3HANPT^o zqkMADQhZ$hdZ|Nr$Q%?;UHFP_W1_xvQqjQI}9FO~&FV z$|qeQ)+`SgSdZM~iU-AqXNgSm0dcwOY$$P9J>0rP+xT;bQ?|Urf{8DPsyxvfKi;>?%eN)hl-IC*i4s#$tVmA4D9u!9D37yd;-Md_5sh^-@l6< ziGHg^32pYzhW)6hHhui<4ex!?BO9sxYU!kG@BK@xA1=6to>2(M{jt&BbphDw#-wcU1}GDl zSZHvb*zd|Yv4v;6W`+exFmB+{%z2A*CQd8Jw7Q`s_=VAi?2xK$KH7jz5xUgUkifU$ z!uGKM!rXBe3<3_9;u7;}^;q>{_+Ri!cW zhRBF3L=i$GIlWl(su?urAUp+Ks1vCevKVuSD&!%tvi=6q{b8==yNKJUftmGolm+9% zqvp9*0#z~0 ztZ!Nuero$XS&dJuK_HUEnyh*xe)K0Abo*{CGn=NZ|qz^V*3ru36_oKiP~r&s$nNY zicOP?5Nm>CeHSn(lN-`&vxH02>Gf$v6ki#ENo1a~-MXM_Ze3h|2vFMh zJTP|J)%A5SeA7q)`Flq1p6xtdN$1S0CGozYhg7bIzLKlCP!TxjYNlo+AZ|YDTv*?s z>J&if+LE9!5p!2_7Lo@&lJg?|fmq|p_XBTo_0kwYEQpVVNG7Y%mghJ=_p)^?mENQV z$Fn<8u})(>Qo+`fRQN){yi+6g=+V=^E;Q|tnf}`QY6%3{|Xbdj?j3lO7Pw1hAee>U?M!M&|2&@pA(iGI7&HG-F~6k zR`|v} z4@|A|XAOWL^?_igcY6+o%nLghSo#b^&8)cgjxO$b?xnz%_0FT+LXp^KONJw;2mI07 zu}8x+WYd7{p#_I>8ZR22@FAYaFpEP9Vq+)L<$|Yvu`m{U#Gk$0n%#H#c3&*ryR-?; zVaxnk*#<=y@GcIsk^i08#U8s7zQcs_Qr*RiaBn48VOao||HcuH-bKYDd|)ZfHOj!r z9~v7dF8(zr_f~}u{R{tbk$(OYpe3M+NAQR*`oww{l~b9)}J?TXDWuXpbGTH4<9~!CbHh@hh}QwmXkV!ftc5W zL#Ea(SylDPTHC2pzgcM~l%V7f$@{wK=X;j#E;uVrjgRZ(-k-bt*YA5)DuUt4_D*a; z_)*Ic94w}q@>jn|SKhj`--~aQDhvHO2~M1m>f)iXy29VTYViX?nWjnqkVi?Rf^Eb@Z2>=iN6!m%##Y}a%dgNS_%Xa+rp{hrVZmj!NJ}<0 znw3l0W>P-%1;ANxdbUpRqubFXoG|2A>;x7^E#SCs-=@>)yOcoo4KG^+0a$-4*cS(RoAl@8a2CpsSf=Y z@`tlp5i$s;b_2AkZbdo8S-iY3+JlbVR7l{|w&8j*oe(IAY;Od5>U z)zy<{);e`vqFJH&b{dEVhHeCqSk>n_nonvA)$~A9nhB5OY~*?DX#ulj>dWocIVInV z=Vw#6WW8XhZvj*;URi}qD(Il|`yLl>AMFEQb1;6(Y63$tW1vNSkyEP~0dG1%aRq@w zXMmxaf{i2klM8!8%-w6Uf8bO%FXz-v0;+a+XTvx?euT`W6x+xVq^ZxNo@t|_y#)sU zgh9}?WdNF%Bc*-x(Zwct)4pIu1VmkW_1QM zaOprp7ryYUqRwAhkIr&#wkAZN;=+XsWkr!bIebOm{#J^QyJi3WG+vN_;$KA14+1)8 zHZ{m7dkvntU3a(=A)_ig+=JSr=D0Ixbf@dbd$Dhiq)veI-7dn=K}009fGFva$@W5m z23R)?gTBbt%Na@5faa$TsEsB3=QNa7zRKyrlLn$lgU5nxA{b3-u}lN#bOKSmvF3k7#@g>?CnSa1@U1$+s`bRC&g;g-@C?`S zi@?T;40o(o<2{0-OBx}?=5lUnP-VGeTF_nY?>tIpo>vZUU$!)_!J!6WbRr%=Y(&tb zFoJj&@UO`^05vsrg}mn61=}H5qtQ9s{Uaw|RSN_4NWEgsIaY3|!2Di8pdYe+S$!1O z@aE(ayekcSIP=VUeCQbRT$6w-_WAu4kEFh&RJ`|hgwGZ2-OVa6Ti9=X+)EU5$zSLL zJ=iOc>{fB)PUTTa4&!s7upWe)(&=v6%h-~7bK;izj!RxqgtsSmEK}{k?d*LQ8nxY~ zE(;w9dmJssk~wNKR+;lt3|NN5$-vU2J9zFA&U(atT(}#W~YwOkk<;jV2l^;-4vMTnckz3zrCg?gI1!^JqEkCjhu=rKx7;*RpN2MhNc*4Fv;n*i<=d~%-}rY*SNHuN3Su>sx^{e}divRN8b4!7jm z$Ia{*>`;`8JdW#htKb}z!60OA_v%;CBjw1wcJXwu+rw}6bqn`}Bg0W_JAX&;q=7@n zc5{U*V`#nEVxtO$vaLI;054u6yuzAIc6c|*3^~G1Q9sw6B>r9ZrEEF@CdgoMu8^Ff zATjma_YUz4@}`un*uu^KelAp7>9cCIG+lOLGM42s&X{;kv1?$bbE_Uy$qobp)&-{& zPt;YJob!UH0C#0d+x!^YZYJtqw6u>e(bMW}u%)?)@p*iGyLwO--mI(iZw&Uav=J^9 z6W{3*5EIX-uff99s-DW5NW1Om$<61PnCO}K*T{UUnJfvP-)k6rCD`!(R9J&~NM$&o zM!e7CT0?DI$M@><6k~kpAi^9nE)``_? zg=h0CQtn0M&j}ry`7kh(cuA7PuHv0nv|_qC-gM2UlAZ^Svhx=UT}?+dmof|Jcx=kq zJV)ndEOl!MOTPYl`@p~R9`(e6FOK2~I_41Ut2JwJE8^})M2rwMSVlOXe!(6fe@srs zF|3Vd-o?d?p8?)&B1o9$MwGpYu^ifkvHTSCftvh!ueX!8rr(hd9^5+bd6wo8(U66o z2<4T1webGW?=8H%Aehz?2+MOAdbyOX|2-vk)&UxzeZAjID=NyD2$^u^4SW zhroO4czcR%n^N=?FiwYwDuudL+aFYqjU-GdJmN2%h?^qpP7u9&QmH4sf%(Mh@x=T0 z@3(TO2dc=8e-3P*I`__;l-axbC|yT$x$5qm-cCQsao4T9*vHoCEh|)N&%aF`&85ZR z!Up}B>X>~7RRK92KQdT3zuqCuV#Oo}K63i^=${J3rSl%!J)P-Y=wrCeVs6-g4xV%y!K#~ zD1T#h|MXfxk+D)lM(nDMA21-8wmk5~7rab3ra z)0&E}wvOyBIp|80;w&5R+`K;VAWz(mEfTA*zVdEhE$_g!CHFj-7(F$^?hm~0`BB*# zXD9+(BeLdZS9&(oc^6r$ zbTTeh*%4ZZAqtdhnEm7LnJdi>5ZRTP1fZ&6-DhTvr@KtluiKS|iS{vtv=hBx0{iil2l_Wrj0 zsXBB`Xd=#b!6lx9yyCJJ&u}6~@cKqkU7OZ@j9$uo|fm?;mbVqK)?Fq(_9$78h@p|`YUn5su zj3jOxe8Jh{J;@!!zz$qzoVX5IWw^w9#pS%CpZC(ijA2j*?4V6ix>8Qz2^On%+wz@M zs8I7fL~vE{J(<1L;h_fe7$4j_q7%fd=S4O@!LcMZE8q!1SVg5rg-*ljUOGezl+H$a zx)N11e#Wvqnxq@oLvl)F;RJyk!{4vwN_5B z2}oXThw@OWO{jr9Ty`8fbuvewwM>NBtW}MHZ-*M0I^2?<#>pH+#$GQJw`LI;%;kE{ zVTuXq!YD4oi|oZ)0DRE7Jm*RNj*K>syS~X0QZG z9qf6IGUrM9+LQuNsyGB>6YtiKQ>k`=g+(MHwxPHOk?8cP-KPBF zq6W<6KZs?&JG;ANsT=!vc!i3Db?PG*h*q3OX%B0M4q=}I_N{niW#;qrvQaoYa{w_+ zl6IyG#9Y25U0XyZ5~);IUW~!T+e?~9W>#-xM=BR{YQjud-gH1RHn(OwT;yT4qTWUt zwqLN>?#)rOg3qHI7L}pV8{SIf6GQ56{X_9hf8rL9AWl_0xcCooB)>lp(-@R`8|JTX zVgGMH5cHfhR+&HbE`JvLOFk0%9~(fUy?xC8I?b;S@E;FY{HIhV{qs{5CxZ7c|Jo;l zN`TNX427Y8^4Y^0KWih-FW{K9dFu45CAHG;stNd;8Ni)^I`yJNC1LR)>>m)~`t9^D zKclF441_k6Za$!@sC=y^=l5`u37#Gr9gN%h>Cw^OeD95baPH~i;$OA+CIV?;MR5iG zGh8PDaNYXIe*@RKBDikTzk%zz0Ipm2zt6e+-SX>}{GWI|udmZ-__}EHM1LZ?1V-Z) za7@8GZ}Xw+IXObN{Qa}R$@^MjjiRG+tn5~qGiOq|)1y94> zKis2WHcSG|S7J%;h9N(FefDfp^aZ#_Wj~VCja}T87vCy^Et$yhUe3>a3KpV$w?B2HWi;{RtE%{qRj9k|i}`)3*-iYS zu9Ye-`-wSe;YCh%?mh?#XL>)WZu{-Nv3uOO4$<28R;B^Mba9I{Aa2O5>E?CeM0N5T zW<})n-!cZ{b3rumf=1;5YQoio& z5)bJb2cyOogq{In_2x_78PP4te+g>No(f@GAZ`4YH_6_NZnEJUhfx+VJBBWTFe2>L zr~>Es^$m(r&GF}->{!vtDDkai+ffS>pcdus6mxm|1|lWcyXQfuF$A78l}w$Gr%R!; zvu-nl;T?)e;0C9~abb`+9^l}3u@jjZ!g%vla^3)ucDusfcFyd-RJ3c23oK=d)w@W# z61o(5l9`IbfJs}P6BtJ&s#_|E2_Jn{cU6*leW!@KP(}Cm4YGSZ8MbU%=6jd2Wo9qo zxuXyuyfCXXWHJHTn1-idY61}_V+M2U?AUXSkeIu`$wwm6IFvkb6vfW%1$3bv*^`vj zB4*X8+grM-#gRl6Os9A?zY+~pQnZJ$?#S310K(w@!oZz?xA|*L3?K#>tEP>&-%inb zsG8?<8xV99^BK&Hg7t0_#qL@0V;8vqvjCzDA;Yk-?(!DEhlY@fs}Cx%XMTGQ9(-3N zM@ifEU_=tO&`0k>S#}Cdf1zY{^aufP^jFH-vnE8dqW*w zR9jzFcy-*zURZg8k5HB+3G^qyP>`>`ywoFiN zmc#J(BG4lpx+#54e(yrR>*-vIf1^Q0cvuMFdH{}E^?wBQa6Pgf@qwt<&M(-Y9Ei8U{P&WEO^N6-V%BWwmO1*~h+k`LY?O;&frqIkb4J0=o$Qjm=)TB}{jAwFk(Z$qeK z_LVCuSv`qfz6F@Q6o2Wr6}<@F;Ydo|=6&PJ|U~i@5k_VZfN-U!tb5ud+ zJ0YG8s*c4lELR0Yv~3Kg+dyy}7GPavF0Zbw-bHLckSyzc31rX2KMOW&qZ02MwLPbd z=3U$Q^6-=Rc+zKeTpHY66*dv>*BIHXQVPD@WJsUT=E*e;m&dE2cB4&u5=g6Cm2cW3Shi^cKJP48gu~1ub)*}*ce#hw<0MAeuGAxcmX4`Hw|?a53bNN`5Pd~;MZZG9PR zaA!&2lcWFQChy(_0WzR8HJRBYq7QDCNNfk~Y);K#LAor=MHVr0cg#WO(RRzYaHkNG z;VkmsQN_s(;2fB{3>30{HB)FqUS+sGqUlTbwq7CFHMplYpVmdD%-U7CD>s7 zs@M-WlTrXsI{(c6yIxY!gLMNlSX&PnY~0hQ)Bb~u7%_Vf zwnERtZ2pD@FPE+BrEH;4)k4a!`D0v?_pUu~GIXP_r1 z+Tp86W)x%09+qUYemz_>BCu?wUR;-GqWmH$M7p}Q8IV#lpt&TF>M36;v}Zm&@z9qQ3|*YHOtH;av0>_Q_w{sRy`n)Sx=Vv-HEfg)0{1N{h!UGyk zZW*{qaZwMig28;PwioJ06m0q)Qau#xMI$29?0&|sFReOIakCONUj;123%wWfd2bYl zqi^6pA6WpzGF1=^*oWP~%HSr1;f%^hRL~cRDtaLlU-iJ8+bJSrI`h*(Ub%*&V!r;w z`#8rTIC)x&veo5PAw!z_3Q!F)SLWIsL4ll*pmb{(Jk!QIF5ohn{Z(W(aKEkF;^@a3 zg5^izcP*nttk*;?>jm>*BV4c9YZJOEViYcZrz*#GAwfPvPnhrx!FfZi8vb< zaA$~R$Jy5kheTp8+nd29%RhyyB3=Ybz6{Z)Mjl47p4ot>+<7gUy0JO`XozPob0>Hm zR`C{nqSY8`Sv}cvc0Se3u?Cp@n~+L7sO~uRjeT-!S-P_)fJ`=_RyLxKnzz!wgN4TPQZC?(tbQZ z0qTE_xWmNZRIcl?3JT7%oXiUtiKp@)Fqa7(#a>=2rGs!6-G;1KGk>u!XRa18f5kq+ z<&YGWN>i!Vah&2nSXVho(nZeIR>GeEbo@5+)-$uYPq~7Jy8y@D2I#&;-&1j87V4X0 z-lI^Y9SUnHBsj~QJC`1$?e?0d9N2DK`*hWv4AvIlD=x4>1?7j^1r^}fs4KT5-3N^A zEolao&%qkS&a-3A`1VPyIkTyAGx}ZnBqw!T{&3(({a88`S!^+W*NSM`$%m=Gy{uV~ z_Xl>x$7gRb6jZ&v`ON(ha)!B^RC2pvp9a8M>9b*sOhPQ)8}^*adD94`#Z3NrRid~C zE?A}_|B{b2z&d)*AQ1_hgHwfAS9?}NR$t_t5Xn4nO}|zBT)ur@x6GbvkBb$l(Kjd0 z?9|}wJFD}bxAsDZcSQzZTASDJ7Z`I=%Jjf4c!w+zsIfaih<4V#I_cb(rwl@!tZ%>6 ztXZ>W1ou!Qr)WjjKsKkwVW&kr;CIsiKi#|xz=o~M&B_JoSk&8<=%7X9t2ThikSc?@ zSt!T$Blv2a8p+TzT=rd^cnr_6SAyjSKUC3hC1`YlhE>s&v-Z|iDWR40SD!_ni(K|^ znTz0WyChefTI@|;sIqGwGtZgkdFk(yu&gRYaW53sx1Jm5-(7r0sZ%txnnfEH|M{Cb z0Y5P-K&SIzN;8<{XN7y>x>Sx&z0Jh--4<&XS%!=2U}0@|$Aj;#U-Rjj=Rc7V_Ey@o zv^3P9fVI}zrldNZV2C~1xS|y?bJO1a@yEYb7yCSF$g;c7Enar^)81fMsiv?0IOgfo zk1pEU5{TChmbOh3+fC)VETyHTpRT*LFxmPqA4Ksf`p9+N`l&zvm*T^fNDbij4=?_g zw=SK&kNCYs$NxXR^8a|hW!$i5YX2LXDj#H174mOvsy>5F)zyDxQxyeW>g9iBQ&j-h zv+G~Eewn~G9`$crzvxro=5zU1u3zeK)SCPo*RTJ9m(#m3s^;TwBQbBWHG4TYn&AH9 z0Te@_f#vyYMB;$VRyE+gys~0tWi^J)2htoa-<>#n`oG-FXr-SBg)5)ABsrOGU)1NU znz?;}kK7YWMz#+5wew`ZY9?EnkByC$YTqAp#av zFY;m7{YzNuO%G}n68vqn+&Kj}o^~a@OyC#d;NZ|a9*dgt|GFw3OT*WU-F5iEBH2rN zlh9^YN_NDHH2Pf{(c*kozhJ1PZ$fG}9G{!NtmvdJF3(Cj`m?vDR$O#j`W6?rIQlDi zc$v(IufHl?!;Mk2K`ASj>B0ZAs6j95$_j}1=tWKMKQ_9bZ%B%n;rWTN)?g9zWKvt` z0J|^)52iHKE41~XJUMVt*?rr&GItO`UQno80>4T)@>QHLrV@M+KvWjoE$lj#3SBAn z4R?wm;jFrP2qHJZMCXu__r87cd&A0mZ8~81*~b;jUQ8x>L@kYaB(w%? zitM7^FqvxCqRM(N4}MhL=j=q3Nfmfsi1Vgu z^y+r2RK&M_m@S-;0?jGlC(qB8KeN>Zw^S4@SIf3yW!6t*=R>d7UiFnKodX>Q7PYAV zag+Ql17BQv#Of!AK6~?F3Cix6pBtT*^$wA40U%NX3@#z_qWh_9>zS79#zf@8b$wOtjvwD|&+&sW$+gvc^;X`I;3vkwU`t){p{s56AEpVHE za+CX+=6L-?KjGqZEho3I7Xb(KZk)Yl(I_}GJZqU?b=yBX(eQF8E`8$l=>vLHC()t7 zJZXzHGDQ<>2_{n#+cS;|SK3Ga8X^3-Qs}cGYy8@eYSCN&z-K^d+Hjdf+DU+47BYBa z?kk86XFj;t1~3}|#&+M!`v57(Zg(RgogVe=aYnTZ7w*qkKvW~|+Fda7(XxHPlH36j zh5Q-`uwKbtI}V(m)-RR7*)Y61^BubPz=#MduW!%TG%pcaEVFZiLa@S)RnRlH&A`)E z;67%71;fsUK~S7J^d*?76ze#*Io2mA?METN-zVQ)DDs-Fjnq6twK(rHg78Bj>1+u;{-~-fyDTpy1oK>=0Q$u!S9!cws zpAv%s+}t@lZa+Arx3p!z3=fb5q1v3fx$(&PoP+!K&(E_fjuxhwR)X)1bKjeDr@%tW zVe-67a+YoPDb^w9Pj5?+Z?Sq&vpK3DfdSWq;&%o2`OXEmbUnMK)nNwfG#UgKuE_IE zwEOnqR*!Q*yq2&m$*`77{72al4D z3z%;hoe33fC?DfG`jrkMfd@(ZCZ`>*UCvkN6o}TA2)^0=>O1DpFUWYwx9t5GLSi&B zBUqmxFVDZvN$JJXRv$8Y^U+k37_|dCdA@HNkf~L9!bh-p2 zer)5wXbTAX24I5bCsMp}-{=eQtVrslvdw?H#&8Jv94Yl!TNzYX9e|&MtAY=gkAMS` zifKrwT(2i{-J4V6LN1@9!h!TR@^BGEBA~3gw@C!(*F;AS)AeK0L8?3~ty#raYzglB zD9Bb+)Rog6Nen^dW`-PpY7cLP0BX`B$~Pn}B$`ghvQW7kYFZs+XXC*t9pYd{@}rE2 zC4v$X?H;jxs(aO$x{{7Y*+oX zbn`IR>ET=9rc~AObNHmp(c{)z4Sn;EwO4q_-TTY%S55oJ-hLto4mSsJ>xdO6Al5$?{TLqF0d3H8feOhW4Hwd-J&W9 zgw7Hgh~A#j#3f0a=Negwl$(PSqO%9_jjGJaLDvzmg7ny-$`O|9|H^IjK1EZz{i#6@1Tfx47L_Y~fF;-r0Vr-TCVYH7lmcS3>K1U=V)% z`^^J{Q$Heu{_&W9#F|$}MO{!nA=FBY<0zFwj(Rl+F$GfRSc!6FKfqVtvI` zqFh3ZO~uQ3+w#lpjtq3bQ)01lIB(*)w<+{O~T^&xfHU;tS#K4yNjjz4sa5c@&D#voM ze&Ul0kkkG49SqbNTe0grdPUtycYy6Y%Fh*=wL0ciq=byKwR=NL6&3c>(tt0_7;Wp|r>8t^;pZ|Ef%8WU~5= zjYUR!8K%M>n_XVRA#UvjTV&g=3=H22h_dz5d_fAF#<8RXN>T$AsMWV_2)o|H;5>=% zag-RME)MruPO$CcsK|I@0h0(gqIliGo?*$k=p5NN0YZV4CN3qs*qp1@`B;ZuLXW=I!=hD-WscGcGD_CydvPYM-QnrRL$4wU~tB z=>cx%+%io+jZ){%!os4$OAQ3RVq^yCVZCBfb)Cc4YQM@zZC{J(CmI=(-zGCX{0?Qg z*NlzIDgj7rq!Tk7;xRpRqGWK+bw|eOpwX-m{;F@EvV=StJL*#fiZs+4BEg2FCT8wU=1L&0bJ@f_e}j_E?9ERz0vZB zipgBT?R9u^!}-z6twByNV-07zIybPsx+9iyQ~d4T_KP~&6?di&HKmc@4kpep?i8uR zwVU1OE1n&;-ai3az?mwuwHOI9YYLTIWhra|PUGNJj=q7sx9WN^y&uSlFJp7LU|UGX zp0UpD34HK!lM8$CQQ|2a(=1foIi1Qf(iKinAjQtQ!yz@uC^J9ZP#ls76{j&WTx-#( zH_!8eiBzlY*1@gZV(YTF;&Goyg-+!1q~0WcEjdata$huM)Nj)OXZKH4!~|?Jsh46O zjB>uGC=QIn{UoOBGnwowD0O@K>wBIhQ9B~N$eu-?ogVVNY72L&OP)0h1w0A&G4HR2 z2F*JJv3L)xt-s~W#PjslW9{W^pYyC5S7e`YzqV!XGL4Ir@|uSx??3o#nm5-~t_pqq z_a!N2Or?uuI>Qqa`n5ZR-umV@3*z;n0@u`Ud~r9Z(ou^|L1p*O~H~CwF6`qY{IxV_U|YX=QaLipXgo!Te!Tmv#T2(6)( z_?28MySv;5_*fhIfPrG#1yh-K`$6@|m=hC8Rcd-Dia+wWO-$$w!N28$XORdn~(EnfT(B^EP3=?&n9oI5tfX=6SM1E#-bu z8prU+@+p1UiPH{Bw)#TM|~c=C=h0TBn8rf;TS+3$mh(w+YUEwfAIpB z@%;G-@CsT(y{}mVa+5?*H~-x*F0|-{wfHW6B6I1m?5o|9*0VXk8d`~W)VTJ}+8qB0ksVs68GZ83pHtJ9|4oM?2`|Kmqo9EJp`aVtL0}|@<>QX7>aWU%+F+Vx zP8=wuIH761)Y!V1argK<08l3G1C_tDo=exP_jf?4dsXfXF5Wucy0CGsJ9Wc;@fUwy ziOwrhYd8M9s7&Fspx=ux{9MK`74rS=?&Cv1*>M6eEx$g`X&AXoy;ji?)_MqbXJBEK z1m#lY#!Z`^+4+Z!u!YnpdvCwN*AegDWf!j#eelUbveTch1slX;6?pTXJgAi@{*Tj% z76@+Hx%Pb*A2mSLmIS>uokRolfbGCmv*I}SFctZ^1E0Ve@;fr@dfw!weTT6(uNcZ) z0i!QuuVl0UpfC|*6)mB#KyYb{k&de{@p?XzelpB!`achVM#^V znUJVcjiMbvK3Na|1S4cl33L=PRF7(K^3L|~dD-qB03wjA_aK06LkRpsu2iT71wBV3 za{VlV{t|@@1MK(;kzE91;v(GMpkYdOtKBVv4oo{A#1d=3?8O9;_No99^)1G@q4+>B z@18i@x0)bTn%Phn)VtvgB9tMZlA#1pnPJ)ygv7~4*Z~=fB<)(kPi6VP2I1WQdl2sS zc$E3#qWSY6;Y8*JK8n4&7Vb!Z&#{Vhp5AgSVJHf#vQP{tSi&SR!u`ux)_Cj=k8fSqk^rz#t5yg|KqwR; z;XPi4h6GId`Shnx_Y#0XSHs8;1xy=;Z+&{;9BzP zY8QJJB0S>5hY#PK-;3 zEhCvv>a%T6hEk$K$ZlTw9vPFL#{wRCY_j^q;5I6r?c=AUJ6Lngqj;q&U(Iby>-Bjm zztl2cjW;JV;0B!TpJdUd!&yy>d75cWoP4jzvR6LzXcb)`G`)5#VTh?z5*2mfSlYguWNyIYYZAgR4>q2nASaUx13B+~7fD<0XttRzPf?e*n zXBwl3Hk2=}&60{WYzJ{&{ygkJ=>rm<3@`}->wRM}4u!UcBT@mS&E|L+K}p1(GQodN zq(aDB&KQvXn|TToZ+3+>-`;vyvvUTPSR*V1xlsy&K#}v@5KzO?A+jMK(*k~?Q_nQQ z#{sYtF&Ciw1nzateONKP%?>uUQ3<6-+IvH!DeT(W4Ls(K6+xM&14qfxI-}&V!TZB` z^COvCbkfEz%W+508~Zm=A3mYJs6IkSbmbu7n*uTv; z0CcJ~OzA|d@=UWlD6)9^NuG1iBcJ`4NEuxCR=mfEm538O>?sZ&0` z8cd9$-r#vii9JE%d84Eg6a5hK z(GXOo%Tp1iRlBPMQ%C``x&iD>3bKkteutsO+C)sCsjd=7dV^saxCxrq#`+0ZG`>Z0 zX2#4O)g$UQGMs{UB#Yuk`$RJ}zl@pJ4@+7Q*2idUnrs>~=rJ%DnlmC;*fyviEifur zry1ekQ_7L!`gb&~pn~S|(d*Dbz=Vqau;7C42PY?u?`1f@Os=-f0-MQdt4@k(lb(QY zruL;4fdA(Ev|pG55-LA%dUa-{jjqzXn!xZu0`hV)x>IO_??dsLJe06pE=9ajd_pWo zD9fpuaM1>yzQmX?m|uiWrSIqup-uK2u5I-m@(f14R1PuxBSs)tS zVdYM@=%+;e6)T!bI#ygunz=}p905&!A2koh?g~*W(|l6^W)D*Df|K-}c~yuXZ!1bs zzp54x?`nzhC_ET{?i&n&oMko|vv#f$ahd!=^j#5TN0n|Hdif;gUWOUcY9nC#tCAHF zi}$tG1#_s2S0~lqy8*ao)zMON^Iatk0Y7=`wm~WGMRF6tooj?D@TT#LxT)1AIgfzs z0GaZ}pNN!+f76o+XN}2>H!YvWN$PnsXXZDw7CL0*muYx5iIyy?|CUxoXw!0lqea?l z<=TZ42iOnDst;LY0*lKCGYd2wL&VT!U?NLe^v0TL`34f*3ISZ#iisyGuoRe?cEL$W z*{O0S7qnCP;KX^@`Cj+TNLxOH`c5gR$dNo9_<&RfzF>^pCn&q}iJD+gSp-wD8sJqi zW zh2A7WfbE=FcZnxfB^k*B##O$Vb!hWEOEe}!K#nspxoS}Ci%9+5a5lp;A_hw7>qJv- zG8mGAZlpcUbjXjhE!a6>ly0Ch>`2L;yHr0pqp;e)@eze!d8Pteer-UaTI168bm8~N zzUvSC?#Dl`$U={1_|Rd&B8@4579;!M{{118a4WOM+^flZ#p;Wqnz%7+0a5{gV6DXW zw)$0787jDJW{l)y>m(CTk8kTVYw86Lh*2t-cP`kYLLb1JTKDB8CX|9Wr_>r8g%qe+ zzpKb&`s-__$|jE}qdSh_SXUNpNeIZbl58r-DxRB2ft`k*(CNJz*;i2WJ7%kkASblI z$pHBERtHcaG~W!MsYpW!1RW8Sz9pur(&Q1HKyx;+1FFG~(yf2L^I3~i^52oc%VtGB z$coSKl>3n6AiHK}U;o_+t;||H$Ig^jj^pd-%_7gW8i;Slr#JVU+r?;oxgetWTS@vw)#QE;&3%ZA9Cz_5M=h2@aAqtgozJ*0*2*348%mt~LPDH`R?IIkT01H_w zM)9wAVc5m@EWK`Vu$95$SWG;}#=z)+fqjb?dcCaFElGc=sBUFZa` zS&c%*GnDOjD+qKCkE^n1+%<@!&1NU(F0Yg*1u$k+-*dH}H;K(nTJ60oG9t; zA9TtqdBL4p8eX}075`(s-HicUNG;vwmua(*qc`Xcnq?r=+AN?>Y4pHz@#nvBA+;LN zLXzPCx{@dcG-#v)l!a+Ja8s z%m2c`E6N2u@_(OmxvTj5cmE@==kv|}ru+7!XdH9;CTXacSzD*VGey;OdLE*&R7gcy2I1=F5?G@x^;(Y5|+m3y*2*-``4bBqW( zRbnr28Plh2)r?slJM|udRiBaFwQ2D^c0OFG>>Bzg%=4VbmB9}`kRSp11th3z+o9QI z1+Yvku%(?JdlbAlGhhxWNqa>qnmBOhRX#l0Rj?bg z_~(DTm&dB?`)>AC*ZtVbggCrGInfMqEhJ+Tjq#Lr9lOsV)B4D1q;=~XD~6;LWaABV zUrQL6!TihwIux$Vw2$*Ii6wr|gRGT{Y=rAlzKi}2Vf}NvJ97!6S+siLJlViy1LX1+ z(236)pc}#iCUSaP2Y-s!DzipWa}I;6wpj>`HvxK=Q=g7&Pe7CQrWuJ>HoD{FZCX)#9S zx3?O=HLN~VqLpnGj*L(ZTY%bxlKf|1wOciC0v- z`op=v)aOr+9~}yvrOst33sTB8@ad&h*rw@^djk0h`8%nOTD!BZaCEp`70+~!^ivDf zJaT5suejSkue2dI#B1}cV_T^2n6spy1=4h3ZQLgxW&-s0RH%C&d5(e?67blnke57o zlsU1avuZiqTL<$js5*y;f-PioW9UbtP(2Ja)=~4O^ccS_2g{Vz2;hj6J3<~xl`ex2 zO3`Pt?O^RZgVODBdC0Xqasgk9Q`w4=f`H@H);n#5Y}!SEV!~sPc*zcwR)__Km~zO! zN8iApt&wGy3JG6@bXdro2pAJB$q-7@kS*N}=UqOvYz`{mYEWA`ZeACEZ?Fq>{2=pbLpV{SJupOu;nvL_S}=-601fgz zC=TjXd2$L^Y8Hg0pBahvb_MY zNBgR8ecEgoV6LX4J99p60ADD3+fOarBER;IddEu^OZ+vn`T=v6rbBQrQLeEp$84Fny%@BoX!^ri+A$^NophFCpm|db-A(GUGxrxjQ>W^HP;?vD&p;P?}@|f*pszf7Fr9)DvTolH0pYkZqV@1`yntl!`$< zxYDWM|Nk86#YUp<;!1PMKEplJ4E_>T-)v#6pxQ0Ua^kure>vZb2pU?! z9m4X6P@@r$gV35&-~yEmCkN{tlBvbX$6U(mJ~$HE((&2uX9gUu~E$)}Zlq+2rXOy{yyK3sYQ1YHw) zE4QF?=MXK(aESdev2XCW>qL|@%4?#0GB!l|9i#;0oYO=Kv%E`6rLnA3Qw6P*$I8(} zst=B04y58%0Sr%u8F3>nz(O7g59hE-xLZVPf#G*VMYUlFcyh#LV)hr}LGz6QIgyBS zIF7`wN-01#A)-A#47@gkLL!&ugijaJG*!*|dwqX0BfC4Ltou7&$&61OSKJONF00r2 zI5N=L!OB#i4j`MvOJVIE!B5V2bzFIu zUF#;J@DyRr9k|*@b+qLyTXw9zqc(m)$OENzn%BiquT)t_CCnXBu;$b8C1SFBh)im; zeBj6H`!?i3nGHEC*?zyFnYVq-cePGJn`ml+h~VzsrM?|RTB>w;WnWL7akQt?0r6KY zY>YZG|4+g*G?ABln&IFIH;m?RSrO_ZpMq5`$HgRUR&DC{eGn{KF_Hs85Ax)iLFfot zcjc;)E4#<4w*tcx<-h{@Y>lC{m&WLL>j>y-LxQBue4lwIN&8~d*6}qMd;u4;G=?<- z`-aygN~uOC69XaL>{LGD1%l`@d7~hw5-v&x!JnWyyUy68E}+ovFO<{-%*@rBsM zQ}vJV3)MK@_jQxD!KIl~ciBC$(0Ov3r^CKADIw)cmRyNQYQJ+YfHMKWak3e~#bG4b88Pmun(6a2xn&e_&kmSY007`F;T;@4K zVM&ZqX?bDtUVK3?ZjgB&$qt{431#I`|HxSHXzvlrH2FY5!q(ut;s{QSM5|gMWDN&^ zM{Kt`RXq^%o|5_9L4Iaq{)4|`TnTl(ha$Fy-nVRY#c8r@z=^;CuO#l*Jsi&$v@_o< z1qwxJ&Dpuy(mh8n!glpO{mocJTY0JPi`=!o{=a+6rDa|e6O^qC8zO(0L|-{2RdIl1 z_7x#B0Z(8ekOk1pDoQRDPm#zlczN5FPy;YM&of61;7`eARVZ?l$2KwQYxK2UZ^-jN zachSC!WhlN7=m%Hx7|cV69ML6ZSDfvzA=KWHpdmU%)PXI)3gaNMrk`lS-|@X=fC$! zYAKSWG-t6pk^vaZk8EJpR|prOga@@bim1#mk=TU6L+G7VZqMfI+nFJnWXV(?1K%9X z(-lFlVR`}gT<#}f``&Ls*X!TE2J=e0-B$NZj$I`toW7$L#F*Xuh=HV5yl)II5_`qt zfy1k5-eyzM{W&j=@iFO^?qkDBHwcNw&(7iV!>qZivMcS{X@SDQv$2DH)h{pDB{v+C z5iLhZW)8dcyo}C6nuA)fi%TG<9}92}<&@Z@zmJ~z(j_08;XR2Z>ZJ*R#NQO2YmO_4 zbAT5nwH#NSnHiYFJitwbb@V)bCenF8L`BHsg@R+ox2K;Os}2;u$LUUg-c6 zMboKX@F#pf`;?BGX#uKPHM4ek(++PRu&3b>G9USoksx(%lL^#ZkW?M>%1`w1svV^) zIU9POFZyNw(M~W)l^`dvlfQ72GAv{+sk-)~!SAnMF8<`L4<3jbmAg1=e_D8Z({BPf zNZBs>XTLnX7axoMo;@9*+cQ)Ai#QSI0PThyo$0Hs&d=K&^jz*0K5#NA?b!b!Z1HKl z&oC{^-+6d;76=KxnF=Dy_h8KkWXsxL?f!FNMwP5o&$2M(O9Fxe?gGP5L}@!GZ*mC7 zzJ2QF&YepQ`sk(&Em9Jgh2%z*uleI^`o&&aM&=_0-9#dc{^IIZvo1>`xFqGU1{}o} z`O{18^FQl<^glKn05x1G*(>n>_SJlTs=*2vX3#Z3FEaDAt_5eeSwDv6XlS zgv|z^g~LNFtLS)Ea`|sP9E!X;al3ts+A=zhR2ZC?gGn!g=5Y#i`^L!e8b}Nx%34jtmabERAA5 zh392uZv#JM6+xtL`CDFUGu*yvQ8vHGLG%GX1++xhTE@i-@%wg1KYdhyX^5AV=C3W6 znFyaT`is5&GW!k9$}(i@dQ@FxA*ccEcn2(Gc5dqYGQ2EW8|4DLoy|3UZxVlg^r%Nj zemB0l^6PTf;xQiHiy52vrXR==`xm<99f$UKb<*tFYr=EE|5oX;(3RpRxDdW`^jj7- zffA(T0&dpi@rNKZlK^iUY43Nc5JF>g_+n-1;To}8zb-HeUZ7s^>-nIR8#;;PpXxLd zWV{P*-t~~ZW`OMZx;a6A0S$gdo1-E?edS(gkx*y z;mbW(2aJx2nPjz$mw`~heP5vgte@fgGQ6+tlGU7)U#)(|(g}7^(!C!R6^Va-KPQk_ zvd)X{FLbg0KHdrGWa)@pvu@wMeX)wG0{~{I5gWe^EoQP}`Ms8^NboKawflG-5Ro^? zmj&o9T3H5Yc4b*|iDr(M#b@(HB~DRrRoE`><^W>1-t?bdMP#eC=4z3_13=KU{SD+8 zKZY`=^NsoR?QF|_6>fKy%GHU@rnupo@;jkQ=dGRy#gT?@>@UB_zGJR&kJG2mT?hOH zC9=;Su|Mp*>>Y%G@mqFDeD1<@PD-AZ_%}|GwUPOY98_2rYa%RHGwyPrq=21qCa@^- z-&FoICDQX3r#=eznwyF}R|~A_cDl=$zkp#nxIl@ifI_TD?H$+UYHR>Tq&b-)5xu!15@kzUmq8&&BY2LT~8L3+0r1PeVh z3t)f{YUsr>fV3bb0TPN*qJ-W%XFov1dB=Bt-ydgvYn^q@Uq+HVx%<8MwXc0`uJN@G z+zKtjA4{vLskPL80+}5g!f^sBQ%|raDgRJG*UpS?=h>Vwsi7b&;rgeObUO=osXQ+k zyQ{wKwN_zOW)pT=ujnsq^LFmfY1xbN;RnvY=^~?fxP+}*=9Byy+D)6a$&Mm zj_R42ks2&99?n#PXd@FvO1$Q#oA|S+UqSfy8gHOx1wH#@z@fpp9a{Qdg4GNm+b=l& zn8%36m>MEkHC}coAbXXz1BiCr+nxB{9)GMxqkRro-;)7rrQ|eR6Kb^%eENVgO;(AWo?tE-=iaGUl^r@#msbZBtXoi*wbEJ50bpdpfZtE1Qn!DA>$ zAyM!HBFtfy4E86>JZeb8pzl>5Y*$)R9il&!J9@o-aF4fkVtf8+PopErwimks1JxI9 zc(%znXau^?naS>39k}_IY;oVWNTHfXrIm+asC~_&7@1`Q$ORM3|Pdt5@3GE}0 zp=?*N#rJ3WDN<59QfT{zr6d9O!5tO zA08->7q{-aO>Z}5>A6L9$A);bt3v8$0};Ig0c;dq%j$sm8ZRvwp(yUg*e4ll!)0Z(A+r@4dNl_MLBS zo4!|RwoD9MYBL|0w$XA<-C4y(m55acDj#$4Dk&HF$04?Om2S(Iw_DicFgSOEd&vYk zz*Zxhj%Z2&OQ!-RsAv3g!*GG2DrV|j0!bsY8lA}dm#FdDpax*u^g(G42L)lMTYvFDKe(}f0)18E zo~JX2I(0=9#69YTVhy^+DS9PZKrwW*^IyYj##Jtwrv=oR-i1_Wp22Ycv4vv%=j(iG zq{HBtE&TT4lgeSev?GChQ#*98DJ8zTP`=ZUm-o!%WnTU(2bC@bpU!8+2Fh4mHao1? zG2k$lM;r(%l`yZCaEJ<{MT`_0;zx%0COlinbAW{q8JU(wfpb^C(Yu|`m9>b#JpkK ze)%6SjFUILEsmsjZn=Q`Y0ZwZz;YBjQM|)Xmm_@4L~hV`>u8R9f+E{B;JJS4@*HqC zVmYM7kFliQdGVbF$-#+1S+*`8c2D=lk3C6RJyT`tm4469qJlq5-+*lbxU>m)F1zB@ zU2s$FQ8nt@UG*uumVDs;o-5tngg;N3xJ~4>86fpv$Ip(=NY`<2fgzCjeiA6NZjr6x zSM5AbR*gmw)Q`3~k`3TEhf@`wKN2~RbihsbOcQL1B7M7eYeha*O_x^HH@SMhP!h$y zw25=59wnnbV?=D#WWrM<5AAJiB|+kZ@Sur+CBm z?8({m^%{}lOe&wBqWpM$la5E&%>uhU`HS@}ifM=eAt}9DGCguWS8u;SPUmyo)w0yS zN5_+oPT8LpBX~5u)GH-DF)aE0$F%%-5n}+bM&1M3(yYmAZMgP`o=MV8ocHS#&AZg} zGDV%Tw-axRx1LkmmC2AFIG;m9H!_bGB!(OW5*z zHC0TvzStB>mVn04Ki14QCMN1jN)zDhi{m4t=c~LH7un-X;JLQuS0g6LyT7>aD83rC zyz(M{+t%(>qJjVWQe6C@?o6Lm&W1*-OL>;o=($Y!_**39F{uQ>doK>HtXoE_gqWb+ zhuRNv99(Y8$+aZ`Tt=`GHCs~j$v?USoqxFr2Fk`< zWx4V4MNE(+0N1IYw+j<`F}s`nf6=a=2VU|xjA0VKl`)3D7(3Y5LdL6C_xoV2 z7I*WnKLQQ*t=_o7PKuuB{Hw`YIUY7^%lk+f^X_K->AYZ!`%1TC(qT1JPxpXB{%?<4 zvvXVfmeBHh|Fuzz-~N^aE=hW!+w$zMwB_eB%ct09EpzsoxU>WR`iso}=MNdXTsyz@ zkGT{&>I=)VP%&E8Q+1{>bY;AKT@MM}`1u{&5gWY*hp;&w`1Gaz5mgNEW-GVxt zA9>2+3Wu1D{(b)#y`Ls)n$-mqV`kjw5_pJ&WhZyGV(SD zkOTSCP3`?(aI3ODl;y5WbxlC=6+zv!XlDfpntL04!qb+q^12Dd9u6};{=YiqR)%3U zQvvK_cjqDAe_t2fxp2lLzmVGh?;ms9m9oxeK)`T$ICJIOAw`uBG)z>&M6Gqhgsz@( z{jOl7yA#B21=zz5{B4CY8WkhV#A_$jk)VZ)0{crQPe2y9HhF=9UPF(&z+vlm^ngmXH;Lm_ zUO!g^a%U%V_m}0Qdrghu zy<2FZTDlgo!-W$Cc$$!)dsD?d`?9MPo|lssc_P(i$FM3vrolSh5_8@9tl9y9iddz* zTW1QfQbDAwk!Rml@5!^SKtV328&2fXdTDDJ>*#OO;&&4k--V)EC5sE^gFs4$zf`cT zCta_LCb!^m)vmh{HlrN55_hOaa zceCbn*Kwn%OH&PaFO6s}_uka8A`7|sp@0fV*wUGYcoR8h7z%qIeauhLo;l#|iI9NF z7I(#(uDwVDj&*Q=XRnDVROB$NeRGl6l-IG& zY`DZkikN{EG7V*Lz=z32^O+uC@9eFgk^wDHk(h$Y z1A>F?rUA(cJ8}my=lUwv?$TG?3Fz6hq1V?JGXh3J+LqYZ1l#^n_AX9j$q9ne!AJ!V z@U^n?zTDeg4hlf}fRsc$r$?fPz(Ws2>XXlcDi0smZ2S5OPIS^`4hLMFQ6YN@G&;n@ zUn0(rORjJ{s820y9zs#L&gOmgWe2)|(qZ3sh=0Pd z{sNomVt)E3QMsmXV3rARP1oGFTovJPVKO*X7LGg_&%-rJM<-h+3bSaLzEMUA=4#(D z+k{RJfGL$bgDz1;bM2)C}<))3Wrb)$a&;HnnHM!^` ztJw@S7wI9Z?6;b7erHn_e`$!P8b!~K#-l@Lp4fW4ZpDN2&yB4Wz+5pH_^c>Z@P6a* zdNMxy>m#=|Ptf@goaxWAm4NzN?gXM|;8XF^vXG5l!!M#o^Fw4=i)p$@rCpJu^8nBo z;=e;$BRVBYH1EXN&2OuJjJ9viQM>uIyMpiTjGByy&QJbrdDrJE$@@^OwLSu27WR46 zro)}mkluvW=+P>gZlL*@LzQ0v7)d=A9<|@XNx5eIkPN832B)YO!CRs(#=XrDBCVF} z;XR)-m@TlpunF6AYiXFa+3w-G==lsyu`Prn`AR8aKG|90uoTj)z(JLfYvM-N#Py8H z47jT30B^@~%=%2H`aUsha1xSsd<5o?D-pd$rl|L6d1r(}f}5HWMO>tTfaO!#7N(kI zfjW)}P9VbW*wx_BprM8P(rz?A95U@>L~BkTIqH_uerpryQlmOA57j0vQu*z4Gr5q! zS1?-ZnEPG5H*Px9;)HiYqM^v+kBLTeJ;U#J6{ZvtNV@1M`+@F?O*tXMBagK5U%83# zqtC{_66*tt&$S>b$E#{YeJrlZM$z%miqTfAzq8RDFH^CraPY2lz6fMJi`#P}Qw z%<!zrQoE@FNFoV#ha z_v7jVqPWbq{Ai0DOfW6SyUt83E-F%b%aq{m(};1ZcR@=erFdbvt*x;Ss@>jW^=)vdt&i_n2`CQ=IC)q|m;_JGFAdwSopXuCw*wT9-km zakpENULZ1GmUsJADWViBwJU2e7B_^g?cx#<#dz~D1;C2hkeHMmdp##w zw2T4_-c#@Ng*8i3MChx{+rT!wet{2Unq8v?MKvvU2UK|tf&s-Rr(!J1SvBL21h#lD%q?D#XQ_CP zuH!QF#O^sI(WW=|a#5_pRX5L!npIKM&+;TGKadL7eP5@)0K<@#{3OEhc6z_9?k%di zQ0c)sJKK!U=Nx4^?%=THN*XS=hN)YJkSba0mC|8WgJEN*dC;WVu&4Wt`~M={K60Ha z`2@@K;ocu3wDQ7u`vyNflNOd}j{qd<0-C`p)+Sm>|kEI10qve~FnFnWM!+-HqP5vn6%r@z|B*pNPf2{t$y~s6$ zOJ*#jY}LQIs_e(XZA`U~jpX@pYyIklfgrfO(+byo{?%{v+u;i-p1=S4StbhYQ10Sb z+f3_33F)HLvg2d?5rD6~Lm@T4Y-NqW(?KUN^ZEqcm6u)KZ*H)J4ZI(2e!A3Kb}SPc zk20Sc&?vDV#B7$v5c%vOLt}7$b`MH)whb^0pqSl&3AEVl@bg{%auCxC9+iDTw5~Tl zP1=uB^;-m7C{pH$<||MARsT0%0tfx5!0ulf^~=rPFCXK8IOt713}|O%;r;js^5Qlt zIOvZmN`Cc2E6xJ6Y*m&6!3~1XOFj9~=AT~_$3S;)e@#2_t0`Ui0ZAU1+z4FMFQ?$g z4+tFv4h?xlef3J2We^;D0f*wVT(j@tMG6QD}(y?^_sg;Y~i4Don1pzJp z(j5G>-(_eWd%>VG2qiOG^3NB({cHd~wuziL_}@Q+H25u`1b&7t@k>|Oxm(3R$kgeF zgbjNrP8ft(pnh@yQrf{lTnd{ub%06Hm0k73zKVK3|szdHk-_QJZUzzjPd& zg*Xpza-uuDx^G$`dAH~?DX2Y=_HNzoKnT9)eafyH93m0$+aLRqZ~S#9}*xaAEcqF6U$~mX8_Ybt(M}qJK5zD zh}EAKT_NAgd?}zp6T%`!O^NyffkItnKxT#^Um;I=z?FC$4)tS@yKUwQY*h4vao?>T zF-e4GOGgUg7e_!OL}WkWsTn~yH*eVAIsY{kl6Sh=Z*NVeyt(9rKpY|Z_7^>68%gBG zb+sx9Xfi_Yx=t>DCr%C z(X*a=CGVdKu0XIlsk_Jm`&@agZ8EVZ5pOt96z4hg*oY5-UC^td6Z+s-A=9Vh<>s)h zk0s*O-OZD7$g+TVE!_uI6IsssOd(7oUrMqBO!bsd@YYV zO3Zd(`EvvSjPyNDjaSD!()tjr05~Vw0edlfj?)@j(~L@994p?XZR|UJ_p$!{@nBhH z$?tDYI`-6CJ~jF4ZH_<=Z6v4MJVT<|Sf3I=lVBVX#Ys$1Na^gE<$LBE=jzoqWc`h6 zmN5R?yDrp>0Hq-?dbX2CJ+k8|#wzV1i!|G)2h1&gbq$QncY9!u z2O~%c06GhAUmDzcD^@gBWlEHp;6t`6x=h4tHeycrWmYOn=VrEY5w*kdtYQJ)FwXVm zpEa}$GBv+&pHgt_xv`m=4EkhSOtSfy8qiio$sKRqKENo%Ro()c59 zRoKJm&fp|Bpr>K*U#=U;8Alz(jNj&(jp+p>Ff8o80P>&R#CFsR=*Hr9LetDM*FUx`QAFMAjeU0di`GY35E7ZAqk^v7rapc z9icalJhkC{!gk6V7Hh(4+x{^q?v*kf|Ccl^n0O^2Us%MoTE-WM60N#3%4L{fdFj=o z03;0eWPq$KiKt7})w?x#=Y1OhLzd!ELuPq*cj{gb?yGf9HmQ~)ADZx-$D|&~s2Z!3 zu?J5g5MsG`>l!T9I7W6EN3GZ}3`^x^CgQeF53?_Mtl#w70S3`vNp2myCsx0)j5*Z; zT<@)m5Zo2V>{d5=!_(sp!63&#REYbmv?0XqxP}KR`^r#QvFJ;qGq{Y{U|q}LLHxkw z(RpPf6S^l|$0$MyzNl=jQj z1gi?ZG}66AW{y6gaCGL~R<9HqXUVD4X6U=u>7$>DW?BX;joa@0h5Dq%g7I+yJ)r?? zwr3yONG~9$Pq@YDefga%3v^QIIb3jmqBU%4M}3qj+tau~CuwcCDo0ns`pT@P<(Im?n|HY?NBHj1gh7 z&(@p5R$@LwJ#?eOJR4@hS}tlimbr3!tY&ICE@U1n(&BD-ZYkV&uAunRah!U*pOT0n zQ}dk*7N}K=@J9-t_2)l!;SQ)KXtH_9E~2Q`y1Y}vt@66lid`mXbX=8nq?Qfjzf5=|;>k)Q4-ShHqi5$-sn_OEXa9~7mO%8?}}&akP9&K(|9 zP^B`*p$-aX+P<&Mpzg{sZ`N}V%q)!RvoGqDe3O=unW;HTm}roU^UL(?t?~>U${MF= zMRT0(f7s$g!O>K|3paeYp_CHws7>*=7PlgAK*$p6RN_r3r1|xdCA}2Md1>2T_jMz^ zw|SymULBTJakQ!X8uhfmGf#hFoF438C1x{=nOiU1t+S;E#WBr#@PyY*Gw1qzn&}}HrZe9ai$zOS|N$W<|_@pczW!BA+HW5c;iRz zd^F2dcd6-G1wn)3hcSieN~CX!V`d4W7`Uk1=;?ErdtPUn;%e3T%vfr;^Q&fbMsB{z zn$M@Sp}nIVY!jY=LZorj#7-Bp=}v%YtS~fep^fgiMPH(;%<1dy+0nEdBl~=+9u6lH zYUPQ~8X~5Rct>61!_AF1nD>u(T#gB=%`U(zVk0cciYFp2k?u5v9h`#J;Ly|DK2@j6 z07?{dciQ`nJ^gH+mh5>Y5xcspvg;+3NhfSb`)s((qi6-{((wuTjvKotv$%NXt3pK5 z28>Inl+=QM2C8d30fFf+MF08wqN!!9$`q#QSi09a>7_dFJZt5VRTa$`ovabibxI2I z#Je>l_SC20U8~ULQ?zI!xJGj&TkPNGn|ap69Xv(1Gm~r{CjbK>1PK>7S~dfa5|`W+ z<|v=;t=7_%t1{CVK9NSS_K%Jp?>KzTa1n3$q@IT0Efy?J$ZhoenDu!Fh5b=>`4)Y| z5jT>oa!TYl1R^q(zhlsmyx$eEk(MN8FVrr8ELx%puY96%wkLzxk$F&TE>;Fm>M_?i zx>BYkuR-0gxTpEXPUcrRL_lPNrwvKp3i=3?o(>6%u$_|hHc@mjVO^3Adc0mu1=nJ} zdFszIqy!~}>^7IKh@#mpL9&ROaL_Q1+|;MsC@X2!ZM3NJU29G{PO9pa)Vd%`*tF;H zU_Or;>X|Rji^+xkXmhg!5*Wi->-1m_^l^bojyCV})RZM+&CAJ${Ka1-lfxFG0AX`v zX#s0A&(icsJpxO2y?LRWu-eXD&%G}bEfo5wB*1I*b>{R5bO85ZdSa$Ot_cye=0jkq zIf>!2L(%EzGx>46;-^W#yU=8P9&6gunbZ)z&G}ST(p+qg&A=w=xKbzKjCnIO}f^1-sP@WU1*r(;bR97I!}{c39#-JFFWq zssY_rlxgbZY2H?ZMbu>V-J0QLflv5Uu&Ha4n;xv$3mj=soN&=Vf30mixezY?C^cdk zEfJbvzT%m^2t?tWeMus|?rrZABUz2xj_J%XBEk%piFrflnI@T^41GrDegX@81%6ZY zr5xGyUWoCn+rO1@;+yk-E7PsfDb-=X_&-?)H7EdkB2^py9h_pmw|{@}UZ!vZ#&cJe z|IdGchpo2ZQ6IbbQ=9&Awy*L%fUtFZ%yu!x>z^M%{&Mq-u?LUjO2g!jEu&DUPp>?_ zc*C}`qBfD`C&`P!lk>jtvaeZsq!8~~ZeYjr5-Tn;0z-dmuEc7!qt4Zu#9#M@G1lyX zu)$UJMgJWMlBWR@6q(*2{OjH@hJ4)-7|87*PgVd7#ykJfveh;;tFiw92|A59qkoy2 z{0{@E3^1jHp3F~}2cv5Y0}Cl))$eiu4@+2wL1>#zFy zV_6(hGoCHmL%7Ts!Ca$u$Ws@DRQ-W@U(TP&Ii@e~?&JlE!wJ-KH;ScqZELR{Q7~S$ z^t9sZJ1)3Lfroq&NLruW9#t;^I>;g@*5Ba*3UTH2Shb2cjE!V(X+d{5`d)#`UdCB) z?;v#QQMe~#sjS%^3giq9xmLNHb!Dc)D$sp-WaAV1wp^7%Rl$wU<{M9HoGIk3H@m)u59mBz7ojr<-FX7blG@2it5tw z#PszOQC_5Cq$?!WRsf!%?lqnsJ?3@~sX;;~L|WlWLt9)VCH!3*kksN|AX)jGZ1^?T+;#2ycHp`O0{7Tcd#3lM`Tafi7jmY$F;bqPIjsu_ zm7s7mR}H2bL%^c84rU`Rq%Kk#EaD?Yjh}*LRs{Fm7Sp>sG}#Ab ztL~w^*!q>Dq;sqQ+v>{h@IQ`V8!Z2>Gp;$m?A5gZJrqe@;g~C zTJLV793WLcWLD(r+AG14<++T5zT33f*#&*6`<>Am_vJ(H=hH+efSJ(v=VN;iLJ4YH zn4ge2G>LFm7SWV^u}}gGPEc2{UNYGL3P_Ua^s2{twgrv|eV{_GZJIQUIR731D)c(f zw6@U*Pd}&ZgCDW_cjUB8t?>&F05-G0?*x$`5)jphgD42g9gAz z=^?68RQq$ji1(|OQm`gj3;XuiSnCBfuo6j8{vZxgWj6-53u)je40n{ z&B_sC%*>@AE8crR-RXVae#Ey0xXaV_AR`z|1H!|R8KhL10ED-7Tmj3ayLz{;;W`RA zC3br?6Rv?Q%9K3-Tcggpo`qQqJhCu)Uac>}gpj4}(JdT}J>XvL3eqdbz#Tyo&9KQz znbx|!Bw!T{15YNA55ynGW(&tN@j>v^lxvnPcS;WBK-AZx3)~t$fT2|AB5tKpt(ONf znGdoMm=*8e&*3OHXf2P}ERjD{X*1p|5kxY$dQJMwd6foL|( zN0u_uE(_UZ?@ep1q#YrPO!QhN;xviJg4#IH{dpeMU!S>mBaTUQIzpw$yj6e?7TmZ8 z;bJ)i5(h4y->V@<c|dy6VhRs`Ph1_>Tz z9T>t2&;wRYtPt+kzumYl9sqsvUn0yg$8_CbL`7?K-xR^XG0Y#oQU>;x+Ceh261o|LZB^wix%tXe$DotG>?YbK|<)A3`O*+6?K zI*RZf`Vw8xa)g9{aHi|!V)Ru#9(ktTo*17eXfx8q_^yR4l6pxB7)`Sr9NMJw0&xfFZiY zF%ffk?37Z%3)!OLj%-s&nH~-)%9reNRw~rrmPHEQFa6R^)_bbgJikdGnn(&35+&0i z!eYkqctk=eg{r^capKT{KfScx^Z^1dGOEnJFOe#zPE#oK+N&@Ect5^dCgoYLVUu_;fA?k9|(YUjucG?Z0P zXr(W%SK~pZt_t<@pPAKd z7RDSG6dra^+*{E$Qg#X0-<(FRF_qBH(U@esfr{ly5ux$pcZwjXy@B#}X zatmq!&v=V7nD?VBS%q+bgm*!1;k@^>meC{-X}niW-%~Qw zZ^i58;t4PTq#H*9mE^;{Fg|hzt|u7Q*%x&SKXVrzFjuN;)h&5C;XsUyy&~4og59Ge z98+VaEsY!7-5M8CdFG^b^XT+KQL}fH`*!@Yk;UBoq&Om|sS3`IXu|P_#W;htndtqNNSKOq)@907 zHxjw3Js%o9E*hZzYsD#gE2^r&k zW=$4%q%H8W%8h}m>|<~!+jP(5Kl-N{#oigzsqmV!Z5Q*kxK(y%0To?qZ+o~CZJVP- zF(Qso&2zS3`K+zyJXgm!DsrG_8X>sWVGHPxtnfW5+mxROzh|7Acrq$jZ3xr078l*1 zj*UMk$4?=Q%hjAPYa1Z>W^DHlJ*q5?$ams^ zF=^fH3?MR2>%&K8f|9}@M)3M6{&!9ZUL&RD8RJ9;;=MI4HEu*g8y;6$<&I6M&UlB_ ztqw68ej%z)j&aP!l|s2Jiro5iDJP@&Xf&mHSnAk>h4)<7d@tSmkN|Kxr(Lb_q<;FO z;d0KvI)Rk;!xce&SuJtWQ@smYdlLBvdlv-trvFkH8zYbzKCZz5pqV_XFy4k7Izm(? z)YdCsLcX6-V+k*R&uvw?JssOqc`9LQjeDH(z6)z@=C4P~m5bq~)_572sMI`jG*ep} zY+0{pgt?TwN7&c?{S#8K{PmR53qjY=a4YttC=NAcAbyFgqH0hAd7Q-go=_A*gB;zP zDtGPDtrO<17=&D^ii`a!aNr85zDhkAyH5E*ORN1n%3AGoDDS7Fx^RngnBa~~!X0I- zwxWn5T~ezLy)%o;{IK)@v2dudfVhd}R?eS@YD(BRCYe!xw5 z7$VawVOVHa)7*Uf6KTS2_X3~P0_|c+ZL_VBCwFI6$hz=jPbf3xklrUF?C6j%#HMNf zsPm3_*sxf1mg4P*V~;VSFxfLsc=ch?hGHe}DaB6luuIuG?%AFZu2GM^cmz8nD}8Ge zpAaD^az#d~ucJ*|Qu`9!=8Uou&UDnBu2e6;{$9O{n{~f=WLJjAJqp<$ojFkTI*VMZ zHFIM`SN63|h(w)f(L}*O-_*%ZaEG|D7VMEC4ONExse87z$zUO_XncXtMw5u9#)G9Z zF_RES)Xm3UAdY?tOUuJA}wUn zcbdoTReex$lNT1PDd`^~C_XGalG6irw@T|tps z?Wul(@2r^Uvz3owKcDwK=@Ob}3B2ssE%q*e>5umkJXu~wMM%Ako6_y9WBthq(K3nB!lIW?K+;1h4&ORH^-?-Fi-@POJ>So=vM*0Npe zYPFC-9`B80?l(L z_387|73y_4V!LmXgv6phSKfQNU;sh>7t;sFB>w}n61oShCzHvqQjV|~{G5D~48krY zF$ad-%CZ2}H)l`JqPg+o2qoX(zTJLnxVaP11TXOJk~Lme%>C}7g!gNJ~?3H{@)|;F%xe#PKEe$SW1*LVIU_bncXF`!2p3tZ$hEYA_tHM@) z&AK$H0ki)LaBaM+zrT4UcGWn69ejZR(xcKOv2f!gd~iYs^La3W`yE6tiu55Ip>aqK z;Jjwa+ch4%4Ih>(cHk2d%sAVhp%@v_e&|5|bsL=-5u=@rkQYmLOYb8(^xqKg&+f2< zF!yma?fAb$eAVJM5jm4k>oLJGCo~@7)bx4EDnyjCqk1Z-_pw4s5XBf_L@_38`oF6? z(Hg_z#L+_W@6)lp5ijVq>Ip?dPi&Jq%C?s&wTGS%q5mOfq8w{onEf=`BdShW{L39T z@7POX=u)#s{Sgqk_-2}qy<$7}XQ^>%M4RB$W?JqZhsqOUpo^gN(7opL`i7o*2wS*8 z*kU_`E&M$JZ6V1^8%>rC1S`5m@>Uh<-ukAVWtKadO`Et-DD>ITAd*g1q(!xPV#lo` z{UtQ=LCo{o++Ige7Ok|eZ0*k}EUELNMi`lim5o&nMEZ%*PDPMoI22}5N8G&dhs)Zo z-rw6(fU$_X@76o|Oh|O!)D?MNa|hfEUC^lcV#5ttshoZkg`zi~#S`79c!QB7aeG(U zuC{wK=7X_c-5<>n$RZuMfz_80_Ei2(?>n zC>X2CM&)+VHIH{vMLH zdv5{%&~r~&1>-O8Hh>``@!(8T5y$@c*$PTEIU;1_%u;%N$;h9#bpn zoszn-d;vk%B3TiK=w1OG;ixpu)HCpKoH{~Jmdp+o1Ef3R! zV#q40cysYZIq28={P-9cG@F@pW)QBjDbN!4-fK1M`wAuHImTrj8HuCpj{safYB|ox zRo<*>44Ratvn~sroclwnR)%o&I6~U=YMWT*i^?0H+AxX!dOiD5^)heyo38JjEGBAl zf%Li`@phs22x(L2e8eSv1~*VhcWsidlrBDLWF;eDWm3wS`BYAp3%spcZjjp!2+tjV zyz3WpwC$TFOiGKJso!!yfPD-6|HI3-TmOCZHs6LWvu|@`#KhQ>is5cIY#mE>W^u|& zZk<2GHFaU?bAZ>WB$IqNdCMUwOg72WDL4J>7Kt}hNcW1ARV0rVed5O4tkS+mDIBBf z&h&TQ$X!<_zc^mOpRPlKNYfPhC1u5NCMAG^Wr|@ zeS7Zc$&WncpqBGFo!%8k24# zdz@?5&k?tb3^$(Ln?AQRS-wrnpm7t1a%<_=L*3!mbIkiLFwTM1n^tI(1Y2*}cK`YG zFF?-IKF`FN9}RO8TDf+!s;n(bN&%qL1M=cAHYXI0(}<{;w)TSN20V^ zhy0xbL8qIb`H4HFV7e!T#Ca) zO1s)G(q@q)zBI@xY;cf-^r#+f1i&2zlqmn>AT%vkUl&4hR5!#b2`L?J%Hv*%5Z{QI2h9k9sB`N6{1j%ePm@ptyUBJ*WZIcL)Hm z>$m{>7zRhUB1{u?evK~=0eF5hBGpDV8M{-Qg9HY{haIR0l_4GNYc4}aYOV@ z8Zag1#@svyZ*wJ0lmYauMm%H^3X)*-IgS_c(O$V$z;W&>81S?u9wY3VK+-ReoaKV8 ztjYb5SJq{1>#m0=C0!oyRSb(9>YT4SQM=APN@l&+_~{u5numkeRBvb0MfN$61{rhh zB^5SvwLuc+SaWx?HLTtSZgO^!!*{x5*7zJ&#WR5~qvp(5{_>61p2JiX@>ac4mRxdt zX)hFi1HB3VDD-#5<=yie_fy9!>4oU`sm!UUG$g!|RwYWQH?{^+Wg@W-;dtvr(J~cH zF+wL#e+4e4#+qzoTDzu*-d>-YBY#P%ToqhAh-Ch?3J&v# z%V#Nf!kPq1BP1NmSQg2Zi+SG=Pf5=Q;-nzLIw79W;HvpSw-lZkWbdAKEc0wR0S~cs2N;gBk5}>y7f*@6$PcwmfyXH zt(zw6Pe#B3F$U%4O--hh8EbK)!t4vb)1OVyx3QR^onq@$44rR+)7qrg(9 zXR|hP?^h~vjR@X$N&|0!J?AxoY12RZEx!oF07gj$d(XD2xL|@WwEzbmt7*%2kxYxFm=rVc}O~Q&k%DVN;X8-5}Rw#pT#}+#N9)$RJdluYOnW9Dw`^8pK_ap zlDKr9N!EDNwD@X=`Bf2f4#YT1XC-T9L0VPD!w!j~KFSMb_|xS(VpyiGA5<7wTpXMuG;_5~p>U%6tjHW*kR(ob0ns z*oE;)`_AKQbn7d(5abwRJ=x6SkSeIh1l>MAj&f+c^QjL{bB$xE=E}dK)7-3k+>0WG z-m6y9EIV#C-Q`!5*;Y7R$$m1^mRAH5EUQ+)PG+vaPF8LItaKr?4~cd(tUB>`@XSbR zUd0{K(k*?$dZ=-K$sBM;S2*SL_d)T$MjPs+*v!_Om9S@cO@%$}Zp|_Kr+RekZWFJ_ zUN`b)%+RJFfD(W?_JU0{{<#==QGzKlK}zlS_*?)7`U9Bradii`j7sa3QoVXz2(6o{ z2nc|-C8t|Sfjz=q42Pee&aH0ZA@6T!#wPg(ESqhcm5lFpg&e2Y<|(-jH^p*JTW*q` zS(_AVG`mprJBcj1vIEdy(dQR3`7c}LemcJM3BAog2;B$EUP)n9D6L>^RMr_>r zhrOnx9eM1zAfSD@akfm2innJGO(}D-um1_D4ENaQS=eJoHW@Q!yB;ngo}u2`<0iD$9^89RC%~Z7$8IDl#4+2- zx_ge1$&Sj=Q_`lEy-6J&kjD{{mEXnhxtGKMpS_s@e0GLg{HU#~!+>yh#)mP2_l#&1 zgC^4*1hjKnP<{u4zcT$>*{KpFTa&mGc%kRw^prAN_%SB5+Wqiz8*W@IG%W~gO7C3G9o|50DxPb9u^PqWzkIxNw7twC?Q$a9kZyvcdYna2?>qFa=OIs&cH$rDUKaj90u|=BA%#~JIy3{3HJ-E6RI<$vA%HeSa;TBY zl(Z>+5*iUmB#o|eCL;q8hj?>KSR+@5hQuC|X*==EZ#V{4uisOX-aVjN5+P!ee$Fnr z;za2lH8SN1+Fj~f%x%jJ7?Zf%QxxtPYZ!SNkYN%}_iT~sRmG)8*+i&-)QJ6;ySsuB zC^Nas{o`-v1A(}bJ0~;;QOfmcLx3{r2tZnwdZ|DF z8E~i1MW9c_m->Hzcue(kcTpUcvwuJzj&mICY0o&~Sb6lCaP6+Y+2bkUvLqMfXXZQW zZkp|VE?{lUGWl(g%8Gu*2P^uM7P0Xc zjx?eeDsII20&H=a%uj^fcX!ySs%Pf`D5;!s~v+2 zAiWHFoO=NU20q^uiQM#~b-#LXNLPMs|ARu0b<20h&2$DmQX~0LDlbA`Uu?`ttmJSIGflWq>Ei_?R z2aG-Gm|4+!~dr$L5Q_Pgn^%(YRtVgm?xvQ!M+ zWROO`0W~{IEp3{Swf)nMmybEbRG?8QkloG%eQS-Sxj4&8IodN(nF$N&6MAMG=WS=4 zuf<3*zPkBz@%Hkw^6CG+(U~QY5bK=;*{lg3)x5b;> zZeZvG7(Yd{QVxe!{qp->z7u<$j3>6%ZeYA!0EBk;(?h?cC$}6oW});Kh%Tp+ZK%uv zD6pDk><9k%(~DyL?ZBh`!|MJrObN7q`txM0K;Xp@hz_g6S(#tGEwl?@?7ug2BQ;04|KCM1 zwtYjiLstasHdLlEj^FNVuDw6~kWgYVsCu95Jq%2g^Ie?J%18>JHGJ9200D#^!)&uKK>u$s#dlC_ z<LpBhg8X|Qs_hMM?-lwsu!E=k7H*&G7u6k9^xcrg}W!G^>6JKD#YI*zO?Q-i}o zpj05h`Q+vD-Z3#SE==9hKFc_keqMR(6sBMq4hp%gY4LY`ZIBER%8nEJR-X6s$Cn#Y zk_3lUrJ)-SLv@DHz@K)jypMbqN_$NfCHcY7@}Fgx!0x{WdGPM#;0Tu^y+$zew8^iJ z*?tj$f$@6_r<9cC|6=b;;OAC6l74 z8~dKwqEj!>f7@!J2+`#VCo;f4U#Ar6mDJX`~)><z@V6@SA&UE1-;3ztjh%3xCixMxKQPXc+Rg_*6PVmmLdAoaOcgN~GJ=0|M{Z z2n_}0f399QxK^?d)2db8W!!#_>|xtZ!7!2U*n_*7D)JsiHk9pC)PO78>CpD{moGH~ z_%i$S-D94^eS>w-KfkeP%)_MD+1ZqIuQvhY9C z4tV6(j=c@Mx>NQQ%|$U(0E_mC?cs(EnA4!~tTOEqa@9O&*bWrXt_q#Utcq>msc6BsMRKHUTiq*)9|yT(b_Ptr}pH z5(wf(`zNoyl{S!e&|@|MpS__7r6%OfXfEoE+_;3c%@43ssPckJQvt~T;B3a*)7y2E zgGq8@7oMrQP2zokN>0x;;e)z=<{>+8>mT<(4m^*FhY2iyJQ?0S8uKCT3n$FLrXiIq z)d=~9b;7yEhuqWHpcEr6_CD+KG4-q-kSz{_nTBqYbv?l~q-mT(()%QESzH_iZD*=U z(;@D%4J5iiUaSu9xZ9Lo?XBExigZq$3-Byo514|dLEq+>v}5g87&x6AEW zgNuA+@NE!b>U1Wf`j3Xm6qTYr+s87vAbnIqT!f00$i{-eqa@yLyqM&Qx-6Z9byL%Z zk8hLZeDs9+Uikj&%Yb-J5y4b1TvrCKe-zObYgW%zI>I~U?mM@sO# zvq%0l%s^yN4D@>YT{!vkyZL1=j>)IH6$?QVgSzoAM?!!8cMWI42b1y zVZ&iLU>7k5EZtSr@^OxwOls)CGnJfws_4%qgoB{^ld2Rf%{bP;8o`GzZWNDcm)WLOu%|MJu;t`oicf{s-6<;>z< zJklOUOq_X*9joILWYtJKBwKlwoa3=h<0AqgH-2D(5Fg1TZ>D|7fAt-HfBv{ov8MU- zyYrb76H^m?HtK5Ug?d|COQ(XDiv;IWZ$x(DlYim~Rh@jm9C;6SKjT0DPgM69dztBk z?b}(Ve?DmYPl#p`8@Ap~`FKD<6lc#78Tj8<<;a&WPkWu<&xmOHI=20*KmQlWgS$R$ z8@hAmW^z123(5+03&KAyrTNSrhoyWau{k`P4G#I>|o;G`2d_53deDf}Le+5fl0nJnI(Ed)K% z|Co;rs#*(Q-fKft)!dk;gK%lO&aaIANKoU0i@3| z9^U$F9AVr4`p1-HJcb3^uE2VklW~83n`<}D7I*sbo?C3Pf1Zg#>fTJ-uH1ojq0F5# zz|B3t$AAm%lir@II~Npx3>&a`=cx3{e^>*!Zr}t88AbC}Yya``H)Hk?T7-^yFK7JQ zbdH>bdCybgIQZ~?dOOf{Ln^^|l`Xmov88yi{lbdiW%4x1;2&@&EeArcY+O5JGt>{l!GBI_?W~OfSh?HT zK}AN~Ipj*q7N|Vm10A_%g7RR|ZrLA?^^Z?j0W$WoWI3q|a_}=nX_=y`DH#fHX9gd$ zDIT8y9us9QkczunY>3@&*c?~$BIh`bNDbP+5GVB7fG#lc=SwKf@@Rb4pfr`3;S6ms zEge&KA+Is7>0ZFaXM=8OmY0X9=(J}VG^Ihd^8k#kF04bngZt!%$Z4CY9{$_Nj8?z{ z?8fMcoq37YGI)H9a9xds*H5Opk=LxYfGuZku41n1Tv+)T~cWV&ZLxezr63jHXCU@Z8@Vx`3 z6UWD-aptC%dv8i#0GZN;_WH`Kzd?P;xx3`98;dvB2da_Zls)4MYBh=XcOl?Pt0a+l z{?cSEDMmEKAhII`y2=Dv0Ga2Qjgop;Zaith&u`kFyO_)fZgQQ|`XSBjd43cZ%3a2h zZeL;29N>J%ehDoEcA${o-J*4)H;5}Xna-W|w-Dfpl~XxR5MPq-O4F{;*)tAGcygeg zMj&$>wxRO1^b!$@_8UT28L)P=U8FZ*Cw#*k2 z?nqL+p~j)QC<7f4U#pJ+nT{6 z+_ipVxwU&^@ymPKO+Z>OVSRxC(<&At#qd6!_fQ7L$Zgb-V2}e+8`pApVAS|5;I}xk z(g#5uWpNWg4`qwQ?ss0WmwyF9)8i;>Xpg5ubd^2C{K6<*5SrN)K#bX8J59B`2~l`CxbK{(k-7G&AmB;3 zhZWpK1<(bFE7rhY`!qZE0=U~9ofZ-v?t!+;$3gg8G&7OeRNXWPRaqh)Xak`{C!zIt z3x@54$knlSryRS0^bH^?4hap}#j=mgU*led7n2&1t?G#U#r0hX-(+6V6);Y8xT&Q5 zU?rp!+JfeDoElvn^xO~TcNTV=tD{59yGB1*UDGq2v;S-#mu4D7IK(*|;Rg^4ql@p%r2~n*^V}u0c4n()%8*J` zfI|6%$UJoK^s1qklivbe`lF^p+KZ4?5tSD5u{9m3nJ<1bfg``r1U|0=Ez%<1WW!#e zj`t3>E?qrg`CAdyQZZPC?iL{#=;^RHm%`D_=QBH#A8r&IJZSJ_?TP8an`NAS7IKSo zUeDIbIh#fkrC$j9k1|#J&+EOwUcA4zYV88_qiK$j2wZV)PE>e}5T>f>JtdAtd~(iB z8-r^P4cw{IElzqx*^IZ%u2#A?vGwb|vwo7bV843tpu#u7eRzfIe7c~0|GmFfaJN&+ z@xx7Qqmg8e;r7n4sVa)b6h+k_hYs4H5jWp z6Wn5J+FQNWEs{ebb>@(|aLCiF&~^ZS^ngyJMBZ=l61y_NXRun-z1{r`rskc<0%-?H zxf&E@Ik--ziBr5GlOv}F&q)sQ>%3z1fRJ$SeM9XubCFvj(G2<(Qw6Bs?PQj#$lz?x zg6vNrq3ulbEtUQ*sW%dlnC3ZHoIF97&v_R3hW4q$z#i~=!}EskE+l`Ngs1r;(utdi zl!)8zY`CjA|y zjg=Eb8N?%V6X1^(Zt2xC?&Q78Z`vC=8CFuWu?z9Yy`0}Dw-Rz#_+rO6I*@4vxMAh; zO46{g7dD+}ZkBdW3TyBo3SO7z<;#a#ew*((<6n)}Ah?AHGlZw?bDmuZy51^)T?Ez| zb=(%c41?E*)y1@6F0tz+;~jzXbNMd?xV!PoR|Pp6E@*SmSfwPi=WpSatBJU-I9X}p zOCdk7Ja5N~)b1~?vwZa5$ZXox|A22^nc-o|*ruhRPmfi^!HB1~1Z*PqxZO;7O07in zF>YG*TM>A1ln!l~ehSv!Iukis7~xo}^d)qwyZrDGW2hyw>~AT;{03j{*(bLdk6p&$Hf_H< z6X8drkGfQ|2uRe&L;nQ$H|mJ`*01l-6yQ&SN+YA zxX#}s#heod6C7e@H_DdrXt<_HDMn$ME!#I5;$h!Whz51!n0Bvp4%Sf1f0@7ZD0=n; zom{-!K*K1jk<-XCqZb4Yvl5AV_TgSnH#!3?TjDU5Zt z!b(!@LjS9ELmGmi&KCxFxz>74Q7QQmSm+^JH9zY)j@ehyIorArGHoTMKgCAY=hQEI zT&h0878=O>-a3R=B0n|f%3>&Je&TAy$^Heq{l$$PSV)pSTEI z;u&dAV9I$nXNA@2f`lT{9()x`WQPvc@5n1T+o%^&>eail-Hhd3{xA!aSatmtYt;C8P~9Z<$9RXSF|6GP z#>5PKdUIcwDC~7=9ro6yn{2^s#V%YE7eP_O7d?d&F00>6-gOhKw0NIl&1ZPvb%DUV z^O$P{M^UDUAn6M65e6*N#WNy&pXM*q9+4KItj+f`;1fE!G{iqFETbG^*4gyix8j8$ za+A9gwN{lYEgK`_ejGEH=yv;9>Da+4f34t0nz0Y1#KfvE4YT&|<64qj*8D=w&m-ib z!LXD*w3Q8^pU~bQ%xnZ#4?$;(_eS1y=UO$lzBlRC=M}M{bs$!fi=(}Jbr)dSnO`S2|V`N#Ub&su>`(MC(|lUNULzCTXa zL+4cERyX9-ZRO43==#iA>89TrhK@bzyj=E;i{YlI&xqb0n-9knisa4dF`LkuW7GeEyp@<`%23+gR8;WF_-zp z+R?|<`-#2{8)GCSvsvT_S;IJh-oKO?<$>SZ&B!3&(&2lRaUd+~5@x;*jY5^fr6 zQu*fc`GRK2Was>yLy0k~6+${E&138IH}p$bo+YICEt>mr43CQh#&!Sw{e@?F=a|L* z;X9@GeNdzyAG53F6zO0F6h9^7 z{NQzMW7$NHOtP1Fc}dXz%a2LND%{u7mx7ylvo?FgEJfG2t2&$1DQz!(3zZxbhU~aW zXht8qe@v2nojn165Oa_TP1yA|(ALyY582@x5nNPec+UOM?~z!~ylJY@?at-2DM+u$ zxeR3pKPS9xXyxg#s30GavuqF=;MXb^7Ym%=tenNH7Jx3Uy3EUf*(k|0RB4{}p7pC| zPt(tM8+eUHw7faj#3t9pGkoP#1je$#Mqe}2do5snMyDf9+frOJf`?`E4$qMng zx%-~cvbA9vhXbjFWR8aM_`!}Typb6pj~ zHa)$Qw-WEP;IQ;F;rVb?mmNO+jM`wv+278xK|b)taIJiu{B+APD!fWTIj7uoMO#x! z-RngwW>L?$3w?N<=YzG6Vxu!cz8a*kI{S7UHYqVU&aie~F~ZWt&@ar>==c166RMc{ zMM8_|m6QRi`ZcErzbi8hi)Xy2gQ91hW?gsRNgfJ4DVH*zanADmZXA)hYnzRWH-48G zT6;EDX1Wv9{y%m|D)B-rFLm*}#DUhxDj>vwKrf2?Qi8 zugwX}2{8O@?c!CO7g=%0x(`Dk)6OB*S-(rxO_kXy;o2E3n&0T0YIBQ&(seIs`DwHS zIz}YBjem%dAl$2b^Evkgg7Wxi-F_!;1GildnJ=_`is9H}{ejO`;FQjVaVy0VZb@^fUb4s#l_p$XA>?q?}h)E508DA;k+Q{*j#6&mL>lVuKhKn5*6Qc)( z<%WY(20!x;mK-|4$F8WUD{+|~M-b-=SW1!I|1IKzaFhJwIZvxhk>y9Dp-k0rxwBqG za~$Dp{m0aHkN1ASKcq~%3^;*rld!J7ppyo^Mf>V>NJr8}z0J(TjhK3BmlaDWKvtIE zr>+Xls+TPv6^V$K)K$FqbW5E!sOgOEz6A;7_+ceQrytDdI9!%FBb->)yrrrn8|_GM+iqV0$R{I}-V0 zB1y_dUXC;CjpM00Fdu@pkEF6@n)|QiBlY^1vvC^~?%CWYP)<-f^X2rd(-sV6QHhyR z6gbDUY5namtP&Oy_pU{TtGi}JRr4j!liVR?K2K+=&g(+-rub`bp{=^DscQ>S`T07i>w5@gB1hD z?gkGAjoDFV$PRSoTaB*N1gM@WmNJ?W>QQ0FnUtV2DgALzKR)fv6W;yDPh3`5Dj|o; zG2`G2|FPiUMt>%+;13^Tf4oV5{UlS0D;1?y+7|(F6@^S0({oCqemNF^DaH98+~K5K z{28ZY{QaIBW1xGh)SuX8WB@L!iG7&oztuJ1j33hh;yro4EBq%k^~cr!{7FU?@UX5r z`>=mMvIZbu8$x5-pTE8XLI34d-llc5tV8{X3qe5e2Q$XGbCVWHZw6V4&3dt?Q0-wIUK0O?46SVd^t8vo(M z;c7rY1rauuE!b7@Rs7R0D=s(HyM6y*L2G6NEQE5{)KUhWWn;e+;Go*jz=z<~74Jt3 zRKiYnP7N6&z<1}&q9oC2nA+w~Ku>9b4#)T~|kkU0G@AW3Y%VZgCm z1ER+XA25)e0ZglU*#-I*S%8+Ndc49K_I*x@%qEnrOS6x0eV|tHdnW4RnUgN)HJ1$n%WN#*uCA@P4FKj)&P2*t$()*^ zTjMhTlIeqB3Tv9AC^TD1I^@#Q;;=lWZjYWKHR|e=2CaS+%p^)RTkP+gRBhSpTvo|4 zeA;_N6FN0j42*=D9|HXDYbUqQal;_>-MEb;Re1$#^aN`$j7d|gEEhYe#I zNKM^&OuH(@W!%c4lK`F9aZY+D!O})Nuy|(SUHvf!wP9L;hSlYSobR649+AIG;?RiT zZXiqThxU@Xd?2XO(POT;5e{g2oCn+%y+<@xq7=c5$DxxdtDE$pw@FY7XbUjpskvug z_nawxZqc1o3jc-E-1Tf-#5$S*ww^n7_r7W(3$SJNCIgS^0wckiFYjMfpu)!en~5g* zQ)=GKy459c>y^1M{F5u1%ti@3eNbu`uxbxkQ4L% z=1wUD?6p%?!VoWR01Ax<;19|=o%?HYQns-F^S7=0vANQ|-xpJ3mQP3Ovi;`~f)N=^ zz%F_I%>-2NRP2W_44AYlPpY$WFwSancA+O$paAI!gCo)d3UF<}U%jK4Tm8p!n#B%0 zfcs}Pa{vR~a)7+mC7n=JitH7J6hp?+nvU$P-`Y+9(Ur17cZq>(IOwp*I=hq=W=7&k zty11Ou}^BIP`34XGYb_Y($^Y()eDWN6^WAbC??Ip_)M(+P< z0n{FcB+jP)c5(TXvv6B5-4kbEIKI+Oxnk)2md3O4tA-Q7t(Hls1QD+2)NNFGGDReG z=J0~W;Trt)Td^44L-`>nC z*10AoOAu<%A$-XP=3IfX3ws7m)S*NfJj7Lom*w68b3~KyE=i4s zH-6Rj!79PbD!8rD0s$t*tzWk`<9_RUY&tgT-d?-00ju%gw^H{vT;-0;FIrfg&2mVs zZK2%nG4Dl_VAeQwGlo?2@AGLV70_b_Qc^5$qxSaDu$FOE;~8LR!mjjqhCMW(d2F6O!scIkUAN1KLZP(tN)Sf0uAtyLW4(MUS1hL# z#eij;RJhI}dux?^9{uTMVL z^GAS>f$E2RC#^m_BNDL>#~Z6PVRlbg((mnF`1ny??H7>R_J)CtrH2Uc<5Yb6E0lyq z?Rs;jWo}MW>_%+iWLvW8$%v?tlxK;Juw}8O6xKa29IKWut^Jk?qVpSsT7CgS0SVs9 zHG$kp2`VvS)`OM5bF81yqT3aF-WHy;w@Ka&qmb8#T!1Zm`c;?Nr8CflK*ip7UdHl* zPUStu?m7$M;2X#NfUn>IjFJoOQF}~j z$>~pNK%>1^2baB=0txQ=RTqx|{HCTF%u|0hvohN!za0wOmOa&6J(vfkKa#+|Mu#CG zh=o-6N&^LIGM>1I`a;M;a4e`( zZ={k?a)9oTRU5%0D=?qEoez<-pHdu%fC}UQEI{~boc@_f??YavPlL$_#eJn%VZ_SR z;bv;#;H+Y6O>|FQ5VH7GM&9>9DRe3Eb;_dw2Dy`Rmr*}x&%R>EQ2|LpR)XiprxB3F zB28ceGz3-t4eKS*w%xI~%Mh%2EkCZdTk*@%uJEX`;L?1Ru>!pX6K~MehvedY*jQWk z9Ve8VM9tJk$6r=Yc4Snu9(B*f6gN1(%K;WQZ6EE@8xw>xjkA$@&FkWdsqIj){{B)m zf5cO<{@UhjELX^wifB-8>DaB`ehTw{oWEoPU*am-C8wOJan9sKrVINU))qP2$u4e> zso`cNxu7Q^$}D*&swc>Qqzp$4eQ?)_Y(Kw!ilt8L+KJq;9!CM}i<-Xo9Ulq9WmV1b zYT;|w4<8OYS+GOX+WEpxbi}wD8=%L2#WVg#Zt)MFxDKFv!7{Y?+P`H1jQiloJ9!d5 z|8&yt(AT1iweCh8utU<{v)6brM=g7?^xdp#R|_A@7ofF}Q4*{|gS%_lNe!s~{r))8RvB z*Z<&5$gC$D0;*q$HT z;R4*-3h5v;%Lv?guMaYa+L_$zw%CmLi9w7N!$Us&Z_TFAuDm_1K0X$$ci?}_@E!m7 z+sa0faIZds>jULb+8_U5_%k%I^GE)^R&UST<`u*Y?-#QC?H^u}@8A9lHx*lb+5#fG z?cL{OBjRrI0AFYZI$DnQ#+~b10clP-^XnuM4Io++d`Zz*%ln%6x*Xa7tEP@7rTT3^ zQls6IXE^{-?;(hQ6>DGI|5k9W>H7`;?OH#R8v0Kk`~$b=GR5NT-s=wH5)X)mg*Cn) z$OQ!kE6X6(p|ge!WukOzGfE=xoMktpv{aCshpsFuCaXL^@wA5rDk1a)n01z9PRD7Y zC^5R7g5tv6+o!TrA;%sxLjowUI%5^PeEG6uZ{>1Ejnw=-Tw6OxValP^2hoaocaCYr zTs<2#YL~lWTi!BI;pquN6}l|*eqq!ZL%ZT2ua}T3MD7D{*kRC$5I`~T>X+uIOC2Cw z(mfUanr?ZQFQjJ|kbG(Y)l!yU33nqV;@(3i$Pwbfu2=Uw4fH@Bh;n&0`{Rwvl)k`- z6}|+B1IsrO#1Z22077A0T{_~zC_#XOu${+KExZ3VId*=;R-c1tuVebj5Q=fW%HI3* zlxP+b&;83iR?>VkWxFfDagi9TKJx2iPe8uQ(M-v0ET0G0P+oq3?F6)pNmlWFwkuHN zdLfWbb!39@^5CR5`JkY7;H!w^?Th<1%;T&dh6$x;mbz$zvE2dGDt84QweDrcsIMq9 zKrOwS}67C{5%as&_gfEjFahF-mr|GO2VDss}I2pE+C;3A$AD5E<& zdVHv4<}8s5oNn5(8w8&(2Ou6&W5!+k&V$<-pFg7n3JfZ9c=eH@*VKf>rupMhk;$wU9R=1L`J55sp8Kfs!(r8n7kvHon92v|Va}J|a)Ht6Ux<*8*%KJ) zFtcqC;}E_dFK~e@AZC34^Ncrc7MhAxKy;}vW(5w#4-kB%(GU0x8MMWYvq0JZyc3Yv zEZ4HzH7H*v@^%@%vVf5O=IgYour;X)w?_tv;r3MgW?)H72t-9?t+2mBSCQxNjK9g6 zt1p;S?<_;29I)k98Rnm8ryr#4(fs;mYTgthR^56FiKHKC>!g_>#r0UiOZI@4Z6n9?H5!s4e5h7frDxbCedEp`e@VxgF{IeWWMFV=v5t_*`_A~ z;iJ_F|F`4&T3AL+s!eefpw21;7| z3Xg-2Ta+1C139+dzTp(*lbn&VLni2zb-m!{DL^G&R=*Mb2%y&KgO@xA36Ox)dWipJ z*M(jsUq1U0{4`CNg%oadd@@lgx#(a(+_9ha%N!t@$5R`45AS_v}(2{*? zt=6FOd4&@3;0Jt*gbcddlDuvzn=(w8s&VMZbF#lt@7-NY+NZwr`nXCIC0Wp|hPF?- zaUPb^8m$QNTL?GUu#^6Pw7>prmgS)`!3l-IeHRGoIdXm-wcf*(lq}=62<z0DwxiLD)+UZoiCx)DSOtV`vD!k>iHLc%YPJbC(r?JW2aJOU$(bvBYevYsZ zQR?UE4LZ%=i|?b%5UdsC_(J}o!E(K=)UT@I+b`qr8JP{u!g`|x9|g2TM&823gs;I( zRF2ssJObvsrX-Gf2@Y97gpA}GvEU&pK|V!~jB{Th7NBkfmRy~jzAxP_J;_eg`K>Mu zKbl}qi%BW{8{?AM%wi}AM8R&6-W8DT>bGb%8+F56Qw#?meK5_K{llGbEbPbk)&mi{>w(|1AJ_%y-Qf3G&dsZin z+l&-0DOE^%Qe!ovS$?w%f+ouQDv6fI8Cu9*0QzoO@M-rUzR0eus!l)BERr4#c%f#K zVa;)#$npv*u!{}We?(T9pJ+Zd4zQiCNvjW)kU+}K`huKr0h>p0wG?u}lJVl%9PLZ6 ztIHqqd=f^q3`C{F(DPnAX)v}th$&22HMkvZ1S`PTZwVxdQycNbz5eP0WxI7+J@;84 z-T$v)S^*Mr4xQhU^3J@wrJ|as?)NFhM~b7tEMAa~OD|DBwo8(?tw@ixYjb1G6N0)* zChrzj#|h{VL=h)Q#ee5kPv8(z;v9~80d#zJkJs|8=VQ!Mn4$>wCoslP1Q>bqyL>9c zrguFT?*jn>r&;O32Z;)S@g%w9cBs)D#|e77B8UttVBsYfhB!qjssQ#@=@#sh;6-zS z%gVaBu_jE_4~@0UwPJ-wN>{r;Pfv!Nhsj5l$66Sq$Rz72rs4Ir?D_&Yi)Yj&&nqp_ z1GSs-caU?kWtR!_qx@qFrEo5HVDb;E9S%x}@H5I?rFk>oA0_LINqb@9J#vSh^n@kB^BE*IQRXCwZxk!*hwwIYVyAtjr6VN{( z7hi8g>Z#w=*ZhZT`T5eaK}MTg9DemXzVVOWu|a@uT-e>6s`o!0xc{RDWRFXCsdlo- z|KZ34(boc#4UIo;nRyRL8OuT4MfP*jhCNU8$+h&y?@fTd?bReE}R zb&co0Mu`9nV0!*v(BjvF^F3|+F9!5qNbTp<;qPzm{|%(poETr+`!haso@fP-2V7T` zT(gsa1j+5Cz5DR*C)l2e>o4x%q)5B{IalS0^N?5*Z82B8DPk}ux6vlTAulhF+4_Cr;?8FB z^BRgJ0nKj!QF{uktXMT%=;d2l4u3mrJh?g7ygv;he0PMQT=%1|(u#}f0#VyZWLm=x zO{HfbG4Kf14`G7(l3+p6 zB{-`3b&P_$1Z7QAepjx!=A9s*QQMR17KR7JI} zuMm$`9^?*{>|91Yu8Fuv30zb&;_&LpD1E!7x4o)*kF8ttLEavAko=w9qt3ik;d%Hl zs&k_tr2>f*h1KJ}TikFXyl6=s)w*q-| zcc+X`=DmM))e};g!a7?~^`82%;(I_!;X-i4I^Y+r1>ay)$|1xc?E@{VoiB7jnl)a_ z`}NpYpN2JEY07;F#$KNeFdxq}7^0hnBZxI&X7c{!<@FXK@5F3G#1MoLOc!{P7Lev4 z8eH~R<_=&7Df3al0m+a`T@ABp{2gcN3Z?0h9O$MXTK1dL5=@l`2sId8nT9Nvy@HUl za%gT(-U+_7iOd=zcFlVdr)umwQqOf~MT8az-gI8%7FrIEoI+J5fO;G*;!HtebkYaX zr5Q*us|@UbQQ<3sS%K-Ln{7$55IEPhx{lx`Z3qc`;>KWHR-n2{vB0T0v53m)vo%LM zsVy;0#b@slc5X08g^^Q1C{)*g2`&O2h6iA6tcdqM0LkorM1onTI`x_E?KA)gIh2|| zkkaofHDvdU2!gCKwIG7RS_-cGOXQ#eigPLaWEHYae*vJ+R3^T0ngmR-aapl8S8ihs ziLc?E;f0(@fKG&(q09_u?>2YOxrLyVA2FfQNqBluAQv`Dv&&(~o3|W#h>)X(1xjQ9 zG+B-G96MI75o}qw8E$HR=Mi6T) z4DhxA=u(k*{s{BwmX`g;92>?Oo02P0aPVsEm|nO7vv=^hfHZHTsNi#az0Vev;5l_GRf&Ic1~_A6 zodb8{M*dr?%dUbqdrUMq)opS(JYad??X!yABfQXjsRGch;9ge6^4RG$u(u+Kdrt+S zD<4c2U80&75TD-+c36j*aS&l96XuUua~{6%MJ?7A(0u?NU?| z6WOHvZD3K2rwfG6(!VfbzQ20mjq8UzUZQsCDg-JaZY|adc3wsuM zvig?_1_~agyq$J2OHynGS{J*!Y<#O)t2YQ5#Ts{icDz3=5J5Jzj4Y=3>4k@~CW>!S zu6?Kh*J+{`9L$6K0jDnX?k}EJIP|UmF>pna=Q6MCaVF`T6DsRiF&pIcJ{iU8Z8GTa zYb1y33bwqyiel)?Nk4>%mEj`B4ib?>Ci)QtYGnk8_vm=Kmf`HH+~qzKgN$JSFHZ66 zF0cXW37t2yirDFLingWbuM>zR2%C#D-{3>qxrhLpi@^@hpTu@td2;njZMyuU^Uh4( zyM}?%^!VaO#E;R`L~_Y+@wU)#MV5t-mJOm0GQ)45C%Vh3$w_*bg{G6Pvkx<0Bqe*g z+BQU|MjKfSaN;Y2f-OMHE_nE21~6n+m$)JbVsnL{^PEoeyC6HB1ZJsFx!)Z?)LUbe zLEr#ONR23a5S!gdNIbLfkQe8mP%Q2ekZgRK6be2Be|pM6L^MZx|5mTE%X5qOmybPw z+&TYB00AleZ|$JOHj z91pfQNGVSr+PvPu!7^Yi>dZ| zS6sA;mD+lTuQIMj$wmo41G}0<`{2z`YU?x?PX8}XKIHrQ9sfuD`Ws}lD6{ghZ1i^l>$uN>A{JtJ|8SARP8$;<0ZY{g*xe; zF9VS9rf!-ekVS9qJ&X6uUG@IH!#+{B?(T1ozT|ebZS>vV2=^0sDc5PE=|!b@fyk$y zA@}S?ZD`6!%zhstPvc%O6`J<2*VKt51f}>s1itts1dVsH!Fzz-BlP+nhP9>Xei6mn zccJ3YMT3_ImS#tV0lLj6dn$Oq-J^#s@#gC6#Si%E^U1^*SD^XbU4OF+$Y!EXEo`94+rt5J?D5ugyq=_( zFs|DK`~=wq49aZWnz~+s-D5@$&~dhsPx4&U3G9hC)^kbOP<@%^3=g|ceTc}|;Kihx zZhQkbW}KgHX5{cFs@Z%2)<=rmO|zkWdz{RkQR@>uyCL+B8n@M{>5g~!=CWklS`6Ei z@*QeF-S{HuT%hq+Khkz{nA+1XjSL8S_N*DH@5Zvf;ioYZ;Dfq?Cl%gwQD7E4Sbr#( z@9|&n>^z)T9W4+s>Q3Et#=FVBfP;>!$@iDZKeqbJlPyhY$`;0xkKtvO*@rvr?O1xq zp|*F=z(MR-yzDC-@+(BLa<5K5d&0iPaFb4>fZDC&_BccnD`1ChZ=V0^E9KVmc^^f3v8H=dFPm-4zGd#p!bu|nJ}5GBgxI99**J3cr{_- z9k(PkV%vuK^&BRxhYB*Aq~?U1?0FW3j>poqyeH|h)C@k)+l%krd1ZJM^~z?R9(H(o za`({741so#207iOyr{W!bzi6Rv-a$Kk1pZ3)#|c>6g8^?;`I+J6By}NBm$1q^NTfB z6^G9mx2$O6wLb~(3NaqjD0Zk4jiA01t(v}E9LxQLAc(j7b|!gPi&9~r(U+Fw*dY_E z2C83{4n@`Rm9VPE9xX-P!_}ind-p-Y-#QGVfGMl&^20kT|9aR2;~HYZJft>YRB$-f ztAWR@z*-9cp0Xf}$1K&UemrdyQ&W z@r@DXnUBl_;sTv)nq{~B6*scrJ;BYmEfIT6>RrN(XgV_gv5f?kcdd6!rE};^LUb2Q{n~={>$y2C+(U2etRzhvtgc>bu!$*Ud0afrtsp-X@XoO8 zFiXY&s|WW<5us|T?=1hHqP57f1+X@g@{OoLNXr)KsUSfx&KvBC!VBYmkb6Rm?o(D9 zPQwG$mW4XN$+9>uGmra^80U-S-4bDLi;u>{c7lA?ea^F*t0+I#H3GPriQzs*j=?;E ziz2IRQ3tgdTPkj}s$OIH91_=h_zj=j)yzZm{^fYuwIRuPg+Uz2Y_1vJi(D<^2jcos z;YN3uyS)WWOUOwwSreYWTjDNGJ>YC+91_8I!9!=Mfh>Z4e3*Wj>84VkkO9qdR*&Ee@=lqXHW~V+CAys&EoXP- z3%^Dz;jq4tglB8O=yUZF%d1_!X3Aob@7Z#vwnTHnd9?883$<|`uuQGDbXIj?FZbP> z;cYd#zb|ubRppN?ZR%ji-W@K$Ux`K7Z$|;YGPi7sgF1xNDFSn4hJcv>@pm4#!(NP8 zDl=p?8{P1m1wWqQm~b6E}Q_aEf$#N{$5 z6poqxuJ?gjgesCah!t!I6~GLDYwD77E)p4}9Fsit0$QG%6M7F&*zqs`IO_w{PNnw^ zzC?GNBM1bo_KdfL_y{>duj#w0gbxYKArOu=i5(1S`fX_+&4M)dS&@`~jD8}UX6q+(pGSZg~+ z;4$;q**%^D*q4;0G5$Gg4)JZ-2Nw*RBl9#qFYvh0;XYg7iory!L;fIT-kvQGvBnKH zO?7LPDsk@57t24{zAMun*5dPv+zmgvU^M|$&#i_<@dv+OAsi5&y5 z8c#1|OwF6=Ze|NnKO`XObrtnbd*X*wE*g4AOgb~Kvp{JHa&9#6c(!C>Eg z932ZtqJ8Jk*<$Q;Y_>=cf?S2WdWm;pDM$CwcJA*nS_~fF09#WU1ENs*8>5Nw`l>*F zx3U@iYh85*R;5rY+uyUdbk8C9MV<0JEw`^J)g*m7*H?byW|TWZDmWJs>GSm}Gm&}G zY<1CR_ur5KCm+ZhhCU|aoyBublBhirgD38;iAhztrV7mu%ONg5hL{R*M>io28RV*p zNpWxlFUxYs(1~^{$9n0D4*@EERqu6TLNm_vF}XU~sexL`N)$xf}m#Mx@< zlHG4rBY>t*9TNBw8Mbzdm&8RjJJb}zE&0Hrq}mc_>lWF$7i_*BxxcJK;r}~w0*;(} zX5r86O3;=kk{|mDTL1VggQFR_-H-rKLJi+i)LvI$T}vC8xreiR(4l5LrO<4`cYOFN zj-X~fZnjQ!#6%%f32LbKsR7GE8`--+dkC5XT-y6c4q+RiMc?w%asL zIw=witq$xnnV7rei9B4O;9%?Lu?*-1>9X#Lyo@c#?v;}@nH`Xwu?37>^&?g0-h?Ur z{Z=I=hoD+vT=P+Xx9%r?$Inl%CVKf(YifC1&zbEFFnQOx;gtL#Ga$T3Ac0afaskx%?}4@KYiIl-au$;o5{g{oR_47vY9a%yLs};_ z-89-#8jdkGf}t_TmsiwnXBuwqxo+Xn0xVd?W;=pR{N4=jCwZ~E0*9o87C%mCbEuu; zDT^WX8KTJN?V)`aFAtSn=L%$pJSixDe@=Io3!dok`HP#-&XIfx;0oq7Gstq&`$0Lv z^Q%QYJGX~CQ3Ee%%<5- zow0cxuMNl+^FKiW$B8AXgArqrflz*DdFdD$EEyxIkGI4rw5w1?=eAN3Kc7sMeno zOxlGdroDp4JirU?1a-v(G|H|yh*L$Wkel-rSH6~0fz#DaBY`!AnSF#IF?$1%e z_vtA^fe4X#U9bN{K^bLOaN2^Lp_66>(0r&BLH5Nb$O+b0yA+-50m!tC#|{q%JE67<-b0SuS{kH^3b8#|mop7$|B&@)XQZnTWXF*|gG z7a>v)_J3Rqyc0EQBl649|D(ud7y_D-9istgL2Y`EUIXL%BVJU_AHcNzRuzDE!;m zWjx?WJ-e0@8Q%x)ub21zp134oX2sfT7Bm0b*%>dvk>`ty4*gW<`0JhQ++s*9lyO^% zQZ@Yl?d;E^;K<{BT%P|*ah8;W_t~iLW~%tF&-r7N>tx_aLi3PI|Mvc2W0?Sk|L^qN zd2Bz1@aIqeucs$gQF1<`XlHf?1(ZQbN4C-et5kEWWT?^P)Y?D342w`YS3UeTLJX!% zya^UX@34iiZId)Xua`PLMXBzJ^hDd#V?b0WdOPY&MPWyF{InVjZu=`hK4$jphniY5 ze7QN>q#XnivSxw9cK@)XKum?GKqHC{GyvK7;DUd@3gX>X0PRQ3r^4J?7bJwf7081X z)oaqKDNNiEj*iH*1HeB`ZB+v1`AI}XF|OGJe$)U&T&X!5i0cQ4hU5xth_8#=$$60G zZvYsh`^`&M_5EkSI1>&W0F~G8(}@4!t)1ud%hD5!gkb=z4GnWSj_&~?Cdb2Hjexe| zGjM_KSE=lyIS3PyYG#myF9J;=*r!B1+e64_v;%B%1{cawOTHN=r%ZZKn&BhQ(ZrMW z{7B(z>Ih!TxULksp`azV1EEmG3)ju#o;A;F0W`uW0X}>w*Q~evc4ouTTxnpPpvoDN zI(yHaKY`Hd?<>+zpPE1K0hvf`zYd!W&K_|l(FgQV9Rv(vL@L?LQ!M^N_-orPqBI4_ z{{K$AWXUwL+f5mDfD)Mpuu^RcQkTEiTkdC0qPW}aQEI~au(YlT#y^b8>POY38&P-z zH5{0vQZYlF)s~=7G`bx)WcTx{@Y9QerDv5<>uQc>D%#fQ+F_wDHHYH+^BWVWmx}yD z2}21(B#(6m;&;uX8mVvr1`hA@R0M{DinekTK=f&C08i z5Y3MU>G}{r1@!mP(}Jjkq4j^-`_8DSvTj>MR7wm8Z2|;r35q09D3FZZCIl1;$w?&V zoGDO(tpc_{k%O&*WF!?uHi1$k$vFr`kwKuy;jLq9x3`<_`{TVa-o0ad{9+Wv3H$7` z_gZt!HK%0rzGLU#QXG+%=W0V6AUuDO;f1oSBxv~_3_q9-#SC?%2m4cDQ_vZ~O6a`g zhxBYeBJjH#QN11ME60+o0WwwB=hNabGKn(6xk@FW6?vpP?8cf?d>t4oy#Wz6@ZE8U z7D~5PvYFa+>xUS6m5q?%SO5YV#hXAx5h6Q@XyYQ1uG6QQv{a6HLA!UQG}1Wcj}Wv{ z0?g9VbFQulEZ$wMZ%62^hk(--sN(J`Uhm$j=7Hs@Y@wfW(NVoI)3WW}8;uh+_xIDee$sz$&l}~wZA$$5oWn8(Z zy02+fx#x=O8a&Q-JfENvE*cOvn&OALjc7<7sbmFR$usQFvLGsxM(TCp+xQGV!?MAG zm@XW-j4UYwzyVC#!)D>`civ@+WqTt4lEd@wx0Ip*{Qd`{9i!!JRVm^%h>5;{X@g4Okqej~2 z2p!HfXkHrna$NgT-akLE(*bJ=ON85=Wkj#IdTxy(@s6HK~ib%A9R6j+?e+EhQl0R`S$uB$~3rh^S zj`W^pHKGM*524PZSO{g$oPc0)^P#e8^)gCn)DS5nwmm*)Spei+^L1nNb^jX8*Xdpl z4vhCX0}G>AE1j#71VMJz9%FE9qPVi{+|SAa?WlO9GW;`|sU_#3u-OCNoXe3Q0B$%E z+p9bIQ_9|Sv#yvM{<11PzWSi)q-VYAKWq(0mUIc`LFu>wU>P8 zBV=rwU)(t3$q`0udlAWDstvuSpYrna5asTh`a(`NjkM=dnmHS;z3v(+ea3XwO~L=9 zY9eNUD`?|IKWBGF%8k)0?2#Cqq{ZjEMS32ex)1aFb9Hku;k8z<5tFW*Hg&6`mVy64 zYL)9}O9dvOQum8Bvb}|`i<&sIs5&q8(aBv;RgL0_-mR8;2Nl%BHF1@yHm|lrim)?P z6-KRAyGN-_WTh_i*K71O(WMBBU?S$Kv1UOu9+JA3S4GTd2w#*ts5ijWnFmi^r6a#@ zqfJE00_xiopQc8d#Uf>aIm)>6Ka2^IK|y7}Lp%gY3sY$Y4+@ND2?-1Nb^+%wo#*SX}CxcEg+iCfz*@zTJvHb(g1GbH{ zml2KFBexiu52Oq6omGwSi|DAFuj#mWJ-Rm{U#IC{Y{z=&RRbO^hy2a9UazVSoffz4 z()w~I8^gH{nKQUEKEKz9`Qg-|AKnIhD#|I&DQay|b!j=MLld#maDeW|J3(B$Ki-+= zVT!(&D0_jCmXp3es=k9f3^HJKw%k!M-5SG&ns8USe;_VcVDq9M{bNIp+E70W1E?mt%12*R{G} zeK)_?%5uvXM4>hB^i4eVfY-QL(t+{)^J-y_R1wYBHM}1X>!@r`aNyxV)@_|K7kIzT zR_`e$NH)3!`3MnZO-2V=Tiq?6dF1PgH`bqdpMbe&5=DM^M%J8qe8OlIjH>b{NpS)1 ztOQtx^|=kNE+v%OOV35sH$Rd*Sd6k$xe_Z=L@+WVvB-0};0!hf_G8r}p4NH4%iz=F zxV*!qx3(2$D=P1n%v0iaWvbF``A3=5+;6sF|J93zJ`$XbyO&KSuh7u)KBEqrSpbGi z)_|3Re&_iizuO&mg$K08%busK)yxu621vWVW^D}4>xPzAF)5hw=5PnJv3X}yUK3qR zQSvgcd)`5uhr0YpgvE4)s@*iD+6wckKq@&jfzh>qZj-4^M1tW5^mKif`!t3<*{Eb3 zI2wr|xwmJ!3lJZswfc8Ih+76stQm7*%VCdhTvaKr57!KnKuz z(x!IAP@z4-;vMS5F5uACy{GX{A`|(EoJeDX)AEo6H<1Ue`IMpHWuMvL60)m)iZ87f zme<(50_9Ab;x+5cT2atBBt2AFKd((>c%6c&U5e4d`PNAlJ9IHbCJW!Gosf*Z--O8w zZq7m5YT_cSt(GScId36>406x{x$^OQRMe&2HZjvNZgnM9&V`Av@J`-o*N$mjDyEca zS-yN{8rbjo#nkJIEzwS^ZUqeZ0w9KP<4JfVgIWOPLsf+V0(om>`sWtVzS0Nl##8?SJ;Xqim6ol;3^PDIP|n}`igIIt9B z#1o*GiuCBhzAxT=du7fBxLHL7(u_r=Nk}i&7Uuwkuw~t@sj-|UfAoSBaWh%qXdiUW zb~zvSQhMhyTqO1r(*H6hJ`233J%lOMEO*soY2S>HzfG#Iu26Go;3?YT8|JLZ9LRx9ioWr+D+#_?M?8Y$3z3Y>Tl z?P2_(3voQ;h?F1c>O_hW_7IM?d2n&`fZGQVriG>=5FA@o#5cr<4BY4HW

?yUSJF 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 T3SXgupDRBr{*)=Ff9L-I;7v+( literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_clients_overview.png b/docs/content/images/auth/keycloak_clients_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..388b3e0020d732cddb517b4e288220649fd0e3b4 GIT binary patch literal 78485 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_force_idformat.png b/docs/content/images/auth/keycloak_force_idformat.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1bf3025f56f5e6ac8ef83d184e40e7366690e0 GIT binary patch literal 6092 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_idp_cert.png b/docs/content/images/auth/keycloak_idp_cert.png new file mode 100644 index 0000000000000000000000000000000000000000..1b899283f82108b5551a64e5136d254501d5dc26 GIT binary patch literal 75137 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_mapper_email.png b/docs/content/images/auth/keycloak_mapper_email.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ad667adbbbc2a2c922afc13e47db873852a5f9 GIT binary patch literal 52782 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_mapper_overview.png b/docs/content/images/auth/keycloak_mapper_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..8402a0bc7c96d3d8fac09f39b78c318fe9220f0e GIT binary patch literal 30320 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 JX0Q0;e*kv~7efF5 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_mapper_username.png b/docs/content/images/auth/keycloak_mapper_username.png new file mode 100644 index 0000000000000000000000000000000000000000..ccaa8954960cdfbbdf1503005ad2086ae2b491b2 GIT binary patch literal 55010 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

Le8jJ!@|ZkTDAs^^7ecsY(m?^>i5t0 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 G{l5U_$Zk{s literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_saml_export_cert.png b/docs/content/images/auth/keycloak_saml_export_cert.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fa5722d73fbef9ffaf34221cb1e1949fbe751e GIT binary patch literal 181200 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_saml_export_cert_details.png b/docs/content/images/auth/keycloak_saml_export_cert_details.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4c9e0ccc9ce9b2589082dcbe1de6ce52e16325 GIT binary patch literal 23261 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 F69Ce_pZov- literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_saml_import_cert.png b/docs/content/images/auth/keycloak_saml_import_cert.png new file mode 100644 index 0000000000000000000000000000000000000000..9295edabb83d33abe18cedf20b022c3ad560f207 GIT binary patch literal 181214 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/auth/keycloak_saml_import_cert_details.png b/docs/content/images/auth/keycloak_saml_import_cert_details.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9d1d6c0cece079b71d61a21dc843d272eea314 GIT binary patch literal 48727 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/hedgedoc_logo_horizontal.svg b/docs/content/images/hedgedoc_logo_horizontal.svg new file mode 100644 index 000000000..e6dc0aa5d --- /dev/null +++ b/docs/content/images/hedgedoc_logo_horizontal.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/content/images/logo.svg b/docs/content/images/logo.svg new file mode 100644 index 000000000..c194df468 --- /dev/null +++ b/docs/content/images/logo.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/docs/images/minio-image-upload/create-bucket.png b/docs/content/images/minio-image-upload/create-bucket.png similarity index 100% rename from docs/images/minio-image-upload/create-bucket.png rename to docs/content/images/minio-image-upload/create-bucket.png diff --git a/docs/images/minio-image-upload/create-policy.png b/docs/content/images/minio-image-upload/create-policy.png similarity index 100% rename from docs/images/minio-image-upload/create-policy.png rename to docs/content/images/minio-image-upload/create-policy.png diff --git a/docs/images/minio-image-upload/default-view.png b/docs/content/images/minio-image-upload/default-view.png similarity index 100% rename from docs/images/minio-image-upload/default-view.png rename to docs/content/images/minio-image-upload/default-view.png diff --git a/docs/images/minio-image-upload/docker-logs.png b/docs/content/images/minio-image-upload/docker-logs.png similarity index 100% rename from docs/images/minio-image-upload/docker-logs.png rename to docs/content/images/minio-image-upload/docker-logs.png diff --git a/docs/images/minio-image-upload/open-edit-policy.png b/docs/content/images/minio-image-upload/open-edit-policy.png similarity index 100% rename from docs/images/minio-image-upload/open-edit-policy.png rename to docs/content/images/minio-image-upload/open-edit-policy.png diff --git a/docs/images/s3-image-upload/bucket-policy-editor.png b/docs/content/images/s3-image-upload/bucket-policy-editor.png similarity index 100% rename from docs/images/s3-image-upload/bucket-policy-editor.png rename to docs/content/images/s3-image-upload/bucket-policy-editor.png diff --git a/docs/images/s3-image-upload/bucket-property.png b/docs/content/images/s3-image-upload/bucket-property.png similarity index 100% rename from docs/images/s3-image-upload/bucket-property.png rename to docs/content/images/s3-image-upload/bucket-property.png diff --git a/docs/images/s3-image-upload/create-bucket.png b/docs/content/images/s3-image-upload/create-bucket.png similarity index 100% rename from docs/images/s3-image-upload/create-bucket.png rename to docs/content/images/s3-image-upload/create-bucket.png diff --git a/docs/images/s3-image-upload/custom-policy.png b/docs/content/images/s3-image-upload/custom-policy.png similarity index 100% rename from docs/images/s3-image-upload/custom-policy.png rename to docs/content/images/s3-image-upload/custom-policy.png diff --git a/docs/images/s3-image-upload/iam-user.png b/docs/content/images/s3-image-upload/iam-user.png similarity index 100% rename from docs/images/s3-image-upload/iam-user.png rename to docs/content/images/s3-image-upload/iam-user.png diff --git a/docs/images/s3-image-upload/review-policy.png b/docs/content/images/s3-image-upload/review-policy.png similarity index 100% rename from docs/images/s3-image-upload/review-policy.png rename to docs/content/images/s3-image-upload/review-policy.png diff --git a/docs/content/index.md b/docs/content/index.md new file mode 100644 index 000000000..50ef5bc16 --- /dev/null +++ b/docs/content/index.md @@ -0,0 +1,25 @@ +# Welcome to the HedgeDoc Documentation + +![HedgeDoc Logo](images/hedgedoc_logo_horizontal.svg) + +HedgeDoc lets you create real-time collaborative markdown notes. You can test-drive it by visiting +our [HedgeDoc demo server][hedgedoc-demo]. + +It is inspired by Hackpad, Etherpad and similar collaborative editors. This project originated with the team +at [HackMD](https://hackmd.io) and now forked into its own +organisation. [A longer writeup can be read in the history doc](history.md) +or [you can have a look at an explanitory graph over at our website][hedgedoc-history]. + +If you have any questions that aren't answered here, feel free to ask us on [Matrix][matrix.org-url], stop by +our [community forums][hedgedoc-community] or have a look at our [FAQ][hedgedoc-faq]. + + +[hedgedoc-demo]: https://demo.hedgedoc.org + +[hedgedoc-history]: https://hedgedoc.org/history + +[hedgedoc-faq]: https://hedgedoc.org/faq + +[matrix.org-url]: https://chat.hedgedoc.org + +[hedgedoc-community]: https://community.hedgedoc.org diff --git a/docs/legal/developer-certificate-of-origin.txt b/docs/content/legal/developer-certificate-of-origin.txt similarity index 100% rename from docs/legal/developer-certificate-of-origin.txt rename to docs/content/legal/developer-certificate-of-origin.txt diff --git a/docs/setup/cloudron.md b/docs/content/setup/cloudron.md similarity index 100% rename from docs/setup/cloudron.md rename to docs/content/setup/cloudron.md diff --git a/docs/content/setup/docker-linuxserver.md b/docs/content/setup/docker-linuxserver.md new file mode 100644 index 000000000..cfdf8fd6c --- /dev/null +++ b/docs/content/setup/docker-linuxserver.md @@ -0,0 +1,26 @@ +# LinuxServer.io HedgeDoc Image + +[![Discord](https://img.shields.io/discord/354974912613449730.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=Discord&logo=discord)](https://discord.gg/YWrKVTn "realtime support / chat with the community and the team.") +[![GitHub Release](https://img.shields.io/github/release/linuxserver/docker-hedgedoc.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&logo=github)](https://github.com/linuxserver/docker-hedgedoc/releases) +[![GitHub Package Repository](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitHub%20Package&logo=github)](https://github.com/linuxserver/docker-hedgedoc/packages) +[![GitLab Container Registry](https://img.shields.io/static/v1.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=linuxserver.io&message=GitLab%20Registry&logo=gitlab)](https://gitlab.com/linuxserver.io/docker-hedgedoc/container_registry) +[![MicroBadger Layers](https://img.shields.io/microbadger/layers/linuxserver/hedgedoc.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge)](https://microbadger.com/images/linuxserver/hedgedoc "Get your own version badge on microbadger.com") +[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/hedgedoc.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=pulls&logo=docker)](https://hub.docker.com/r/linuxserver/hedgedoc) +[![Docker Stars](https://img.shields.io/docker/stars/linuxserver/hedgedoc.svg?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=stars&logo=docker)](https://hub.docker.com/r/linuxserver/hedgedoc) +[![Jenkins Build](https://img.shields.io/jenkins/build?labelColor=555555&logoColor=ffffff&style=for-the-badge&jobUrl=https%3A%2F%2Fci.linuxserver.io%2Fjob%2FDocker-Pipeline-Builders%2Fjob%2Fdocker-hedgedoc%2Fjob%2Fmain%2F&logo=jenkins)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-hedgedoc/job/main/) +[![LSIO CI](https://img.shields.io/badge/dynamic/yaml?color=94398d&labelColor=555555&logoColor=ffffff&style=for-the-badge&label=CI&query=CI&url=https%3A%2F%2Fci-tests.linuxserver.io%2Flinuxserver%2Fhedgedoc%2Flatest%2Fci-status.yml)](https://ci-tests.linuxserver.io/linuxserver/hedgedoc/latest/index.html) + +[LinuxServer.io](https://linuxserver.io) have created an Ubuntu-based multi-arch container image for x86-64, arm64 and +armhf. + +- It supports all the environment variables detailed in the [configuration documentation](../configuration.md) to modify + it according to your needs. +- It gets rebuilt on new releases from HedgeDoc and also weekly if necessary to update any other package changes in the + underlying container, making it easy to keep your HedgeDoc instance up to date. +- It also details how to + easily [utilize Docker networking to reverse proxy](https://github.com/linuxserver/docker-hedgedoc/#application-setup) + HedgeDoc using their [SWAG docker image](https://github.com/linuxserver/docker-swag) + +In order to contribute check the LinuxServer.io [GitHub repository](https://github.com/linuxserver/docker-hedgedoc/) for +HedgeDoc. And to find all tags and versions of the image, check +the [Docker Hub repository](https://hub.docker.com/r/linuxserver/hedgedoc). diff --git a/docs/setup/docker.md b/docs/content/setup/docker.md similarity index 100% rename from docs/setup/docker.md rename to docs/content/setup/docker.md diff --git a/docs/setup/heroku.md b/docs/content/setup/heroku.md similarity index 100% rename from docs/setup/heroku.md rename to docs/content/setup/heroku.md diff --git a/docs/setup/kubernetes.md b/docs/content/setup/kubernetes.md similarity index 100% rename from docs/setup/kubernetes.md rename to docs/content/setup/kubernetes.md diff --git a/docs/setup/manual-setup.md b/docs/content/setup/manual-setup.md similarity index 100% rename from docs/setup/manual-setup.md rename to docs/content/setup/manual-setup.md diff --git a/docs/content/setup/reverse-proxy.md b/docs/content/setup/reverse-proxy.md new file mode 100644 index 000000000..8420a281b --- /dev/null +++ b/docs/content/setup/reverse-proxy.md @@ -0,0 +1,96 @@ +# Using a Reverse Proxy with HedgeDoc + +If you want to use a reverse proxy to serve HedgeDoc, here are the essential configs that you'll have to do. + +This documentation will cover HTTPS setup, with comments for HTTP setup. + +## HedgeDoc config + +[Full explanation of the configuration options](../configuration.md) + +| `config.json` parameter | Environment variable | Value | Example | +|-------------------------|----------------------|-------|---------| +| `domain` | `CMD_DOMAIN` | The full domain where your instance will be available | `hedgedoc.example.com` | +| `host` | `CMD_HOST` | An ip or domain name that is only available to HedgeDoc and your reverse proxy | `localhost` | +| `port` | `CMD_PORT` | An available port number on that IP | `3000` | +| `path` | `CMD_PATH` | path to UNIX domain socket to listen on (if specified, `host` or `CMD_HOST` and `port` or `CMD_PORT` are ignored) | `/var/run/hedgedoc.sock` | +| `protocolUseSSL` | `CMD_PROTOCOL_USESSL` | `true` if you want to serve your instance over SSL (HTTPS), `false` if you want to use plain HTTP | `true` | +| `useSSL` | | `false`, the communications between HedgeDoc and the proxy are unencrypted | `false` | +| `urlAddPort` | `CMD_URL_ADDPORT` | `false`, HedgeDoc should not append its port to the URLs it links | `false` | +| `hsts.enable` | `CMD_HSTS_ENABLE` | `true` if you host over SSL, `false` otherwise | `true` | + +## Reverse Proxy config + +### Generic + +The reverse proxy must allow websocket `Upgrade` requests at path `/sockets.io/`. + +It must pass through the scheme used by the client (http or https). + +### Nginx + +Here is an example configuration for Nginx. + +``` +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} +server { + server_name hedgedoc.example.com; + + location / { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /socket.io/ { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + } + + listen [::]:443 ssl http2; + listen 443 ssl http2; + ssl_certificate fullchain.pem; + ssl_certificate_key privkey.pem; + include options-ssl-nginx.conf; + ssl_dhparam ssl-dhparams.pem; +} +``` + +### Apache + +You will need these modules enabled: `proxy`, `proxy_http` and `proxy_wstunnel`. +Here is an example config snippet: + +``` + + ServerName hedgedoc.example.com + + RewriteEngine on + RewriteCond %{REQUEST_URI} ^/socket.io [NC] + RewriteCond %{HTTP:Upgrade} =websocket [NC] + RewriteRule /(.*) ws://127.0.0.1:3000/$1 [P,L] + + ProxyPass / http://127.0.0.1:3000/ + ProxyPassReverse / http://127.0.0.1:3000/ + + RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME} + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + SSLCertificateFile /etc/letsencrypt/live/hedgedoc.example.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/hedgedoc.example.com/privkey.pem + Include /etc/letsencrypt/options-ssl-apache.conf + +``` + diff --git a/docs/content/setup/yunohost.md b/docs/content/setup/yunohost.md new file mode 100644 index 000000000..05f0073e0 --- /dev/null +++ b/docs/content/setup/yunohost.md @@ -0,0 +1,9 @@ +YunoHost +=== + +HedgeDoc is available as a 1-click install on [YunoHost](https://yunohost.org/). YunoHost is a Debian GNU/Linux based +distribution packaged with free software that automates the installation of a personal web server. + +[![Install HedgeDoc with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=hedgedoc) + +The source code for the package can be found [here](https://github.com/YunoHost-Apps/hedgedoc_ynh). diff --git a/docs/slide-options.md b/docs/content/slide-options.md similarity index 100% rename from docs/slide-options.md rename to docs/content/slide-options.md diff --git a/docs/content/theme/styles/hedgedoc-color.css b/docs/content/theme/styles/hedgedoc-color.css new file mode 100644 index 000000000..319bf8302 --- /dev/null +++ b/docs/content/theme/styles/hedgedoc-color.css @@ -0,0 +1,14 @@ +[data-md-color-primary=hedgedoc] { + --md-primary-fg-color: #b51f08; + --md-primary-fg-color--light: #b51f08; + --md-primary-fg-color--dark: #b51f08; + --md-primary-bg-color: hsla(0, 0%, 100%, 1); + --md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7); +} + +[data-md-color-accent=hedgedoc] { + --md-accent-fg-color: #b51f08; + --md-accent-fg-color--transparent: hsla(348, 100%, 55%, 0.1); + --md-accent-bg-color: hsla(0, 0%, 100%, 1); + --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); +} diff --git a/docs/content/url-scheme.md b/docs/content/url-scheme.md new file mode 100644 index 000000000..c8b0ee7db --- /dev/null +++ b/docs/content/url-scheme.md @@ -0,0 +1,39 @@ +# URL scheme + +HedgeDoc has three different modes for viewing a stored note. Each mode has a slightly different URL for accessing it. +This document gives an overview about these URLs. +We assume that you replace `pad.example.com` with the domain of your instance. + +## Default (random) + +When you create a new note by clicking the "New note" button, your note is given a long random id and a random short-id. +The long id is needed for accessing the editor and the live-update view. The short-id is used for the "published" +version of a note that is read-only and does not update in realtime as well as for the presentation mode. + +| example URL | prefix | mode | content updates | +| -------------------------------------- | ------ | ----------------- | --------------- | +| pad.example.com/Ndmv3oCyREKZMjSGR9uhnQ | *none* | editor | in realtime | +| pad.example.com/s/ByXF7k-YI | s/ | read-only version | on reload | +| pad.example.com/p/ByXF7k-YI | p/ | presentation mode | on reload | + +## FreeURL mode + +If the setting `CMD_ALLOW_FREEURL` is enabled, users may create notes with a custom alias URL by just visiting the +editor version of a custom alias. The published version and the presentation mode may also be accessed with the custom +alias. + +| example URL | prefix | mode | content updates | +| --------------------------------- | ------ | ----------------- | --------------- | +| pad.example.com/my-awesome-note | *none* | editor | in realtime | +| pad.example.com/s/my-awesome-note | s/ | read-only version | on reload | +| pad.example.com/p/my-awesome-note | p/ | presentation mode | on reload | + +## Different editor modes + +The editor has three different sub-modes. All of these update the content in realtime. + +| example URL | icon in the navbar | behaviour | +| ------------------------------- | -------------------| ----------------------------------------------- | +| pad.example.com/longnoteid?edit | pencil | Full-screen markdown editor for the content | +| pad.example.com/longnoteid?view | eye | Full-screen view of the note without the editor | +| pad.example.com/longnoteid?both | columns | markdown editor and view mode side-by-side | diff --git a/docs/dev/api.md b/docs/dev/api.md deleted file mode 100644 index c27e1d4a6..000000000 --- a/docs/dev/api.md +++ /dev/null @@ -1,42 +0,0 @@ -# API documentation -Several tasks of CodiMD can be automated through HTTP requests. -The available endpoints for this api are described in this document. -For code-autogeneration there is an OpenAPIv3-compatible description available [here](openapi.yml). - -## Notes -These endpoints create notes, return information about them or export them. -You have to replace _\_ with either the alias or id of a note you want to work on. - -| Endpoint | HTTP-Method | Description | -|---|---|---| -| `/new` | `GET` | **Creates a new note.**
A random id will be assigned and the content will equal to the template (blank by default). After note creation a redirect is issued to the created note. | -| `/new` | `POST` | **Imports some markdown data into a new note.**
A random id will be assigned and the content will equal to the body of the received HTTP-request. The `Content-Type: text/markdown` header should be set on this request. | -| `/new/` | `POST` | **Imports some markdown data into a new note with a given alias.**
This endpoint equals to the above one except that the alias from the url will be assigned to the note if [FreeURL-mode](../configuration-env-vars.md#users-and-privileges) is enabled. | -| `//download` or `/s//download` | `GET` | **Returns the raw markdown content of a note.** | -| `//publish` | `GET` | **Redirects to the published version of the note.** | -| `//slide` | `GET` | **Redirects to the slide-presentation of the note.**
This is only useful on notes which are designed to be slides. | -| `//info` | `GET` | **Returns metadata about the note.**
This includes the title and description of the note as well as the creation date and viewcount. The data is returned as a JSON object. | -| `//revision` | `GET` | **Returns a list of the available note revisions.**
The list is returned as a JSON object with an array of revision-id and length associations. The revision-id equals to the timestamp when the revision was saved. | -| `//revision/` | `GET` | **Returns the revision of the note with some metadata.**
The revision is returned as a JSON object with the content of the note and the authorship. | -| `//gist` | `GET` | **Creates a new GitHub Gist with the note's content.**
If [GitHub integration](../configuration-env-vars.md#github-login) is configured, the user will be redirected to GitHub and a new Gist with the content of the note will be created. | - -## User / History -These endpoints return information about the current logged-in user and it's note history. If no user is logged-in, the most of this requests will fail with either a HTTP 403 or a JSON object containing `{"status":"forbidden"}`. - -| Endpoint | HTTP-Method | Description | -|---|---|---| -| `/me` | `GET` | **Returns the profile data of the current logged-in user.**
The data is returned as a JSON object containing the user-id, the user's name and a url to the profile picture. | -| `/me/export` | `GET` | **Exports a zip-archive with all notes of the current user.** | -| `/history` | `GET` | **Returns a list of the last viewed notes.**
The list is returned as a JSON object with an array containing for each entry it's id, title, tags, last visit time and pinned status. | -| `/history` | `POST` | **Replace user's history with a new one.**
The body must be form-encoded and contain a field `history` with a JSON-encoded array like its returned from the server when exporting the history. | -| `/history` | `DELETE` | **Deletes the user's history.** | -| `/history/` | `POST` | **Toggles the pinned status in the history for a note.**
The body must be form-encoded and contain a field `pinned` that is either `true` or `false`. -| `/history/` | `DELETE` | **Deletes a note from the user's history.** | - - -## CodiMD-server -These endpoints return information about the running CodiMD instance. - -| Endpoint | HTTP-Method | Description | -|---|---|---| -| `/status` | `GET` | **Returns the current status of the CodiMD instance.**
The data is returned as a JSON object containing the number of notes stored on the server, (distinct) online users and more. | diff --git a/docs/images/CodiMD-1.3.2-features.png b/docs/images/CodiMD-1.3.2-features.png deleted file mode 100644 index 952efe304a91a927ab6a403964462b9215172d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81971 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

!`X_}wDMdGH*o7=CBbWa| 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 D(Uuw! diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 000000000..d563115c5 --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,61 @@ +site_name: HedgeDoc +site_url: https://docs.hedgedoc.org +repo_url: https://github.com/hedgedoc/hedgedoc +site_description: 'HedgeDoc Documentation' +site_author: 'HedgeDoc Developers' +docs_dir: content +nav: + - Home: index.md + - Installation: + - 'Manual Installation': setup/manual-setup.md + - 'Reverse Proxy': setup/reverse-proxy.md + - Docker: setup/docker.md + - Cloudron: setup/cloudron.md + - Heroku: setup/heroku.md + - LinuxServer: setup/docker-linuxserver.md + - Yunohost: setup/yunohost.md + - Guides: + - Authentication: + - LDAP: guides/auth/ldap-ad.md + - OAuth: guides/auth/oauth.md + - SAML: guides/auth/saml.md + - SAML Keycloak: guides/auth/saml-keycloak.md + - SAML Onelogin: guides/auth/saml-onelogin.md + - GitHub: guides/auth/github.md + - GitLab: guides/auth/gitlab-self-hosted.md + - Keycloak: guides/auth/keycloak.md + - NextCloud: guides/auth/nextcloud.md + - Twitter: guides/auth/twitter.md + - Migrate from Etherpad: guides/migrate-etherpad.md + - Breaking Changes: guides/migrations-and-breaking-changes.md + - Media Backend: + - Minion: guides/minio-image-upload.md + - S3: guides/s3-image-upload.md + - Setting Terms: guides/providing-terms.md + - Configuration: configuration.md + - Developer: + - 'Getting Started': dev/getting-started.md + - API: dev/api.md + - 'Operational Transformation': dev/ot.md + - Webpack: dev/webpack.md + - 'Documentation': dev/documentation.md + - FAQ: https://hedgedoc.org/faq +markdown_extensions: + - toc: + permalink: true +theme: + name: 'material' + language: en + favicon: images/favicon.png + logo: images/logo.svg + palette: + scheme: light + primary: 'hedgedoc' + accent: 'hedgedoc' + features: + - navigation.tabs + - navigation.sections + - toc.integrate + +extra_css: + - theme/styles/hedgedoc-color.css diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..57d08e48d --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +mkdocs==1.1.2 +mkdocs-material==6.2.3 +pymdown-extensions==8.1 diff --git a/docs/setup/docker-linuxserver.md b/docs/setup/docker-linuxserver.md deleted file mode 100644 index 2b6c09738..000000000 --- a/docs/setup/docker-linuxserver.md +++ /dev/null @@ -1,14 +0,0 @@ -LinuxServer.io CodiMD Image -=== -[![LinuxServer.io Discord](https://img.shields.io/discord/354974912613449730.svg?logo=discord&label=LSIO%20Discord&style=flat-square)](https://discord.gg/YWrKVTn)[![container version badge](https://images.microbadger.com/badges/version/linuxserver/codimd.svg)](https://microbadger.com/images/linuxserver/codimd "Get your own version badge on microbadger.com")[![container image size badge](https://images.microbadger.com/badges/image/linuxserver/codimd.svg)](https://microbadger.com/images/linuxserver/codimd "Get your own version badge on microbadger.com")![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/codimd.svg)![Docker Stars](https://img.shields.io/docker/stars/linuxserver/codimd.svg)[![Build Status](https://ci.linuxserver.io/buildStatus/icon?job=Docker-Pipeline-Builders/docker-codimd/master)](https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-codimd/job/master/)[![LinuxServer.io CI summary](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/codimd/latest/badge.svg)](https://lsio-ci.ams3.digitaloceanspaces.com/linuxserver/codimd/latest/index.html) - -[LinuxServer.io](https://linuxserver.io) have created an Ubuntu-based multi-arch container image for x86-64, arm64 and armhf. - -- It supports all the environment variables detailed in the [configuration documentation](../configuration-env-vars.md) to modify it according to your needs. - -- It gets rebuilt on new releases from CodiMD and also weekly if necessary to update any other package changes in the underlying container, making it easy to keep your CodiMD instance up to date. - -- It also details how to easily [utilize Docker networking to reverse proxy](https://github.com/linuxserver/docker-codimd/#application-setup) CodiMD using their [LetsEncrypt docker image](https://github.com/linuxserver/docker-letsencrypt) - -In order to contribute check the LinuxServer.io [GitHub repository](https://github.com/linuxserver/docker-codimd/) for CodiMD. -And to find all tags and versions of the image, check the [Docker Hub repository](https://hub.docker.com/r/linuxserver/codimd). From e4e024dc29599714cadb8af27cd85683aac01202 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 17 Nov 2020 13:02:04 +0000 Subject: [PATCH 06/10] Add renovate.json Signed-off-by: Renovate Bot (cherry picked from commit ed44a40c10ebe636ba71ef86092a8c1ef08847c9) --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000..f45d8f110 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From 810b4cf0222a30d572498a0f6158c389a8f2272d Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 17 Nov 2020 14:27:01 +0100 Subject: [PATCH 07/10] Renovate: Group various packages Signed-off-by: David Mehren (cherry picked from commit 63654aa910bd4f125f98a23f8dc2491b9d5f368f) --- renovate.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index f45d8f110..b50650702 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,13 @@ { "extends": [ - "config:base" + "config:base", + "group:definitelyTyped", + "group:socketio", + "group:linters", + "group:test", + "group:nextjsMonorepo" + ], + "labels": [ + "dependencies" ] } From 78d4d47dc8c7dbbbb63927de75953fa66dd298b0 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 17 Nov 2020 14:36:07 +0100 Subject: [PATCH 08/10] Renovate: Disable major updates We won't do any major updates for 1.7 release anyway. Signed-off-by: David Mehren (cherry picked from commit c479ab0d593726df5913075735228597e9a584d2) --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index b50650702..90ca8639f 100644 --- a/renovate.json +++ b/renovate.json @@ -5,7 +5,8 @@ "group:socketio", "group:linters", "group:test", - "group:nextjsMonorepo" + "group:nextjsMonorepo", + ":disableMajorUpdates" ], "labels": [ "dependencies" From 7473f0be86d659e95eb73291abb2ce7326d86193 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Tue, 17 Nov 2020 14:52:40 +0100 Subject: [PATCH 09/10] Renovate: Enable sign-off Signed-off-by: David Mehren (cherry picked from commit 087f0a7c988dc19ae61ad3e6f8242d8b2ac63ac3) --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 90ca8639f..ecf2ad1e6 100644 --- a/renovate.json +++ b/renovate.json @@ -6,7 +6,8 @@ "group:linters", "group:test", "group:nextjsMonorepo", - ":disableMajorUpdates" + ":disableMajorUpdates", + ":gitSignOff" ], "labels": [ "dependencies" From e86551b2665c88b39be5f030b53b382f6ff3def1 Mon Sep 17 00:00:00 2001 From: Tilman Vatteroth Date: Mon, 30 Nov 2020 18:07:54 +0100 Subject: [PATCH 10/10] Change label used by renovate to "type: maintenance" Signed-off-by: Tilman Vatteroth (cherry picked from commit 8600c2dae65c8d2cd3500beb22c90b76ece8f59c) --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index ecf2ad1e6..910e0a2bf 100644 --- a/renovate.json +++ b/renovate.json @@ -10,6 +10,6 @@ ":gitSignOff" ], "labels": [ - "dependencies" + "type: maintenance" ] }