diff --git a/README.md b/README.md index 2d6efaf5..614e27c1 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,3 @@ -# Short Notice from the maintainer - -After 6 years of more or less intensive programming on Calibre-Web, I need a break. -The last few months, maintaining Calibre-Web has felt more like work than a hobby. I felt pressured and teased by people to solve "their" problems and merge PRs for "their" Calibre-Web. -I have turned off all notifications from Github/Discord and will now concentrate undisturbed on the development of “my” Calibre-Web over the next few weeks/months. -I will look into the issues and maybe also the PRs from time to time, but don't expect a quick response from me. - # Calibre-Web Calibre-Web is a web app that offers a clean and intuitive interface for browsing, reading, and downloading eBooks using a valid [Calibre](https://calibre-ebook.com) database. @@ -89,8 +82,9 @@ Refer to the Wiki for additional installation examples: [manual installation](ht ## Requirements -- Python 3.5+ +- Python 3.7+ - [Imagemagick](https://imagemagick.org/script/download.php) for cover extraction from EPUBs (Windows users may need to install [Ghostscript](https://ghostscript.com/releases/gsdnld.html) for PDF cover extraction) +- Windows users need to install [libmagic for 32bit python](https://gnuwin32.sourceforge.net/downlinks/file.php) or [libmagic for 64bit python](https://github.com/nscaife/file-windows/releases/tag/20170108), depending on the python version; The files need to be installed in path (e.g. script folder of your Calibre-Web venv, or in the root folder of Calibre-Web - Optional: [Calibre desktop program](https://calibre-ebook.com/download) for on-the-fly conversion and metadata editing (set "calibre's converter tool" path on the setup page) - Optional: [Kepubify tool](https://github.com/pgaskin/kepubify/releases/latest) for Kobo device support (place the binary in `/opt/kepubify` on Linux or `C:\Program Files\kepubify` on Windows) diff --git a/SECURITY.md b/SECURITY.md index e4ab1a8d..62b42a63 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -10,41 +10,46 @@ To receive fixes for security vulnerabilities it is required to always upgrade t ## History -| Fixed in | Description |CVE number | -|---------------|--------------------------------------------------------------------------------------------------------------------|---------| -| 3rd July 2018 | Guest access acts as a backdoor || -| V 0.6.7 | Hardcoded secret key for sessions |CVE-2020-12627 | -| V 0.6.13 | Calibre-Web Metadata cross site scripting |CVE-2021-25964| -| V 0.6.13 | Name of Shelves are only visible to users who can access the corresponding shelf Thanks to @ibarrionuevo || -| V 0.6.13 | JavaScript could get executed in the description field. Thanks to @ranjit-git and Hagai Wechsler (WhiteSource) || -| V 0.6.13 | JavaScript could get executed in a custom column of type "comment" field || -| V 0.6.13 | JavaScript could get executed after converting a book to another format with a title containing javascript code || -| V 0.6.13 | JavaScript could get executed after converting a book to another format with a username containing javascript code || -| V 0.6.13 | JavaScript could get executed in the description series, categories or publishers title || -| V 0.6.13 | JavaScript could get executed in the shelf title || -| V 0.6.13 | Login with the old session cookie after logout. Thanks to @ibarrionuevo || -| V 0.6.14 | CSRF was possible. Thanks to @mik317 and Hagai Wechsler (WhiteSource) |CVE-2021-25965| -| V 0.6.14 | Migrated some routes to POST-requests (CSRF protection). Thanks to @scara31 |CVE-2021-4164| -| V 0.6.15 | Fix for "javascript:" script links in identifier. Thanks to @scara31 |CVE-2021-4170| -| V 0.6.15 | Cross-Site Scripting vulnerability on uploaded cover file names. Thanks to @ibarrionuevo || -| V 0.6.15 | Creating public shelfs is now denied if user is missing the edit public shelf right. Thanks to @ibarrionuevo || -| V 0.6.15 | Changed error message in case of trying to delete a shelf unauthorized. Thanks to @ibarrionuevo || -| V 0.6.16 | JavaScript could get executed on authors page. Thanks to @alicaz |CVE-2022-0352| -| V 0.6.16 | Localhost can no longer be used to upload covers. Thanks to @scara31 |CVE-2022-0339| -| V 0.6.16 | Another case where public shelfs could be created without permission is prevented. Thanks to @nhiephon |CVE-2022-0273| -| V 0.6.16 | It's prevented to get the name of a private shelfs. Thanks to @nhiephon |CVE-2022-0405| -| V 0.6.17 | The SSRF Protection can no longer be bypassed via an HTTP redirect. Thanks to @416e6e61 |CVE-2022-0767| -| V 0.6.17 | The SSRF Protection can no longer be bypassed via 0.0.0.0 and it's ipv6 equivalent. Thanks to @r0hanSH |CVE-2022-0766| -| V 0.6.18 | Possible SQL Injection is prevented in user table Thanks to Iman Sharafaldin (Forward Security) |CVE-2022-30765| -| V 0.6.18 | The SSRF protection no longer can be bypassed by IPV6/IPV4 embedding. Thanks to @416e6e61 |CVE-2022-0939| -| V 0.6.18 | The SSRF protection no longer can be bypassed to connect to other servers in the local network. Thanks to @michaellrowley |CVE-2022-0990| -| V 0.6.20 | Credentials for emails are now stored encrypted || -| V 0.6.20 | Login is rate limited || -| V 0.6.20 | Passwordstrength can be forced || -| V 0.6.21 | SMTP server credentials are no longer returned to client || -| V 0.6.21 | Cross-site scripting (XSS) stored in href bypasses filter using data wrapper no longer possible || -| V 0.6.21 | Cross-site scripting (XSS) is no longer possible via pathchooser || -| V 0.6.21 | Error Handling at non existent rating, language, and user downloaded books was fixed || +| Fixed in | Description |CVE number | +|---------------|--------------------------------------------------------------------------------------------------------------------------------|---------| +| 3rd July 2018 | Guest access acts as a backdoor || +| V 0.6.7 | Hardcoded secret key for sessions |CVE-2020-12627 | +| V 0.6.13 | Calibre-Web Metadata cross site scripting |CVE-2021-25964| +| V 0.6.13 | Name of Shelves are only visible to users who can access the corresponding shelf Thanks to @ibarrionuevo || +| V 0.6.13 | JavaScript could get executed in the description field. Thanks to @ranjit-git and Hagai Wechsler (WhiteSource) || +| V 0.6.13 | JavaScript could get executed in a custom column of type "comment" field || +| V 0.6.13 | JavaScript could get executed after converting a book to another format with a title containing javascript code || +| V 0.6.13 | JavaScript could get executed after converting a book to another format with a username containing javascript code || +| V 0.6.13 | JavaScript could get executed in the description series, categories or publishers title || +| V 0.6.13 | JavaScript could get executed in the shelf title || +| V 0.6.13 | Login with the old session cookie after logout. Thanks to @ibarrionuevo || +| V 0.6.14 | CSRF was possible. Thanks to @mik317 and Hagai Wechsler (WhiteSource) |CVE-2021-25965| +| V 0.6.14 | Migrated some routes to POST-requests (CSRF protection). Thanks to @scara31 |CVE-2021-4164| +| V 0.6.15 | Fix for "javascript:" script links in identifier. Thanks to @scara31 |CVE-2021-4170| +| V 0.6.15 | Cross-Site Scripting vulnerability on uploaded cover file names. Thanks to @ibarrionuevo || +| V 0.6.15 | Creating public shelfs is now denied if user is missing the edit public shelf right. Thanks to @ibarrionuevo || +| V 0.6.15 | Changed error message in case of trying to delete a shelf unauthorized. Thanks to @ibarrionuevo || +| V 0.6.16 | JavaScript could get executed on authors page. Thanks to @alicaz |CVE-2022-0352| +| V 0.6.16 | Localhost can no longer be used to upload covers. Thanks to @scara31 |CVE-2022-0339| +| V 0.6.16 | Another case where public shelfs could be created without permission is prevented. Thanks to @nhiephon |CVE-2022-0273| +| V 0.6.16 | It's prevented to get the name of a private shelfs. Thanks to @nhiephon |CVE-2022-0405| +| V 0.6.17 | The SSRF Protection can no longer be bypassed via an HTTP redirect. Thanks to @416e6e61 |CVE-2022-0767| +| V 0.6.17 | The SSRF Protection can no longer be bypassed via 0.0.0.0 and it's ipv6 equivalent. Thanks to @r0hanSH |CVE-2022-0766| +| V 0.6.18 | Possible SQL Injection is prevented in user table Thanks to Iman Sharafaldin (Forward Security) |CVE-2022-30765| +| V 0.6.18 | The SSRF protection no longer can be bypassed by IPV6/IPV4 embedding. Thanks to @416e6e61 |CVE-2022-0939| +| V 0.6.18 | The SSRF protection no longer can be bypassed to connect to other servers in the local network. Thanks to @michaellrowley |CVE-2022-0990| +| V 0.6.20 | Credentials for emails are now stored encrypted || +| V 0.6.20 | Login is rate limited || +| V 0.6.20 | Passwordstrength can be forced || +| V 0.6.21 | SMTP server credentials are no longer returned to client || +| V 0.6.21 | Cross-site scripting (XSS) stored in href bypasses filter using data wrapper no longer possible || +| V 0.6.21 | Cross-site scripting (XSS) is no longer possible via pathchooser || +| V 0.6.21 | Error Handling at non existent rating, language, and user downloaded books was fixed || +| V 0.6.22 | Upload mimetype is checked to prevent malicious file content in the books library || +| V 0.6.22 | Cross-site scripting (XSS) stored in comments section is prevented better (switching from lxml to bleach for sanitizing strings) || +| V 0.6.23 | Cookies are no longer stored for opds basic authentication and proxy authentication || + + ## Statement regarding Log4j (CVE-2021-44228 and related) diff --git a/cps.py b/cps.py index 8af6cef1..039c2a5e 100755 --- a/cps.py +++ b/cps.py @@ -30,19 +30,15 @@ from cps.main import main def hide_console_windows(): import ctypes - import os - hwnd = ctypes.windll.kernel32.GetConsoleWindow() - if hwnd != 0: - try: - import win32process - except ImportError: - print("To hide console window install 'pywin32' using 'pip install pywin32'") - return - ctypes.windll.user32.ShowWindow(hwnd, 0) - ctypes.windll.kernel32.CloseHandle(hwnd) - _, pid = win32process.GetWindowThreadProcessId(hwnd) - os.system('taskkill /PID ' + str(pid) + ' /f') + kernel32 = ctypes.WinDLL('kernel32') + user32 = ctypes.WinDLL('user32') + + SW_HIDE = 0 + + hWnd = kernel32.GetConsoleWindow() + if hWnd: + user32.ShowWindow(hWnd, SW_HIDE) if __name__ == '__main__': diff --git a/cps/MyLoginManager.py b/cps/MyLoginManager.py index c4025819..44907045 100644 --- a/cps/MyLoginManager.py +++ b/cps/MyLoginManager.py @@ -20,11 +20,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - -from flask_login import LoginManager, confirm_login -from flask import session, current_app -from flask_login.utils import decode_cookie -from flask_login.signals import user_loaded_from_cookie +from .cw_login import LoginManager +from flask import session class MyLoginManager(LoginManager): @@ -36,18 +33,5 @@ class MyLoginManager(LoginManager): return super(). _session_protection_failed() return False - def _load_user_from_remember_cookie(self, cookie): - user_id = decode_cookie(cookie) - if user_id is not None: - session["_user_id"] = user_id - session["_fresh"] = False - user = None - if self._user_callback: - user = self._user_callback(user_id) - if user is not None: - app = current_app._get_current_object() - user_loaded_from_cookie.send(app, user=user) - # if session was restored from remember me cookie make login valid - confirm_login() - return user - return None + + diff --git a/cps/__init__.py b/cps/__init__.py old mode 100755 new mode 100644 index 642f6a6e..8b1fecdd --- a/cps/__init__.py +++ b/cps/__init__.py @@ -72,6 +72,9 @@ mimetypes.add_type('application/mpeg', '.mpeg') mimetypes.add_type('audio/mpeg', '.mp3') mimetypes.add_type('audio/x-m4a', '.m4a') mimetypes.add_type('audio/x-m4a', '.m4b') +mimetypes.add_type('audio/x-hx-aac-adts', '.aac') +mimetypes.add_type('audio/vnd.dolby.dd-raw', '.ac3') +mimetypes.add_type('video/x-ms-asf', '.asf') mimetypes.add_type('audio/ogg', '.ogg') mimetypes.add_type('application/ogg', '.oga') mimetypes.add_type('text/css', '.css') @@ -83,9 +86,11 @@ log = logger.create() app = Flask(__name__) app.config.update( SESSION_COOKIE_HTTPONLY=True, - SESSION_COOKIE_SAMESITE='Lax', - REMEMBER_COOKIE_SAMESITE='Lax', # will be available in flask-login 0.5.1 earliest - WTF_CSRF_SSL_STRICT=False + SESSION_COOKIE_SAMESITE='Strict', + REMEMBER_COOKIE_SAMESITE='Strict', + WTF_CSRF_SSL_STRICT=False, + SESSION_COOKIE_NAME=os.environ.get('COOKIE_PREFIX', "") + "session", + REMEMBER_COOKIE_NAME=os.environ.get('COOKIE_PREFIX', "") + "remember_token" ) lm = MyLoginManager() diff --git a/cps/about.py b/cps/about.py index 1d081fe2..9053dfee 100644 --- a/cps/about.py +++ b/cps/about.py @@ -23,15 +23,16 @@ import sys import platform import sqlite3 +import importlib from collections import OrderedDict import flask -import flask_login import jinja2 from flask_babel import gettext as _ from . import db, calibre_db, converter, uploader, constants, dep_check from .render_template import render_title_template +from .usermanagement import user_login_required about = flask.Blueprint('about', __name__) @@ -41,8 +42,11 @@ req = dep_check.load_dependencies(False) opt = dep_check.load_dependencies(True) for i in (req + opt): modules[i[1]] = i[0] -modules['Jinja2'] = jinja2.__version__ -modules['pySqlite'] = sqlite3.version +modules['Jinja2'] = importlib.metadata.version("jinja2") +try: + modules['pySqlite'] = sqlite3.version +except Exception: + pass modules['SQLite'] = sqlite3.sqlite_version sorted_modules = OrderedDict((sorted(modules.items(), key=lambda x: x[0].casefold()))) @@ -74,7 +78,7 @@ def collect_stats(): @about.route("/stats") -@flask_login.login_required +@user_login_required def stats(): counter = calibre_db.session.query(db.Books).count() authors = calibre_db.session.query(db.Authors).count() diff --git a/cps/admin.py b/cps/admin.py old mode 100755 new mode 100644 index f5b9e6c3..5daad958 --- a/cps/admin.py +++ b/cps/admin.py @@ -34,10 +34,9 @@ from urllib.parse import urlparse from flask import Blueprint, flash, redirect, url_for, abort, request, make_response, send_from_directory, g, Response from markupsafe import Markup -from flask_login import login_required, current_user, logout_user +from .cw_login import current_user from flask_babel import gettext as _ from flask_babel import get_locale, format_time, format_datetime, format_timedelta -from flask import session as flask_session from sqlalchemy import and_ from sqlalchemy.orm.attributes import flag_modified from sqlalchemy.exc import IntegrityError, OperationalError, InvalidRequestError @@ -52,8 +51,10 @@ from .embed_helper import get_calibre_binarypath from .gdriveutils import is_gdrive_ready, gdrive_support from .render_template import render_title_template, get_sidebar_config from .services.worker import WorkerThread +from .usermanagement import user_login_required from .babel import get_available_translations, get_available_locale, get_user_locale_language from . import debug_info +from .string_helper import strip_whitespaces log = logger.create() @@ -103,13 +104,13 @@ def admin_required(f): @admi.before_app_request def before_request(): - try: - if not ub.check_user_session(current_user.id, - flask_session.get('_id')) and 'opds' not in request.path \ - and config.config_session == 1: - logout_user() - except AttributeError: - pass # ? fails on requesting /ajax/emailstat during restart ? + #try: + #if not ub.check_user_session(current_user.id, + # flask_session.get('_id')) and 'opds' not in request.path \ + # and config.config_session == 1: + # logout_user() + #except AttributeError: + # pass # ? fails on requesting /ajax/emailstat during restart ? g.constants = constants g.google_site_verification = os.getenv('GOOGLE_SITE_VERIFICATION', '') g.allow_registration = config.config_public_reg @@ -129,14 +130,14 @@ def before_request(): return redirect(url_for('admin.db_configuration')) -@admi.route("/admin") -@login_required -def admin_forbidden(): - abort(403) +#@admi.route("/admin") +#@user_login_required +#def admin_forbidden(): +# abort(403) @admi.route("/shutdown", methods=["POST"]) -@login_required +@user_login_required @admin_required def shutdown(): task = request.get_json().get('parameter', -1) @@ -165,7 +166,7 @@ def shutdown(): @admi.route("/metadata_backup", methods=["POST"]) -@login_required +@user_login_required @admin_required def queue_metadata_backup(): show_text = {} @@ -189,7 +190,7 @@ def reconnect(): @admi.route("/ajax/updateThumbnails", methods=['POST']) @admin_required -@login_required +@user_login_required def update_thumbnails(): content = config.get_scheduled_task_settings() if content['schedule_generate_book_covers']: @@ -199,7 +200,7 @@ def update_thumbnails(): @admi.route("/admin/view") -@login_required +@user_login_required @admin_required def admin(): version = updater_thread.get_current_version_info() @@ -233,7 +234,7 @@ def admin(): @admi.route("/admin/dbconfig", methods=["GET", "POST"]) -@login_required +@user_login_required @admin_required def db_configuration(): if request.method == "POST": @@ -242,7 +243,7 @@ def db_configuration(): @admi.route("/admin/config", methods=["GET"]) -@login_required +@user_login_required @admin_required def configuration(): return render_title_template("config_edit.html", @@ -253,28 +254,28 @@ def configuration(): @admi.route("/admin/ajaxconfig", methods=["POST"]) -@login_required +@user_login_required @admin_required def ajax_config(): return _configuration_update_helper() @admi.route("/admin/ajaxdbconfig", methods=["POST"]) -@login_required +@user_login_required @admin_required def ajax_db_config(): return _db_configuration_update_helper() @admi.route("/admin/alive", methods=["GET"]) -@login_required +@user_login_required @admin_required def calibreweb_alive(): return "", 200 @admi.route("/admin/viewconfig") -@login_required +@user_login_required @admin_required def view_configuration(): read_column = calibre_db.session.query(db.CustomColumns) \ @@ -291,7 +292,7 @@ def view_configuration(): @admi.route("/admin/usertable") -@login_required +@user_login_required @admin_required def edit_user_table(): visibility = current_user.view_settings.get('useredit', {}) @@ -326,7 +327,7 @@ def edit_user_table(): @admi.route("/ajax/listusers") -@login_required +@user_login_required @admin_required def list_users(): off = int(request.args.get("offset") or 0) @@ -377,7 +378,7 @@ def list_users(): @admi.route("/ajax/deleteuser", methods=['POST']) -@login_required +@user_login_required @admin_required def delete_user(): user_ids = request.form.to_dict(flat=False) @@ -412,7 +413,7 @@ def delete_user(): @admi.route("/ajax/getlocale") -@login_required +@user_login_required @admin_required def table_get_locale(): locale = get_available_locale() @@ -424,7 +425,7 @@ def table_get_locale(): @admi.route("/ajax/getdefaultlanguage") -@login_required +@user_login_required @admin_required def table_get_default_lang(): languages = calibre_db.speaking_language() @@ -436,7 +437,7 @@ def table_get_default_lang(): @admi.route("/ajax/editlistusers/", methods=['POST']) -@login_required +@user_login_required @admin_required def edit_list_user(param): vals = request.form.to_dict(flat=False) @@ -463,9 +464,9 @@ def edit_list_user(param): if 'value[]' in vals: setattr(user, param, prepare_tags(user, vals['action'][0], param, vals['value[]'])) else: - setattr(user, param, vals['value'].strip()) + setattr(user, param, strip_whitespaces(vals['value'])) else: - vals['value'] = vals['value'].strip() + vals['value'] = strip_whitespaces(vals['value']) if param == 'name': if user.name == "Guest": raise Exception(_("Guest Name can't be changed")) @@ -541,7 +542,7 @@ def edit_list_user(param): @admi.route("/ajax/user_table_settings", methods=['POST']) -@login_required +@user_login_required @admin_required def update_table_settings(): current_user.view_settings['useredit'] = json.loads(request.data) @@ -558,7 +559,7 @@ def update_table_settings(): @admi.route("/admin/viewconfig", methods=["POST"]) -@login_required +@user_login_required @admin_required def update_view_configuration(): to_save = request.form.to_dict() @@ -603,7 +604,7 @@ def update_view_configuration(): @admi.route("/ajax/loaddialogtexts/", methods=['POST']) -@login_required +@user_login_required def load_dialogtexts(element_id): texts = {"header": "", "main": "", "valid": 1} if element_id == "config_delete_kobo_token": @@ -639,7 +640,7 @@ def load_dialogtexts(element_id): @admi.route("/ajax/editdomain/", methods=['POST']) -@login_required +@user_login_required @admin_required def edit_domain(allow): # POST /post @@ -653,7 +654,7 @@ def edit_domain(allow): @admi.route("/ajax/adddomain/", methods=['POST']) -@login_required +@user_login_required @admin_required def add_domain(allow): domain_name = request.form.to_dict()['domainname'].replace('*', '%').replace('?', '_').lower() @@ -667,7 +668,7 @@ def add_domain(allow): @admi.route("/ajax/deletedomain", methods=['POST']) -@login_required +@user_login_required @admin_required def delete_domain(): try: @@ -685,12 +686,12 @@ def delete_domain(): @admi.route("/ajax/domainlist/") -@login_required +@user_login_required @admin_required def list_domain(allow): answer = ub.session.query(ub.Registration).filter(ub.Registration.allow == allow).all() json_dumps = json.dumps([{"domain": r.domain.replace('%', '*').replace('_', '?'), "id": r.id} for r in answer]) - js = json.dumps(json_dumps.replace('"', "'")).lstrip('"').strip('"') + js = json.dumps(json_dumps.replace('"', "'")).strip('"') response = make_response(js.replace("'", '"')) response.headers["Content-Type"] = "application/json; charset=utf-8" return response @@ -698,7 +699,7 @@ def list_domain(allow): @admi.route("/ajax/editrestriction/", defaults={"user_id": 0}, methods=['POST']) @admi.route("/ajax/editrestriction//", methods=['POST']) -@login_required +@user_login_required @admin_required def edit_restriction(res_type, user_id): element = request.form.to_dict() @@ -764,14 +765,14 @@ def edit_restriction(res_type, user_id): @admi.route("/ajax/addrestriction/", methods=['POST']) -@login_required +@user_login_required @admin_required def add_user_0_restriction(res_type): return add_restriction(res_type, 0) @admi.route("/ajax/addrestriction//", methods=['POST']) -@login_required +@user_login_required @admin_required def add_restriction(res_type, user_id): element = request.form.to_dict() @@ -817,14 +818,14 @@ def add_restriction(res_type, user_id): @admi.route("/ajax/deleterestriction/", methods=['POST']) -@login_required +@user_login_required @admin_required def delete_user_0_restriction(res_type): return delete_restriction(res_type, 0) @admi.route("/ajax/deleterestriction//", methods=['POST']) -@login_required +@user_login_required @admin_required def delete_restriction(res_type, user_id): element = request.form.to_dict() @@ -872,7 +873,7 @@ def delete_restriction(res_type, user_id): @admi.route("/ajax/listrestriction/", defaults={"user_id": 0}) @admi.route("/ajax/listrestriction//") -@login_required +@user_login_required @admin_required def list_restriction(res_type, user_id): if res_type == 0: # Tags as template @@ -916,20 +917,20 @@ def list_restriction(res_type, user_id): @admi.route("/ajax/fullsync", methods=["POST"]) -@login_required +@user_login_required def ajax_self_fullsync(): return do_full_kobo_sync(current_user.id) @admi.route("/ajax/fullsync/", methods=["POST"]) -@login_required +@user_login_required @admin_required def ajax_fullsync(userid): return do_full_kobo_sync(userid) @admi.route("/ajax/pathchooser/") -@login_required +@user_login_required @admin_required def ajax_pathchooser(): return pathchooser() @@ -1100,7 +1101,7 @@ def _config_checkbox_int(to_save, x): def _config_string(to_save, x): - return config.set_from_dictionary(to_save, x, lambda y: y.strip().strip(u'\u200B\u200C\u200D\ufeff') if y else y) + return config.set_from_dictionary(to_save, x, lambda y: strip_whitespaces(y) if y else y) def _configuration_gdrive_helper(to_save): @@ -1246,7 +1247,7 @@ def _configuration_ldap_helper(to_save): @admi.route("/ajax/simulatedbchange", methods=['POST']) -@login_required +@user_login_required @admin_required def simulatedbchange(): db_change, db_valid = _db_simulate_change() @@ -1254,7 +1255,7 @@ def simulatedbchange(): @admi.route("/admin/user/new", methods=["GET", "POST"]) -@login_required +@user_login_required @admin_required def new_user(): content = ub.User() @@ -1276,7 +1277,7 @@ def new_user(): @admi.route("/admin/mailsettings", methods=["GET"]) -@login_required +@user_login_required @admin_required def edit_mailsettings(): content = config.get_mail_settings() @@ -1285,7 +1286,7 @@ def edit_mailsettings(): @admi.route("/admin/mailsettings", methods=["POST"]) -@login_required +@user_login_required @admin_required def update_mailsettings(): to_save = request.form.to_dict() @@ -1311,9 +1312,9 @@ def update_mailsettings(): if to_save.get("mail_password_e", ""): _config_string(to_save, "mail_password_e") _config_int(to_save, "mail_size", lambda y: int(y) * 1024 * 1024) - config.mail_server = to_save.get('mail_server', "").strip() - config.mail_from = to_save.get('mail_from', "").strip() - config.mail_login = to_save.get('mail_login', "").strip() + config.mail_server = strip_whitespaces(to_save.get('mail_server', "")) + config.mail_from = strip_whitespaces(to_save.get('mail_from', "")) + config.mail_login = strip_whitespaces(to_save.get('mail_login', "")) try: config.save() except (OperationalError, InvalidRequestError) as e: @@ -1342,7 +1343,7 @@ def update_mailsettings(): @admi.route("/admin/scheduledtasks") -@login_required +@user_login_required @admin_required def edit_scheduledtasks(): content = config.get_scheduled_task_settings() @@ -1363,7 +1364,7 @@ def edit_scheduledtasks(): @admi.route("/admin/scheduledtasks", methods=["POST"]) -@login_required +@user_login_required @admin_required def update_scheduledtasks(): error = False @@ -1406,7 +1407,7 @@ def update_scheduledtasks(): @admi.route("/admin/user/", methods=["GET", "POST"]) -@login_required +@user_login_required @admin_required def edit_user(user_id): content = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() # type: ub.User @@ -1435,7 +1436,7 @@ def edit_user(user_id): @admi.route("/admin/resetpassword/", methods=["POST"]) -@login_required +@user_login_required @admin_required def reset_user_password(user_id): if current_user is not None and current_user.is_authenticated: @@ -1453,7 +1454,7 @@ def reset_user_password(user_id): @admi.route("/admin/logfile") -@login_required +@user_login_required @admin_required def view_logfile(): logfiles = {0: logger.get_logfile(config.config_logfile), @@ -1467,7 +1468,7 @@ def view_logfile(): @admi.route("/ajax/log/") -@login_required +@user_login_required @admin_required def send_logfile(logtype): if logtype == 1: @@ -1483,7 +1484,7 @@ def send_logfile(logtype): @admi.route("/admin/logdownload/") -@login_required +@user_login_required @admin_required def download_log(logtype): if logtype == 0: @@ -1498,14 +1499,14 @@ def download_log(logtype): @admi.route("/admin/debug") -@login_required +@user_login_required @admin_required def download_debug(): return debug_info.send_debug() @admi.route("/get_update_status", methods=['GET']) -@login_required +@user_login_required @admin_required def get_update_status(): if feature_support['updater']: @@ -1516,7 +1517,7 @@ def get_update_status(): @admi.route("/get_updater_status", methods=['GET', 'POST']) -@login_required +@user_login_required @admin_required def get_updater_status(): status = {} @@ -1611,7 +1612,7 @@ def ldap_import_create_user(user, user_data): @admi.route('/import_ldap_users', methods=["POST"]) -@login_required +@user_login_required @admin_required def import_ldap_users(): showtext = {} @@ -1666,7 +1667,7 @@ def import_ldap_users(): @admi.route("/ajax/canceltask", methods=['POST']) -@login_required +@user_login_required @admin_required def cancel_task(): task_id = request.get_json().get('task_id', None) @@ -1678,10 +1679,10 @@ def cancel_task(): def _db_simulate_change(): param = request.form.to_dict() to_save = dict() - to_save['config_calibre_dir'] = re.sub(r'[\\/]metadata\.db$', + to_save['config_calibre_dir'] = strip_whitespaces(re.sub(r'[\\/]metadata\.db$', '', param['config_calibre_dir'], - flags=re.IGNORECASE).strip() + flags=re.IGNORECASE)) db_valid, db_change = calibre_db.check_valid_db(to_save["config_calibre_dir"], ub.app_DB_path, config.config_calibre_uuid) @@ -1775,9 +1776,8 @@ def _configuration_update_helper(): if "config_upload_formats" in to_save: to_save["config_upload_formats"] = ','.join( - helper.uniq([x.lstrip().rstrip().lower() for x in to_save["config_upload_formats"].split(',')])) + helper.uniq([x.strip().lower() for x in to_save["config_upload_formats"].split(',')])) _config_string(to_save, "config_upload_formats") - # constants.EXTENSIONS_UPLOAD = config.config_upload_formats.split(',') _config_string(to_save, "config_calibre") _config_string(to_save, "config_binariesdir") diff --git a/cps/audio.py b/cps/audio.py new file mode 100644 index 00000000..8fd28c81 --- /dev/null +++ b/cps/audio.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2024 Ozzieisaacs +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os + +import mutagen +import base64 +from . import cover, logger + +from cps.constants import BookMeta + +log = logger.create() + +def get_audio_file_info(tmp_file_path, original_file_extension, original_file_name): + tmp_cover_name = None + audio_file = mutagen.File(tmp_file_path) + comments = None + if original_file_extension in [".mp3", ".wav", ".aiff"]: + cover_data = list() + for key, val in audio_file.tags.items(): + if key.startswith("APIC:"): + cover_data.append(val) + if key.startswith("COMM:"): + comments = val.text[0] + title = audio_file.tags.get('TIT2').text[0] if "TIT2" in audio_file.tags else None + author = audio_file.tags.get('TPE1').text[0] if "TPE1" in audio_file.tags else None + if author is None: + author = audio_file.tags.get('TPE2').text[0] if "TPE2" in audio_file.tags else None + tags = audio_file.tags.get('TCON').text[0] if "TCON" in audio_file.tags else None # Genre + series = audio_file.tags.get('TALB').text[0] if "TALB" in audio_file.tags else None# Album + series_id = audio_file.tags.get('TRCK').text[0] if "TRCK" in audio_file.tags else None # track no. + publisher = audio_file.tags.get('TPUB').text[0] if "TPUB" in audio_file.tags else None + pubdate = str(audio_file.tags.get('TDRL').text[0]) if "TDRL" in audio_file.tags else None + if not pubdate: + pubdate = str(audio_file.tags.get('TDRC').text[0]) if "TDRC" in audio_file.tags else None + if not pubdate: + pubdate = str(audio_file.tags.get('TDOR').text[0]) if "TDOR" in audio_file.tags else None + if cover_data: + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + cover_info = cover_data[0] + for dat in cover_data: + if dat.type == mutagen.id3.PictureType.COVER_FRONT: + cover_info = dat + break + cover.cover_processing(tmp_file_path, cover_info.data, "." + cover_info.mime[-3:]) + elif original_file_extension in [".ogg", ".flac", ".opus", ".ogv"]: + title = audio_file.tags.get('TITLE')[0] if "TITLE" in audio_file else None + author = audio_file.tags.get('ARTIST')[0] if "ARTIST" in audio_file else None + comments = audio_file.tags.get('COMMENTS')[0] if "COMMENTS" in audio_file else None + tags = audio_file.tags.get('GENRE')[0] if "GENRE" in audio_file else None # Genre + series = audio_file.tags.get('ALBUM')[0] if "ALBUM" in audio_file else None + series_id = audio_file.tags.get('TRACKNUMBER')[0] if "TRACKNUMBER" in audio_file else None + publisher = audio_file.tags.get('LABEL')[0] if "LABEL" in audio_file else None + pubdate = audio_file.tags.get('DATE')[0] if "DATE" in audio_file else None + cover_data = audio_file.tags.get('METADATA_BLOCK_PICTURE') + if cover_data: + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + cover_info = mutagen.flac.Picture(base64.b64decode(cover_data[0])) + cover.cover_processing(tmp_file_path, cover_info.data, "." + cover_info.mime[-3:]) + if hasattr(audio_file, "pictures"): + cover_info = audio_file.pictures[0] + for dat in audio_file.pictures: + if dat.type == mutagen.id3.PictureType.COVER_FRONT: + cover_info = dat + break + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + cover.cover_processing(tmp_file_path, cover_info.data, "." + cover_info.mime[-3:]) + elif original_file_extension in [".aac"]: + title = audio_file.tags.get('Title').value if "Title" in audio_file else None + author = audio_file.tags.get('Artist').value if "Artist" in audio_file else None + comments = audio_file.tags.get('Comment').value if "Comment" in audio_file else None + tags = audio_file.tags.get('Genre').value if "Genre" in audio_file else None + series = audio_file.tags.get('Album').value if "Album" in audio_file else None + series_id = audio_file.tags.get('Track').value if "Track" in audio_file else None + publisher = audio_file.tags.get('Label').value if "Label" in audio_file else None + pubdate = audio_file.tags.get('Year').value if "Year" in audio_file else None + cover_data = audio_file.tags['Cover Art (Front)'] + if cover_data: + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + with open(tmp_cover_name, "wb") as cover_file: + cover_file.write(cover_data.value.split(b"\x00",1)[1]) + elif original_file_extension in [".asf"]: + title = audio_file.tags.get('Title')[0].value if "Title" in audio_file else None + author = audio_file.tags.get('Artist')[0].value if "Artist" in audio_file else None + comments = audio_file.tags.get('Comments')[0].value if "Comments" in audio_file else None + tags = audio_file.tags.get('Genre')[0].value if "Genre" in audio_file else None + series = audio_file.tags.get('Album')[0].value if "Album" in audio_file else None + series_id = audio_file.tags.get('Track')[0].value if "Track" in audio_file else None + publisher = audio_file.tags.get('Label')[0].value if "Label" in audio_file else None + pubdate = audio_file.tags.get('Year')[0].value if "Year" in audio_file else None + cover_data = audio_file.tags.get('WM/Picture', None) + if cover_data: + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + with open(tmp_cover_name, "wb") as cover_file: + cover_file.write(cover_data[0].value) + elif original_file_extension in [".mp4", ".m4a", ".m4b"]: + title = audio_file.tags.get('©nam')[0] if "©nam" in audio_file.tags else None + author = audio_file.tags.get('©ART')[0] if "©ART" in audio_file.tags else None + comments = audio_file.tags.get('©cmt')[0] if "©cmt" in audio_file.tags else None + tags = audio_file.tags.get('©gen')[0] if "©gen" in audio_file.tags else None + series = audio_file.tags.get('©alb')[0] if "©alb" in audio_file.tags else None + series_id = str(audio_file.tags.get('trkn')[0][0]) if "trkn" in audio_file.tags else None + publisher = "" + pubdate = audio_file.tags.get('©day')[0] if "©day" in audio_file.tags else None + cover_data = audio_file.tags.get('covr', None) + if cover_data: + tmp_cover_name = os.path.join(os.path.dirname(tmp_file_path), 'cover.jpg') + cover_type = None + for c in cover_data: + if c.imageformat == mutagen.mp4.AtomDataType.JPEG: + cover_type =".jpg" + cover_bin = c + break + elif c.imageformat == mutagen.mp4.AtomDataType.PNG: + cover_type = ".png" + cover_bin = c + break + if cover_type: + cover.cover_processing(tmp_file_path, cover_bin, cover_type) + else: + logger.error("Unknown covertype in file {} ".format(original_file_name)) + + return BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=title or original_file_name , + author="Unknown" if author is None else author, + cover=tmp_cover_name, + description="" if comments is None else comments, + tags="" if tags is None else tags, + series="" if series is None else series, + series_id="1" if series_id is None else series_id.split("/")[0], + languages="", + publisher= "" if publisher is None else publisher, + pubdate="" if pubdate is None else pubdate, + identifiers=[], + ) diff --git a/cps/babel.py b/cps/babel.py index 21ed4fc7..cf043d52 100644 --- a/cps/babel.py +++ b/cps/babel.py @@ -2,7 +2,7 @@ from babel import negotiate_locale from flask_babel import Babel, Locale from babel.core import UnknownLocaleError from flask import request -from flask_login import current_user +from .cw_login import current_user from . import logger diff --git a/cps/config_sql.py b/cps/config_sql.py index 044c12b5..6a840af5 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -35,7 +35,7 @@ except ImportError: from . import constants, logger from .subproc_wrapper import process_wait - +from .string_helper import strip_whitespaces log = logger.create() _Base = declarative_base() @@ -288,19 +288,19 @@ class ConfigSQL(object): def list_denied_tags(self): mct = self.config_denied_tags or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_allowed_tags(self): mct = self.config_allowed_tags or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_denied_column_values(self): mct = self.config_denied_column_value or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_allowed_column_values(self): mct = self.config_allowed_column_value or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def get_log_level(self): return logger.get_level_name(self.config_log_level) @@ -372,7 +372,7 @@ class ConfigSQL(object): db_file = os.path.join(self.config_calibre_dir, 'metadata.db') have_metadata_db = os.path.isfile(db_file) self.db_configured = have_metadata_db - # constants.EXTENSIONS_UPLOAD = [x.lstrip().rstrip().lower() for x in self.config_upload_formats.split(',')] + from . import cli_param if os.environ.get('FLASK_DEBUG'): logfile = logger.setup(logger.LOG_TO_STDOUT, logger.logging.DEBUG) diff --git a/cps/constants.py b/cps/constants.py index 13146845..3d1f0dfe 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -175,7 +175,7 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d 'series_id, languages, publisher, pubdate, identifiers') # python build process likes to have x.y.zbw -> b for beta and w a counting number -STABLE_VERSION = {'version': '0.6.23b'} +STABLE_VERSION = {'version': '0.6.24b'} NIGHTLY_VERSION = dict() NIGHTLY_VERSION[0] = '$Format:%H$' @@ -193,7 +193,7 @@ THUMBNAIL_TYPE_AUTHOR = 3 COVER_THUMBNAIL_ORIGINAL = 0 COVER_THUMBNAIL_SMALL = 1 COVER_THUMBNAIL_MEDIUM = 2 -COVER_THUMBNAIL_LARGE = 3 +COVER_THUMBNAIL_LARGE = 4 # clean-up the module namespace del sys, os, namedtuple diff --git a/cps/cw_login/__init__.py b/cps/cw_login/__init__.py new file mode 100644 index 00000000..f2822baa --- /dev/null +++ b/cps/cw_login/__init__.py @@ -0,0 +1,98 @@ +# from .__about__ import __version__ +from .config import AUTH_HEADER_NAME +from .config import COOKIE_DURATION +from .config import COOKIE_HTTPONLY +from .config import COOKIE_NAME +from .config import COOKIE_SECURE +from .config import ID_ATTRIBUTE +from .config import LOGIN_MESSAGE +from .config import LOGIN_MESSAGE_CATEGORY +from .config import REFRESH_MESSAGE +from .config import REFRESH_MESSAGE_CATEGORY +from .login_manager import LoginManager +from .mixins import AnonymousUserMixin +from .mixins import UserMixin +from .signals import session_protected +from .signals import user_accessed +from .signals import user_loaded_from_cookie +from .signals import user_loaded_from_request +from .signals import user_logged_in +from .signals import user_logged_out +from .signals import user_login_confirmed +from .signals import user_needs_refresh +from .signals import user_unauthorized +# from .test_client import FlaskLoginClient +from .utils import confirm_login +from .utils import current_user +from .utils import decode_cookie +from .utils import encode_cookie +from .utils import fresh_login_required +from .utils import login_fresh +from .utils import login_remembered +from .utils import login_required +from .utils import login_url +from .utils import login_user +from .utils import logout_user +from .utils import make_next_param +from .utils import set_login_view + +__version_info__ = ("0", "6", "3") +__version__ = ".".join(__version_info__) + + +__all__ = [ + "__version__", + "AUTH_HEADER_NAME", + "COOKIE_DURATION", + "COOKIE_HTTPONLY", + "COOKIE_NAME", + "COOKIE_SECURE", + "ID_ATTRIBUTE", + "LOGIN_MESSAGE", + "LOGIN_MESSAGE_CATEGORY", + "REFRESH_MESSAGE", + "REFRESH_MESSAGE_CATEGORY", + "LoginManager", + "AnonymousUserMixin", + "UserMixin", + "session_protected", + "user_accessed", + "user_loaded_from_cookie", + "user_loaded_from_request", + "user_logged_in", + "user_logged_out", + "user_login_confirmed", + "user_needs_refresh", + "user_unauthorized", + # "FlaskLoginClient", + "confirm_login", + "current_user", + "decode_cookie", + "encode_cookie", + "fresh_login_required", + "login_fresh", + "login_remembered", + "login_required", + "login_url", + "login_user", + "logout_user", + "make_next_param", + "set_login_view", +] + + +def __getattr__(name): + if name == "user_loaded_from_header": + import warnings + from .signals import _user_loaded_from_header + + warnings.warn( + "'user_loaded_from_header' is deprecated and will be" + " removed in Flask-Login 0.7. Use" + " 'user_loaded_from_request' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _user_loaded_from_header + + raise AttributeError(name) diff --git a/cps/cw_login/config.py b/cps/cw_login/config.py new file mode 100644 index 00000000..fe2db2c5 --- /dev/null +++ b/cps/cw_login/config.py @@ -0,0 +1,55 @@ +from datetime import timedelta + +#: The default name of the "remember me" cookie (``remember_token``) +COOKIE_NAME = "remember_token" + +#: The default time before the "remember me" cookie expires (365 days). +COOKIE_DURATION = timedelta(days=365) + +#: Whether the "remember me" cookie requires Secure; defaults to ``False`` +COOKIE_SECURE = False + +#: Whether the "remember me" cookie uses HttpOnly or not; defaults to ``True`` +COOKIE_HTTPONLY = True + +#: Whether the "remember me" cookie requires same origin; defaults to ``None`` +COOKIE_SAMESITE = None + +#: The default flash message to display when users need to log in. +LOGIN_MESSAGE = "Please log in to access this page." + +#: The default flash message category to display when users need to log in. +LOGIN_MESSAGE_CATEGORY = "message" + +#: The default flash message to display when users need to reauthenticate. +REFRESH_MESSAGE = "Please reauthenticate to access this page." + +#: The default flash message category to display when users need to +#: reauthenticate. +REFRESH_MESSAGE_CATEGORY = "message" + +#: The default attribute to retreive the str id of the user +ID_ATTRIBUTE = "get_id" + +#: Default name of the auth header (``Authorization``) +AUTH_HEADER_NAME = "Authorization" + +#: A set of session keys that are populated by Flask-Login. Use this set to +#: purge keys safely and accurately. +SESSION_KEYS = { + "_user_id", + "_remember", + "_remember_seconds", + "_id", + "_fresh", + "next", +} + +#: A set of HTTP methods which are exempt from `login_required` and +#: `fresh_login_required`. By default, this is just ``OPTIONS``. +EXEMPT_METHODS = {"OPTIONS"} + +#: If true, the page the user is attempting to access is stored in the session +#: rather than a url parameter when redirecting to the login view; defaults to +#: ``False``. +USE_SESSION_FOR_NEXT = False diff --git a/cps/cw_login/login_manager.py b/cps/cw_login/login_manager.py new file mode 100644 index 00000000..a3714af6 --- /dev/null +++ b/cps/cw_login/login_manager.py @@ -0,0 +1,555 @@ +from datetime import datetime +from datetime import timezone +from datetime import timedelta +import hashlib + +from flask import abort +from flask import current_app +from flask import flash +from flask import g +from flask import has_app_context +from flask import redirect +from flask import request +from flask import session +from itsdangerous import URLSafeSerializer +from flask.json.tag import TaggedJSONSerializer + +from .config import AUTH_HEADER_NAME +from .config import COOKIE_DURATION +from .config import COOKIE_HTTPONLY +from .config import COOKIE_NAME +from .config import COOKIE_SAMESITE +from .config import COOKIE_SECURE +from .config import ID_ATTRIBUTE +from .config import LOGIN_MESSAGE +from .config import LOGIN_MESSAGE_CATEGORY +from .config import REFRESH_MESSAGE +from .config import REFRESH_MESSAGE_CATEGORY +from .config import SESSION_KEYS +from .config import USE_SESSION_FOR_NEXT +from .mixins import AnonymousUserMixin +from .signals import session_protected +from .signals import user_accessed +from .signals import user_loaded_from_cookie +from .signals import user_loaded_from_request +from .signals import user_needs_refresh +from .signals import user_unauthorized +from .utils import _create_identifier +from .utils import _user_context_processor +from .utils import confirm_login +from .utils import expand_login_view +from .utils import login_url as make_login_url +from .utils import make_next_param + + +class LoginManager: + """This object is used to hold the settings used for logging in. Instances + of :class:`LoginManager` are *not* bound to specific apps, so you can + create one in the main body of your code and then bind it to your + app in a factory function. + """ + + def __init__(self, app=None, add_context_processor=True): + #: A class or factory function that produces an anonymous user, which + #: is used when no one is logged in. + self.anonymous_user = AnonymousUserMixin + + #: The name of the view to redirect to when the user needs to log in. + #: (This can be an absolute URL as well, if your authentication + #: machinery is external to your application.) + self.login_view = None + + #: Names of views to redirect to when the user needs to log in, + #: per blueprint. If the key value is set to None the value of + #: :attr:`login_view` will be used instead. + self.blueprint_login_views = {} + + #: The message to flash when a user is redirected to the login page. + self.login_message = LOGIN_MESSAGE + + #: The message category to flash when a user is redirected to the login + #: page. + self.login_message_category = LOGIN_MESSAGE_CATEGORY + + #: The name of the view to redirect to when the user needs to + #: reauthenticate. + self.refresh_view = None + + #: The message to flash when a user is redirected to the 'needs + #: refresh' page. + self.needs_refresh_message = REFRESH_MESSAGE + + #: The message category to flash when a user is redirected to the + #: 'needs refresh' page. + self.needs_refresh_message_category = REFRESH_MESSAGE_CATEGORY + + #: The mode to use session protection in. This can be either + #: ``'basic'`` (the default) or ``'strong'``, or ``None`` to disable + #: it. + self.session_protection = "basic" + + #: If present, used to translate flash messages ``self.login_message`` + #: and ``self.needs_refresh_message`` + self.localize_callback = None + + self.unauthorized_callback = None + + self.needs_refresh_callback = None + + self.id_attribute = ID_ATTRIBUTE + + self._user_callback = None + + self._header_callback = None + + self._request_callback = None + + self._session_identifier_generator = _create_identifier + + if app is not None: + self.init_app(app, add_context_processor) + + def setup_app(self, app, add_context_processor=True): # pragma: no cover + """ + This method has been deprecated. Please use + :meth:`LoginManager.init_app` instead. + """ + import warnings + + warnings.warn( + "'setup_app' is deprecated and will be removed in" + " Flask-Login 0.7. Use 'init_app' instead.", + DeprecationWarning, + stacklevel=2, + ) + self.init_app(app, add_context_processor) + + def init_app(self, app, add_context_processor=True): + """ + Configures an application. This registers an `after_request` call, and + attaches this `LoginManager` to it as `app.login_manager`. + + :param app: The :class:`flask.Flask` object to configure. + :type app: :class:`flask.Flask` + :param add_context_processor: Whether to add a context processor to + the app that adds a `current_user` variable to the template. + Defaults to ``True``. + :type add_context_processor: bool + """ + app.login_manager = self + app.after_request(self._update_remember_cookie) + + if add_context_processor: + app.context_processor(_user_context_processor) + + def unauthorized(self): + """ + This is called when the user is required to log in. If you register a + callback with :meth:`LoginManager.unauthorized_handler`, then it will + be called. Otherwise, it will take the following actions: + + - Flash :attr:`LoginManager.login_message` to the user. + + - If the app is using blueprints find the login view for + the current blueprint using `blueprint_login_views`. If the app + is not using blueprints or the login view for the current + blueprint is not specified use the value of `login_view`. + + - Redirect the user to the login view. (The page they were + attempting to access will be passed in the ``next`` query + string variable, so you can redirect there if present instead + of the homepage. Alternatively, it will be added to the session + as ``next`` if USE_SESSION_FOR_NEXT is set.) + + If :attr:`LoginManager.login_view` is not defined, then it will simply + raise a HTTP 401 (Unauthorized) error instead. + + This should be returned from a view or before/after_request function, + otherwise the redirect will have no effect. + """ + user_unauthorized.send(current_app._get_current_object()) + + if self.unauthorized_callback: + return self.unauthorized_callback() + + if request.blueprint in self.blueprint_login_views: + login_view = self.blueprint_login_views[request.blueprint] + else: + login_view = self.login_view + + if not login_view: + abort(401) + + if self.login_message: + if self.localize_callback is not None: + flash( + self.localize_callback(self.login_message), + category=self.login_message_category, + ) + else: + flash(self.login_message, category=self.login_message_category) + + config = current_app.config + if config.get("USE_SESSION_FOR_NEXT", USE_SESSION_FOR_NEXT): + login_url = expand_login_view(login_view) + session["_id"] = self._session_identifier_generator() + session["next"] = make_next_param(login_url, request.url) + redirect_url = make_login_url(login_view) + else: + redirect_url = make_login_url(login_view, next_url=request.url) + + return redirect(redirect_url) + + def user_loader(self, callback): + """ + This sets the callback for reloading a user from the session. The + function you set should take a user ID (a ``str``) and return a + user object, or ``None`` if the user does not exist. + + :param callback: The callback for retrieving a user object. + :type callback: callable + """ + self._user_callback = callback + return self.user_callback + + @property + def user_callback(self): + """Gets the user_loader callback set by user_loader decorator.""" + return self._user_callback + + def request_loader(self, callback): + """ + This sets the callback for loading a user from a Flask request. + The function you set should take Flask request object and + return a user object, or `None` if the user does not exist. + + :param callback: The callback for retrieving a user object. + :type callback: callable + """ + self._request_callback = callback + return self.request_callback + + @property + def request_callback(self): + """Gets the request_loader callback set by request_loader decorator.""" + return self._request_callback + + def unauthorized_handler(self, callback): + """ + This will set the callback for the `unauthorized` method, which among + other things is used by `login_required`. It takes no arguments, and + should return a response to be sent to the user instead of their + normal view. + + :param callback: The callback for unauthorized users. + :type callback: callable + """ + self.unauthorized_callback = callback + return callback + + def needs_refresh_handler(self, callback): + """ + This will set the callback for the `needs_refresh` method, which among + other things is used by `fresh_login_required`. It takes no arguments, + and should return a response to be sent to the user instead of their + normal view. + + :param callback: The callback for unauthorized users. + :type callback: callable + """ + self.needs_refresh_callback = callback + return callback + + def needs_refresh(self): + """ + This is called when the user is logged in, but they need to be + reauthenticated because their session is stale. If you register a + callback with `needs_refresh_handler`, then it will be called. + Otherwise, it will take the following actions: + + - Flash :attr:`LoginManager.needs_refresh_message` to the user. + + - Redirect the user to :attr:`LoginManager.refresh_view`. (The page + they were attempting to access will be passed in the ``next`` + query string variable, so you can redirect there if present + instead of the homepage.) + + If :attr:`LoginManager.refresh_view` is not defined, then it will + simply raise a HTTP 401 (Unauthorized) error instead. + + This should be returned from a view or before/after_request function, + otherwise the redirect will have no effect. + """ + user_needs_refresh.send(current_app._get_current_object()) + + if self.needs_refresh_callback: + return self.needs_refresh_callback() + + if not self.refresh_view: + abort(401) + + if self.needs_refresh_message: + if self.localize_callback is not None: + flash( + self.localize_callback(self.needs_refresh_message), + category=self.needs_refresh_message_category, + ) + else: + flash( + self.needs_refresh_message, + category=self.needs_refresh_message_category, + ) + + config = current_app.config + if config.get("USE_SESSION_FOR_NEXT", USE_SESSION_FOR_NEXT): + login_url = expand_login_view(self.refresh_view) + session["_id"] = self._session_identifier_generator() + session["next"] = make_next_param(login_url, request.url) + redirect_url = make_login_url(self.refresh_view) + else: + login_url = self.refresh_view + redirect_url = make_login_url(login_url, next_url=request.url) + + return redirect(redirect_url) + + def _update_request_context_with_user(self, user=None): + """Store the given user as ctx.user.""" + + if user is None: + user = self.anonymous_user() + + g._login_user = user + + def _load_user(self): + """Loads user from session or remember_me cookie as applicable""" + + if self._user_callback is None and self._request_callback is None: + raise Exception( + "Missing user_loader or request_loader. Refer to " + "https://flask-login.readthedocs.io/#how-it-works " + "for more info." + ) + + user_accessed.send(current_app._get_current_object()) + + # Check SESSION_PROTECTION + if self._session_protection_failed(): + return self._update_request_context_with_user() + + user = None + + # Load user from Flask Session + user_id = session.get("_user_id") + user_random = session.get("_random") + user_session_key = session.get("_id") + if (user_id is not None + and user_random is not None + and user_session_key is not None + and self._user_callback is not None): + user = self._user_callback(user_id, user_random, user_session_key) + + # Load user from Remember Me Cookie or Request Loader + if user is None: + config = current_app.config + cookie_name = config.get("REMEMBER_COOKIE_NAME", COOKIE_NAME) + header_name = config.get("AUTH_HEADER_NAME", AUTH_HEADER_NAME) + has_cookie = ( + cookie_name in request.cookies and session.get("_remember") != "clear" + ) + if has_cookie: + cookie = request.cookies[cookie_name] + user = self._load_user_from_remember_cookie(cookie) + elif self._request_callback: + user = self._load_user_from_request(request) + elif header_name in request.headers: + header = request.headers[header_name] + user = self._load_user_from_header(header) + if not user: + self._update_request_context_with_user() + return self._update_request_context_with_user(user) + + def _session_protection_failed(self): + sess = session._get_current_object() + ident = self._session_identifier_generator() + + app = current_app._get_current_object() + mode = app.config.get("SESSION_PROTECTION", self.session_protection) + + if not mode or mode not in ["basic", "strong"]: + return False + + # if the sess is empty, it's an anonymous user or just logged out + # so we can skip this + if sess and ident != sess.get("_id", None): + if mode == "basic" or sess.permanent: + if sess.get("_fresh") is not False: + sess["_fresh"] = False + session_protected.send(app) + return False + elif mode == "strong": + for k in SESSION_KEYS: + sess.pop(k, None) + + sess["_remember"] = "clear" + session_protected.send(app) + return True + + return False + + def _load_user_from_remember_cookie(self, cookie): + signer_kwargs = dict( + key_derivation="hmac", digest_method=hashlib.sha1 + ) + try: + remember_dict = URLSafeSerializer( + current_app.secret_key, + salt="remember", + serializer=TaggedJSONSerializer(), + signer_kwargs=signer_kwargs, + ).loads(cookie) + except Exception: + return None + + if remember_dict['user'] is not None: + session["_user_id"] = remember_dict['user'] + if "_random" not in session: + session["_random"] = remember_dict['random'] + session["_fresh"] = False + user = None + if self._user_callback: + user = self._user_callback(remember_dict['user'], session["_random"], None) + if user is not None: + app = current_app._get_current_object() + user_loaded_from_cookie.send(app, user=user) + # if session was restored from remember me cookie make login valid + confirm_login() + return user + return None + + def _load_user_from_header(self, header): + if self._header_callback: + user = self._header_callback(header) + if user is not None: + app = current_app._get_current_object() + + from .signals import _user_loaded_from_header + + _user_loaded_from_header.send(app, user=user) + return user + return None + + def _load_user_from_request(self, request): + if self._request_callback: + user = self._request_callback(request) + if user is not None: + app = current_app._get_current_object() + user_loaded_from_request.send(app, user=user) + return user + return None + + def _update_remember_cookie(self, response): + # Don't modify the session unless there's something to do. + if "_remember" not in session and current_app.config.get( + "REMEMBER_COOKIE_REFRESH_EACH_REQUEST" + ): + session["_remember"] = "set" + + if "_remember" in session: + operation = session.pop("_remember", None) + + if operation == "set" and "_user_id" in session: + self._set_cookie(response) + elif operation == "clear": + self._clear_cookie(response) + + return response + + def _set_cookie(self, response): + # cookie settings + config = current_app.config + cookie_name = config.get("REMEMBER_COOKIE_NAME", COOKIE_NAME) + domain = config.get("REMEMBER_COOKIE_DOMAIN") + path = config.get("REMEMBER_COOKIE_PATH", "/") + + secure = config.get("REMEMBER_COOKIE_SECURE", COOKIE_SECURE) + httponly = config.get("REMEMBER_COOKIE_HTTPONLY", COOKIE_HTTPONLY) + samesite = config.get("REMEMBER_COOKIE_SAMESITE", COOKIE_SAMESITE) + + if "_remember_seconds" in session: + duration = timedelta(seconds=session["_remember_seconds"]) + else: + duration = config.get("REMEMBER_COOKIE_DURATION", COOKIE_DURATION) + + # prepare data + max_age = int(current_app.permanent_session_lifetime.total_seconds()) + signer_kwargs = dict( + key_derivation="hmac", digest_method=hashlib.sha1 + ) + # save + data = URLSafeSerializer( + current_app.secret_key, + salt="remember", + serializer=TaggedJSONSerializer(), + signer_kwargs=signer_kwargs, + ).dumps({"user":session["_user_id"], "random":session["_random"]}) + + if isinstance(duration, int): + duration = timedelta(seconds=duration) + + try: + expires = datetime.now(timezone.utc) + duration + except TypeError as e: + raise Exception( + "REMEMBER_COOKIE_DURATION must be a datetime.timedelta," + f" instead got: {duration}" + ) from e + + # actually set it + response.set_cookie( + cookie_name, + value=data, + expires=expires, + domain=domain, + path=path, + secure=secure, + httponly=httponly, + samesite=samesite, + ) + + def _clear_cookie(self, response): + config = current_app.config + cookie_name = config.get("REMEMBER_COOKIE_NAME", COOKIE_NAME) + domain = config.get("REMEMBER_COOKIE_DOMAIN") + path = config.get("REMEMBER_COOKIE_PATH", "/") + response.delete_cookie(cookie_name, domain=domain, path=path) + + @property + def _login_disabled(self): + """Legacy property, use app.config['LOGIN_DISABLED'] instead.""" + import warnings + + warnings.warn( + "'_login_disabled' is deprecated and will be removed in" + " Flask-Login 0.7. Use 'LOGIN_DISABLED' in 'app.config'" + " instead.", + DeprecationWarning, + stacklevel=2, + ) + + if has_app_context(): + return current_app.config.get("LOGIN_DISABLED", False) + return False + + @_login_disabled.setter + def _login_disabled(self, newvalue): + """Legacy property setter, use app.config['LOGIN_DISABLED'] instead.""" + import warnings + + warnings.warn( + "'_login_disabled' is deprecated and will be removed in" + " Flask-Login 0.7. Use 'LOGIN_DISABLED' in 'app.config'" + " instead.", + DeprecationWarning, + stacklevel=2, + ) + current_app.config["LOGIN_DISABLED"] = newvalue diff --git a/cps/cw_login/mixins.py b/cps/cw_login/mixins.py new file mode 100644 index 00000000..0b3a71bb --- /dev/null +++ b/cps/cw_login/mixins.py @@ -0,0 +1,65 @@ +class UserMixin: + """ + This provides default implementations for the methods that Flask-Login + expects user objects to have. + """ + + # Python 3 implicitly set __hash__ to None if we override __eq__ + # We set it back to its default implementation + __hash__ = object.__hash__ + + @property + def is_active(self): + return True + + @property + def is_authenticated(self): + return self.is_active + + @property + def is_anonymous(self): + return False + + def get_id(self): + try: + return str(self.id) + except AttributeError: + raise NotImplementedError("No `id` attribute - override `get_id`") from None + + def __eq__(self, other): + """ + Checks the equality of two `UserMixin` objects using `get_id`. + """ + if isinstance(other, UserMixin): + return self.get_id() == other.get_id() + return NotImplemented + + def __ne__(self, other): + """ + Checks the inequality of two `UserMixin` objects using `get_id`. + """ + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + +class AnonymousUserMixin: + """ + This is the default object for representing an anonymous user. + """ + + @property + def is_authenticated(self): + return False + + @property + def is_active(self): + return False + + @property + def is_anonymous(self): + return True + + def get_id(self): + return diff --git a/cps/cw_login/signals.py b/cps/cw_login/signals.py new file mode 100644 index 00000000..cf9157f8 --- /dev/null +++ b/cps/cw_login/signals.py @@ -0,0 +1,61 @@ +from flask.signals import Namespace + +_signals = Namespace() + +#: Sent when a user is logged in. In addition to the app (which is the +#: sender), it is passed `user`, which is the user being logged in. +user_logged_in = _signals.signal("logged-in") + +#: Sent when a user is logged out. In addition to the app (which is the +#: sender), it is passed `user`, which is the user being logged out. +user_logged_out = _signals.signal("logged-out") + +#: Sent when the user is loaded from the cookie. In addition to the app (which +#: is the sender), it is passed `user`, which is the user being reloaded. +user_loaded_from_cookie = _signals.signal("loaded-from-cookie") + +#: Sent when the user is loaded from the header. In addition to the app (which +#: is the #: sender), it is passed `user`, which is the user being reloaded. +_user_loaded_from_header = _signals.signal("loaded-from-header") + +#: Sent when the user is loaded from the request. In addition to the app (which +#: is the #: sender), it is passed `user`, which is the user being reloaded. +user_loaded_from_request = _signals.signal("loaded-from-request") + +#: Sent when a user's login is confirmed, marking it as fresh. (It is not +#: called for a normal login.) +#: It receives no additional arguments besides the app. +user_login_confirmed = _signals.signal("login-confirmed") + +#: Sent when the `unauthorized` method is called on a `LoginManager`. It +#: receives no additional arguments besides the app. +user_unauthorized = _signals.signal("unauthorized") + +#: Sent when the `needs_refresh` method is called on a `LoginManager`. It +#: receives no additional arguments besides the app. +user_needs_refresh = _signals.signal("needs-refresh") + +#: Sent whenever the user is accessed/loaded +#: receives no additional arguments besides the app. +user_accessed = _signals.signal("accessed") + +#: Sent whenever session protection takes effect, and a session is either +#: marked non-fresh or deleted. It receives no additional arguments besides +#: the app. +session_protected = _signals.signal("session-protected") + + +def __getattr__(name): + if name == "user_loaded_from_header": + import warnings + + warnings.warn( + "'user_loaded_from_header' is deprecated and will be" + " removed in Flask-Login 0.7. Use" + " 'user_loaded_from_request' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _user_loaded_from_header + + raise AttributeError(name) diff --git a/cps/cw_login/utils.py b/cps/cw_login/utils.py new file mode 100644 index 00000000..b455e150 --- /dev/null +++ b/cps/cw_login/utils.py @@ -0,0 +1,424 @@ +import hmac +import os +from functools import wraps +from hashlib import sha512 +from urllib.parse import parse_qs +from urllib.parse import urlencode +from urllib.parse import urlsplit +from urllib.parse import urlunsplit + +from flask import current_app +from flask import g +from flask import has_request_context +from flask import request +from flask import session +from flask import url_for +from werkzeug.local import LocalProxy + +from .config import COOKIE_NAME +from .config import EXEMPT_METHODS +from .signals import user_logged_in +from .signals import user_logged_out +from .signals import user_login_confirmed + +#: A proxy for the current user. If no user is logged in, this will be an +#: anonymous user +current_user = LocalProxy(lambda: _get_user()) + + +def encode_cookie(payload, key=None): + """ + This will encode a ``str`` value into a cookie, and sign that cookie + with the app's secret key. + + :param payload: The value to encode, as `str`. + :type payload: str + + :param key: The key to use when creating the cookie digest. If not + specified, the SECRET_KEY value from app config will be used. + :type key: str + """ + return f"{payload}|{_cookie_digest(payload, key=key)}" + + +def decode_cookie(cookie, key=None): + """ + This decodes a cookie given by `encode_cookie`. If verification of the + cookie fails, ``None`` will be implicitly returned. + + :param cookie: An encoded cookie. + :type cookie: str + + :param key: The key to use when creating the cookie digest. If not + specified, the SECRET_KEY value from app config will be used. + :type key: str + """ + try: + payload, digest = cookie.rsplit("|", 1) + if hasattr(digest, "decode"): + digest = digest.decode("ascii") # pragma: no cover + except ValueError: + return + + if hmac.compare_digest(_cookie_digest(payload, key=key), digest): + return payload + + +def make_next_param(login_url, current_url): + """ + Reduces the scheme and host from a given URL so it can be passed to + the given `login` URL more efficiently. + + :param login_url: The login URL being redirected to. + :type login_url: str + :param current_url: The URL to reduce. + :type current_url: str + """ + l_url = urlsplit(login_url) + c_url = urlsplit(current_url) + + if (not l_url.scheme or l_url.scheme == c_url.scheme) and ( + not l_url.netloc or l_url.netloc == c_url.netloc + ): + return urlunsplit(("", "", c_url.path, c_url.query, "")) + return current_url + + +def expand_login_view(login_view): + """ + Returns the url for the login view, expanding the view name to a url if + needed. + + :param login_view: The name of the login view or a URL for the login view. + :type login_view: str + """ + if login_view.startswith(("https://", "http://", "/")): + return login_view + + return url_for(login_view) + + +def login_url(login_view, next_url=None, next_field="next"): + """ + Creates a URL for redirecting to a login page. If only `login_view` is + provided, this will just return the URL for it. If `next_url` is provided, + however, this will append a ``next=URL`` parameter to the query string + so that the login view can redirect back to that URL. Flask-Login's default + unauthorized handler uses this function when redirecting to your login url. + To force the host name used, set `FORCE_HOST_FOR_REDIRECTS` to a host. This + prevents from redirecting to external sites if request headers Host or + X-Forwarded-For are present. + + :param login_view: The name of the login view. (Alternately, the actual + URL to the login view.) + :type login_view: str + :param next_url: The URL to give the login view for redirection. + :type next_url: str + :param next_field: What field to store the next URL in. (It defaults to + ``next``.) + :type next_field: str + """ + base = expand_login_view(login_view) + + if next_url is None: + return base + + parsed_result = urlsplit(base) + md = parse_qs(parsed_result.query, keep_blank_values=True) + md[next_field] = make_next_param(base, next_url) + netloc = current_app.config.get("FORCE_HOST_FOR_REDIRECTS") or parsed_result.netloc + parsed_result = parsed_result._replace( + netloc=netloc, query=urlencode(md, doseq=True) + ) + return urlunsplit(parsed_result) + + +def login_fresh(): + """ + This returns ``True`` if the current login is fresh. + """ + return session.get("_fresh", False) + + +def login_remembered(): + """ + This returns ``True`` if the current login is remembered across sessions. + """ + config = current_app.config + cookie_name = config.get("REMEMBER_COOKIE_NAME", COOKIE_NAME) + has_cookie = cookie_name in request.cookies and session.get("_remember") != "clear" + if has_cookie: + cookie = request.cookies[cookie_name] + user_id = decode_cookie(cookie) + return user_id is not None + return False + + +def login_user(user, remember=False, duration=None, force=False, fresh=True): + """ + Logs a user in. You should pass the actual user object to this. If the + user's `is_active` property is ``False``, they will not be logged in + unless `force` is ``True``. + + This will return ``True`` if the log in attempt succeeds, and ``False`` if + it fails (i.e. because the user is inactive). + + :param user: The user object to log in. + :type user: object + :param remember: Whether to remember the user after their session expires. + Defaults to ``False``. + :type remember: bool + :param duration: The amount of time before the remember cookie expires. If + ``None`` the value set in the settings is used. Defaults to ``None``. + :type duration: :class:`datetime.timedelta` + :param force: If the user is inactive, setting this to ``True`` will log + them in regardless. Defaults to ``False``. + :type force: bool + :param fresh: setting this to ``False`` will log in the user with a session + marked as not "fresh". Defaults to ``True``. + :type fresh: bool + """ + if not force and not user.is_active: + return False + + user_id = getattr(user, current_app.login_manager.id_attribute)() + session["_user_id"] = user_id + session["_fresh"] = fresh + session["_id"] = current_app.login_manager._session_identifier_generator() + session["_random"] = os.urandom(10).hex() + + if remember: + session["_remember"] = "set" + if duration is not None: + try: + # equal to timedelta.total_seconds() but works with Python 2.6 + session["_remember_seconds"] = ( + duration.microseconds + + (duration.seconds + duration.days * 24 * 3600) * 10**6 + ) / 10.0**6 + except AttributeError as e: + raise Exception( + f"duration must be a datetime.timedelta, instead got: {duration}" + ) from e + + current_app.login_manager._update_request_context_with_user(user) + user_logged_in.send(current_app._get_current_object(), user=_get_user()) + return True + + +def logout_user(): + """ + Logs a user out. (You do not need to pass the actual user.) This will + also clean up the remember me cookie if it exists. + """ + + user = _get_user() + + if "_user_id" in session: + session.pop("_user_id") + + if "_fresh" in session: + session.pop("_fresh") + + if "_id" in session: + session.pop("_id") + + if "_random" in session: + session.pop("_random") + + + cookie_name = current_app.config.get("REMEMBER_COOKIE_NAME", COOKIE_NAME) + if cookie_name in request.cookies: + session["_remember"] = "clear" + if "_remember_seconds" in session: + session.pop("_remember_seconds") + + user_logged_out.send(current_app._get_current_object(), user=user) + + current_app.login_manager._update_request_context_with_user() + return True + + +def confirm_login(): + """ + This sets the current session as fresh. Sessions become stale when they + are reloaded from a cookie. + """ + session["_fresh"] = True + session["_id"] = current_app.login_manager._session_identifier_generator() + user_login_confirmed.send(current_app._get_current_object()) + + +def login_required(func): + """ + If you decorate a view with this, it will ensure that the current user is + logged in and authenticated before calling the actual view. (If they are + not, it calls the :attr:`LoginManager.unauthorized` callback.) For + example:: + + @app.route('/post') + @user_login_required + def post(): + pass + + If there are only certain times you need to require that your user is + logged in, you can do so with:: + + if not current_user.is_authenticated: + return current_app.login_manager.unauthorized() + + ...which is essentially the code that this function adds to your views. + + It can be convenient to globally turn off authentication when unit testing. + To enable this, if the application configuration variable `LOGIN_DISABLED` + is set to `True`, this decorator will be ignored. + + .. Note :: + + Per `W3 guidelines for CORS preflight requests + `_, + HTTP ``OPTIONS`` requests are exempt from login checks. + + :param func: The view function to decorate. + :type func: function + """ + + @wraps(func) + def decorated_view(*args, **kwargs): + if request.method in EXEMPT_METHODS or current_app.config.get("LOGIN_DISABLED"): + pass + elif not current_user.is_authenticated: + return current_app.login_manager.unauthorized() + + # flask 1.x compatibility + # current_app.ensure_sync is only available in Flask >= 2.0 + if callable(getattr(current_app, "ensure_sync", None)): + return current_app.ensure_sync(func)(*args, **kwargs) + return func(*args, **kwargs) + + return decorated_view + + +def fresh_login_required(func): + """ + If you decorate a view with this, it will ensure that the current user's + login is fresh - i.e. their session was not restored from a 'remember me' + cookie. Sensitive operations, like changing a password or e-mail, should + be protected with this, to impede the efforts of cookie thieves. + + If the user is not authenticated, :meth:`LoginManager.unauthorized` is + called as normal. If they are authenticated, but their session is not + fresh, it will call :meth:`LoginManager.needs_refresh` instead. (In that + case, you will need to provide a :attr:`LoginManager.refresh_view`.) + + Behaves identically to the :func:`login_required` decorator with respect + to configuration variables. + + .. Note :: + + Per `W3 guidelines for CORS preflight requests + `_, + HTTP ``OPTIONS`` requests are exempt from login checks. + + :param func: The view function to decorate. + :type func: function + """ + + @wraps(func) + def decorated_view(*args, **kwargs): + if request.method in EXEMPT_METHODS or current_app.config.get("LOGIN_DISABLED"): + pass + elif not current_user.is_authenticated: + return current_app.login_manager.unauthorized() + elif not login_fresh(): + return current_app.login_manager.needs_refresh() + try: + # current_app.ensure_sync available in Flask >= 2.0 + return current_app.ensure_sync(func)(*args, **kwargs) + except AttributeError: # pragma: no cover + return func(*args, **kwargs) + + return decorated_view + + +def set_login_view(login_view, blueprint=None): + """ + Sets the login view for the app or blueprint. If a blueprint is passed, + the login view is set for this blueprint on ``blueprint_login_views``. + + :param login_view: The user object to log in. + :type login_view: str + :param blueprint: The blueprint which this login view should be set on. + Defaults to ``None``. + :type blueprint: object + """ + + num_login_views = len(current_app.login_manager.blueprint_login_views) + if blueprint is not None or num_login_views != 0: + (current_app.login_manager.blueprint_login_views[blueprint.name]) = login_view + + if ( + current_app.login_manager.login_view is not None + and None not in current_app.login_manager.blueprint_login_views + ): + ( + current_app.login_manager.blueprint_login_views[None] + ) = current_app.login_manager.login_view + + current_app.login_manager.login_view = None + else: + current_app.login_manager.login_view = login_view + + +def _get_user(): + if has_request_context(): + if "flask_httpauth_user" in g: + if g.flask_httpauth_user is not None: + return g.flask_httpauth_user + if "_login_user" not in g: + current_app.login_manager._load_user() + + return g._login_user + + return None + + +def _cookie_digest(payload, key=None): + key = _secret_key(key) + + return hmac.new(key, payload.encode("utf-8"), sha512).hexdigest() + + +def _get_remote_addr(): + address = request.headers.get("X-Forwarded-For", request.remote_addr) + if address is not None: + # An 'X-Forwarded-For' header includes a comma separated list of the + # addresses, the first address being the actual remote address. + address = address.encode("utf-8").split(b",")[0].strip() + return address + + +def _create_identifier(): + user_agent = request.headers.get("User-Agent") + if user_agent is not None: + user_agent = user_agent.encode("utf-8") + base = f"{_get_remote_addr()}|{user_agent}" + if str is bytes: + base = str(base, "utf-8", errors="replace") # pragma: no cover + h = sha512() + h.update(base.encode("utf8")) + return h.hexdigest() + + +def _user_context_processor(): + return dict(current_user=_get_user()) + + +def _secret_key(key=None): + if key is None: + key = current_app.config["SECRET_KEY"] + + if isinstance(key, str): # pragma: no cover + key = key.encode("latin1") # ensure bytes + + return key diff --git a/cps/db.py b/cps/db.py index 1770457b..dc08a7de 100644 --- a/cps/db.py +++ b/cps/db.py @@ -20,9 +20,10 @@ import os import re import json -from datetime import datetime +from datetime import datetime, timezone from urllib.parse import quote import unidecode +from weakref import WeakSet from sqlite3 import OperationalError as sqliteOperationalError from sqlalchemy import create_engine @@ -40,16 +41,14 @@ except ImportError: from sqlalchemy.pool import StaticPool from sqlalchemy.sql.expression import and_, true, false, text, func, or_ from sqlalchemy.ext.associationproxy import association_proxy -from flask_login import current_user +from .cw_login import current_user from flask_babel import gettext as _ from flask_babel import get_locale from flask import flash from . import logger, ub, isoLanguages from .pagination import Pagination - -from weakref import WeakSet - +from .string_helper import strip_whitespaces log = logger.create() @@ -379,10 +378,10 @@ class Books(Base): title = Column(String(collation='NOCASE'), nullable=False, default='Unknown') sort = Column(String(collation='NOCASE')) author_sort = Column(String(collation='NOCASE')) - timestamp = Column(TIMESTAMP, default=datetime.utcnow) + timestamp = Column(TIMESTAMP, default=lambda: datetime.now(timezone.utc)) pubdate = Column(TIMESTAMP, default=DEFAULT_PUBDATE) series_index = Column(String, nullable=False, default="1.0") - last_modified = Column(TIMESTAMP, default=datetime.utcnow) + last_modified = Column(TIMESTAMP, default=lambda: datetime.now(timezone.utc)) path = Column(String, default="", nullable=False) has_cover = Column(Integer, default=0) uuid = Column(String) @@ -876,10 +875,11 @@ class CalibreDB: authors_ordered = list() # error = False for auth in sort_authors: - results = self.session.query(Authors).filter(Authors.sort == auth.lstrip().strip()).all() + auth = strip_whitespaces(auth) + results = self.session.query(Authors).filter(Authors.sort == auth).all() # ToDo: How to handle not found author name if not len(results): - log.error("Author {} not found to display name in right order".format(auth.strip())) + log.error("Author {} not found to display name in right order".format(auth)) # error = True break for r in results: @@ -919,7 +919,7 @@ class CalibreDB: .filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first() def search_query(self, term, config, *join): - term.strip().lower() + strip_whitespaces(term).lower() self.session.connection().connection.connection.create_function("lower", 1, lcase) q = list() author_terms = re.split("[, ]+", term) @@ -1027,13 +1027,13 @@ class CalibreDB: if match: prep = match.group(1) title = title[len(prep):] + ', ' + prep - return title.strip() + return strip_whitespaces(title) try: - # sqlalchemy <1.4.24 + # sqlalchemy <1.4.24 and sqlalchemy 2.0 conn = conn or self.session.connection().connection.driver_connection except AttributeError: - # sqlalchemy >1.4.24 and sqlalchemy 2.0 + # sqlalchemy >1.4.24 conn = conn or self.session.connection().connection.connection try: conn.create_function("title_sort", 1, _title_sort) diff --git a/cps/debug_info.py b/cps/debug_info.py index 879846ab..3907f2a7 100644 --- a/cps/debug_info.py +++ b/cps/debug_info.py @@ -26,7 +26,8 @@ from flask_babel.speaklater import LazyString import os -from flask import send_file, __version__ +from flask import send_file +import importlib from . import logger, config from .about import collect_stats @@ -49,7 +50,8 @@ def assemble_logfiles(file_name): with open(f, 'rb') as fd: shutil.copyfileobj(fd, wfd) wfd.seek(0) - if int(__version__.split('.')[0]) < 2: + version = importlib.metadata.version("flask") + if int(version.split('.')[0]) < 2: return send_file(wfd, as_attachment=True, attachment_filename=os.path.basename(file_name)) @@ -72,7 +74,8 @@ def send_debug(): for fp in file_list: zf.write(fp, os.path.basename(fp)) memory_zip.seek(0) - if int(__version__.split('.')[0]) < 2: + version = importlib.metadata.version("flask") + if int(version.split('.')[0]) < 2: return send_file(memory_zip, as_attachment=True, attachment_filename="Calibre-Web-debug-pack.zip") diff --git a/cps/editbooks.py b/cps/editbooks.py index 5e10d6ed..122b1c2c 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -21,7 +21,7 @@ # along with this program. If not, see . import os -from datetime import datetime +from datetime import datetime, timezone import json from shutil import copyfile from uuid import uuid4 @@ -32,7 +32,7 @@ from flask import Blueprint, request, flash, redirect, url_for, abort, Response from flask_babel import gettext as _ from flask_babel import lazy_gettext as N_ from flask_babel import get_locale -from flask_login import current_user, login_required +from .cw_login import current_user, login_required from sqlalchemy.exc import OperationalError, IntegrityError, InterfaceError from sqlalchemy.orm.exc import StaleDataError from sqlalchemy.sql.expression import func @@ -43,10 +43,11 @@ from . import config, ub, db, calibre_db from .services.worker import WorkerThread from .tasks.upload import TaskUpload from .render_template import render_title_template -from .usermanagement import login_required_if_no_ano from .kobo_sync_status import change_archived_books from .redirect import get_redirect_location from .file_helper import validate_mime_type +from .usermanagement import user_login_required, login_required_if_no_ano +from .string_helper import strip_whitespaces editbook = Blueprint('edit-book', __name__) log = logger.create() @@ -73,14 +74,14 @@ def edit_required(f): @editbook.route("/ajax/delete/", methods=["POST"]) -@login_required +@user_login_required def delete_book_from_details(book_id): return Response(delete_book_from_table(book_id, "", True), mimetype='application/json') @editbook.route("/delete/", defaults={'book_format': ""}, methods=["POST"]) @editbook.route("/delete//", methods=["POST"]) -@login_required +@user_login_required def delete_book_ajax(book_id, book_format): return delete_book_from_table(book_id, book_format, False, request.form.to_dict().get('location', "")) @@ -133,8 +134,9 @@ def edit_book(book_id): # handle upload other formats from local disk meta = upload_single_file(request, book, book_id) # only merge metadata if file was uploaded and no error occurred (meta equals not false or none) + upload_format = False if meta: - merge_metadata(to_save, meta) + upload_format = merge_metadata(to_save, meta) # handle upload covers from local disk cover_upload_success = upload_cover(request, book) if cover_upload_success: @@ -178,7 +180,7 @@ def edit_book(book_id): modify_date |= edit_book_publisher(to_save['publisher'], book) # handle book languages try: - modify_date |= edit_book_languages(to_save['languages'], book) + modify_date |= edit_book_languages(to_save['languages'], book, upload_format) except ValueError as e: flash(str(e), category="error") edit_error = True @@ -198,7 +200,7 @@ def edit_book(book_id): book.pubdate = db.Books.DEFAULT_PUBDATE if modify_date: - book.last_modified = datetime.utcnow() + book.last_modified = datetime.now(timezone.utc) kobo_sync_status.remove_synced_book(edited_books_id, all=True) calibre_db.set_metadata_dirty(book.id) @@ -244,8 +246,12 @@ def upload(): modify_date = False # create the function for sorting... calibre_db.update_title_sort(config) - calibre_db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) - + try: + # sqlalchemy 2.0 + uuid_func = calibre_db.session.connection().connection.driver_connection + except AttributeError: + uuid_func = calibre_db.session.connection().connection.connection + uuid_func.create_function('uuid4', 0,lambda: str(uuid4())) meta, error = file_handling_on_upload(requested_file) if error: return error @@ -331,7 +337,7 @@ def convert_bookformat(book_id): @editbook.route("/ajax/getcustomenum/") -@login_required +@user_login_required def table_get_custom_enum(c_id): ret = list() cc = (calibre_db.session.query(db.CustomColumns) @@ -438,7 +444,7 @@ def edit_list_book(param): mimetype='application/json') else: return _("Parameter not found"), 400 - book.last_modified = datetime.utcnow() + book.last_modified = datetime.now(timezone.utc) calibre_db.session.commit() # revert change for sort if automatic fields link is deactivated @@ -455,7 +461,7 @@ def edit_list_book(param): @editbook.route("/ajax/sort_value//") -@login_required +@user_login_required def get_sorted_entry(field, bookid): if field in ['title', 'authors', 'sort', 'author_sort']: book = calibre_db.get_filtered_book(bookid) @@ -472,7 +478,7 @@ def get_sorted_entry(field, bookid): @editbook.route("/ajax/simulatemerge", methods=['POST']) -@login_required +@user_login_required @edit_required def simulate_merge_list_book(): vals = request.get_json().get('Merge_books') @@ -488,7 +494,7 @@ def simulate_merge_list_book(): @editbook.route("/ajax/mergebooks", methods=['POST']) -@login_required +@user_login_required @edit_required def merge_list_book(): vals = request.get_json().get('Merge_books') @@ -526,7 +532,7 @@ def merge_list_book(): @editbook.route("/ajax/xchange", methods=['POST']) -@login_required +@user_login_required @edit_required def table_xchange_author_title(): vals = request.get_json().get('xchange') @@ -554,7 +560,7 @@ def table_xchange_author_title(): # toDo: Handle error edit_error = helper.update_dir_structure(edited_books_id, config.get_book_path(), input_authors[0]) if modify_date: - book.last_modified = datetime.utcnow() + book.last_modified = datetime.now(timezone.utc) calibre_db.set_metadata_dirty(book.id) try: calibre_db.session.commit() @@ -574,6 +580,10 @@ def merge_metadata(to_save, meta): to_save['author_name'] = '' if to_save.get('book_title', "") == _('Unknown'): to_save['book_title'] = '' + if not to_save["languages"] and meta.languages: + upload_language = True + else: + upload_language = False for s_field, m_field in [ ('tags', 'tags'), ('author_name', 'author'), ('series', 'series'), ('series_index', 'series_id'), ('languages', 'languages'), @@ -581,7 +591,7 @@ def merge_metadata(to_save, meta): to_save[s_field] = to_save[s_field] or getattr(meta, m_field, '') to_save["description"] = to_save["description"] or Markup( getattr(meta, 'description', '')).unescape() - + return upload_language def identifier_list(to_save, book): """Generate a list of Identifiers from form information""" @@ -701,8 +711,8 @@ def create_book_on_upload(modify_date, meta): pubdate = datetime(101, 1, 1) # Calibre adds books with utc as timezone - db_book = db.Books(title, "", sort_authors, datetime.utcnow(), pubdate, - '1', datetime.utcnow(), path, meta.cover, db_author, [], "") + db_book = db.Books(title, "", sort_authors, datetime.now(timezone.utc), pubdate, + '1', datetime.now(timezone.utc), path, meta.cover, db_author, [], "") modify_date |= modify_database_object(input_authors, db_book.authors, db.Authors, calibre_db.session, 'author') @@ -969,7 +979,7 @@ def render_edit_book(book_id): def edit_book_ratings(to_save, book): changed = False - if to_save.get("rating", "").strip(): + if strip_whitespaces(to_save.get("rating", "")): old_rating = False if len(book.ratings) > 0: old_rating = book.ratings[0].rating @@ -993,14 +1003,14 @@ def edit_book_ratings(to_save, book): def edit_book_tags(tags, book): input_tags = tags.split(',') - input_tags = list(map(lambda it: it.strip(), input_tags)) + input_tags = list(map(lambda it: strip_whitespaces(it), input_tags)) # Remove duplicates input_tags = helper.uniq(input_tags) return modify_database_object(input_tags, book.tags, db.Tags, calibre_db.session, 'tags') def edit_book_series(series, book): - input_series = [series.strip()] + input_series = [strip_whitespaces(series)] input_series = [x for x in input_series if x != ''] return modify_database_object(input_series, book.series, db.Series, calibre_db.session, 'series') @@ -1010,7 +1020,7 @@ def edit_book_series_index(series_index, book): modify_date = False series_index = series_index or '1' if not series_index.replace('.', '', 1).isdigit(): - flash(_("%(seriesindex)s is not a valid number, skipping", seriesindex=series_index), category="warning") + flash(_("Seriesindex: %(seriesindex)s is not a valid number, skipping", seriesindex=series_index), category="warning") return False if str(book.series_index) != series_index: book.series_index = series_index @@ -1062,7 +1072,7 @@ def edit_book_languages(languages, book, upload_mode=False, invalid=None): def edit_book_publisher(publishers, book): changed = False if publishers: - publisher = publishers.rstrip().strip() + publisher = strip_whitespaces(publishers) if len(book.publishers) == 0 or (len(book.publishers) > 0 and publisher != book.publishers[0].name): changed |= modify_database_object([publisher], book.publishers, db.Publishers, calibre_db.session, 'publisher') @@ -1109,7 +1119,7 @@ def edit_cc_data_string(book, c, to_save, cc_db_value, cc_string): changed = False if c.datatype == 'rating': to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) - if to_save[cc_string].strip() != cc_db_value: + if strip_whitespaces(to_save[cc_string]) != cc_db_value: if cc_db_value is not None: # remove old cc_val del_cc = getattr(book, cc_string)[0] @@ -1119,15 +1129,15 @@ def edit_cc_data_string(book, c, to_save, cc_db_value, cc_string): changed = True cc_class = db.cc_classes[c.id] new_cc = calibre_db.session.query(cc_class).filter( - cc_class.value == to_save[cc_string].strip()).first() + cc_class.value == strip_whitespaces(to_save[cc_string])).first() # if no cc val is found add it if new_cc is None: - new_cc = cc_class(value=to_save[cc_string].strip()) + new_cc = cc_class(value=strip_whitespaces(to_save[cc_string])) calibre_db.session.add(new_cc) changed = True calibre_db.session.flush() new_cc = calibre_db.session.query(cc_class).filter( - cc_class.value == to_save[cc_string].strip()).first() + cc_class.value == strip_whitespaces(to_save[cc_string])).first() # add cc value to book getattr(book, cc_string).append(new_cc) return changed, to_save @@ -1155,7 +1165,7 @@ def edit_cc_data(book_id, book, to_save, cc): cc_db_value = getattr(book, cc_string)[0].value else: cc_db_value = None - if to_save[cc_string].strip(): + if strip_whitespaces(to_save[cc_string]): if c.datatype in ['int', 'bool', 'float', "datetime", "comments"]: change, to_save = edit_cc_data_value(book_id, book, c, to_save, cc_db_value, cc_string) else: @@ -1171,7 +1181,7 @@ def edit_cc_data(book_id, book, to_save, cc): changed = True else: input_tags = to_save[cc_string].split(',') - input_tags = list(map(lambda it: it.strip(), input_tags)) + input_tags = list(map(lambda it: strip_whitespaces(it), input_tags)) changed |= modify_database_object(input_tags, getattr(book, cc_string), db.cc_classes[c.id], @@ -1274,7 +1284,7 @@ def upload_cover(cover_request, book): def handle_title_on_edit(book, book_title): # handle book title - book_title = book_title.rstrip().strip() + book_title = strip_whitespaces(book_title) if book.title != book_title: if book_title == '': book_title = _(u'Unknown') diff --git a/cps/embed_helper.py b/cps/embed_helper.py index 71de216d..54db47ef 100644 --- a/cps/embed_helper.py +++ b/cps/embed_helper.py @@ -28,7 +28,7 @@ log = logger.create() def do_calibre_export(book_id, book_format): try: - quotes = [3, 5, 7, 9] + quotes = [4, 6] tmp_dir = get_temp_dir() calibredb_binarypath = get_calibre_binarypath("calibredb") temp_file_name = str(uuid4()) diff --git a/cps/epub.py b/cps/epub.py index c802f61d..e84822f3 100644 --- a/cps/epub.py +++ b/cps/epub.py @@ -25,6 +25,7 @@ from . import config, logger from .helper import split_authors from .epub_helper import get_content_opf, default_ns from .constants import BookMeta +from .string_helper import strip_whitespaces log = logger.create() @@ -90,7 +91,7 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension): elif s == 'date': epub_metadata[s] = tmp[0][:10] else: - epub_metadata[s] = tmp[0].strip() + epub_metadata[s] = strip_whitespaces(tmp[0]) else: epub_metadata[s] = 'Unknown' diff --git a/cps/file_helper.py b/cps/file_helper.py index d6182311..9d5406d3 100644 --- a/cps/file_helper.py +++ b/cps/file_helper.py @@ -29,8 +29,9 @@ log = logger.create() try: import magic + error = None except ImportError as e: - log.error("Cannot import python-magic, checking uploaded file metadata will not work: %s", e) + error = "Cannot import python-magic, checking uploaded file metadata will not work: {}".format(e) def get_temp_dir(): @@ -46,6 +47,9 @@ def del_temp_dir(): def validate_mime_type(file_buffer, allowed_extensions): + if error: + log.error(error) + return False mime = magic.Magic(mime=True) allowed_mimetypes = list() for x in allowed_extensions: diff --git a/cps/gdrive.py b/cps/gdrive.py index 284fb21e..07795b51 100644 --- a/cps/gdrive.py +++ b/cps/gdrive.py @@ -29,11 +29,11 @@ from shutil import move, copyfile from flask import Blueprint, flash, request, redirect, url_for, abort from flask_babel import gettext as _ -from flask_login import login_required from . import logger, gdriveutils, config, ub, calibre_db, csrf from .admin import admin_required from .file_helper import get_temp_dir +from .usermanagement import user_login_required gdrive = Blueprint('gdrive', __name__, url_prefix='/gdrive') log = logger.create() @@ -49,7 +49,7 @@ gdrive_watch_callback_token = 'target=calibreweb-watch_files' # nosec @gdrive.route("/authenticate") -@login_required +@user_login_required @admin_required def authenticate_google_drive(): try: @@ -76,7 +76,7 @@ def google_drive_callback(): @gdrive.route("/watch/subscribe") -@login_required +@user_login_required @admin_required def watch_gdrive(): if not config.config_google_drive_watch_changes_response: @@ -102,7 +102,7 @@ def watch_gdrive(): @gdrive.route("/watch/revoke") -@login_required +@user_login_required @admin_required def revoke_watch_gdrive(): last_watch_response = config.config_google_drive_watch_changes_response diff --git a/cps/helper.py b/cps/helper.py index b90d0fbc..39c9c384 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -25,7 +25,7 @@ import re import regex import shutil import socket -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import requests import unidecode from uuid import uuid4 @@ -34,7 +34,7 @@ from flask import send_from_directory, make_response, abort, url_for, Response from flask_babel import gettext as _ from flask_babel import lazy_gettext as N_ from flask_babel import get_locale -from flask_login import current_user +from .cw_login import current_user from sqlalchemy.sql.expression import true, false, and_, or_, text, func from sqlalchemy.exc import InvalidRequestError, OperationalError from werkzeug.datastructures import Headers @@ -52,6 +52,7 @@ except ImportError: UnacceptableAddressException = MissingSchema = BaseException from . import calibre_db, cli_param +from .string_helper import strip_whitespaces from .tasks.convert import TaskConvert from . import logger, config, db, ub, fs from . import gdriveutils as gd @@ -118,7 +119,7 @@ def convert_book_format(book_id, calibre_path, old_book_format, new_book_format, # Texts are not lazy translated as they are supposed to get send out as is def send_test_mail(ereader_mail, user_name): for email in ereader_mail.split(','): - email = email.strip() + email = strip_whitespaces(email) WorkerThread.add(user_name, TaskEmail(_('Calibre-Web Test Email'), None, None, config.get_mail_settings(), email, N_("Test Email"), _('This Email has been sent via Calibre-Web.'))) @@ -228,7 +229,7 @@ def send_mail(book_id, book_format, convert, ereader_mail, calibrepath, user_id) link = '{}'.format(url_for('web.show_book', book_id=book_id), escape(book.title)) email_text = N_("%(book)s send to eReader", book=link) for email in ereader_mail.split(','): - email = email.strip() + email = strip_whitespaces(email) WorkerThread.add(user_id, TaskEmail(_("Send to eReader"), book.path, converted_file_name, config.get_mail_settings(), email, email_text, _('This Email has been sent via Calibre-Web.'), book.id)) @@ -252,7 +253,7 @@ def get_valid_filename(value, replace_whitespace=True, chars=128): # pipe has to be replaced with comma value = re.sub(r'[|]+', ',', value, flags=re.U) - value = value.encode('utf-8')[:chars].decode('utf-8', errors='ignore').strip() + value = strip_whitespaces(value.encode('utf-8')[:chars].decode('utf-8', errors='ignore')) if not value: raise ValueError("Filename cannot be empty") @@ -267,11 +268,11 @@ def split_authors(values): commas = author.count(',') if commas == 1: author_split = author.split(',') - authors_list.append(author_split[1].strip() + ' ' + author_split[0].strip()) + authors_list.append(strip_whitespaces(author_split[1]) + ' ' + strip_whitespaces(author_split[0])) elif commas > 1: - authors_list.extend([x.strip() for x in author.split(',')]) + authors_list.extend([strip_whitespaces(x) for x in author.split(',')]) else: - authors_list.append(author.strip()) + authors_list.append(strip_whitespaces(author)) return authors_list @@ -413,36 +414,6 @@ def rename_all_files_on_change(one_book, new_path, old_path, all_new_name, gdriv file_format.name = all_new_name -'''def rename_all_authors(first_author, renamed_author, calibre_path="", localbook=None, gdrive=False): - # Create new_author_dir from parameter or from database - # Create new title_dir from database and add id - if first_author: - new_authordir = get_valid_filename(first_author, chars=96) - for r in renamed_author: - new_author = calibre_db.session.query(db.Authors).filter(db.Authors.name == r).first() - old_author_dir = get_valid_filename(r, chars=96) - new_author_rename_dir = get_valid_filename(new_author.name, chars=96) - if gdrive: - g_file = gd.getFileFromEbooksFolder(None, old_author_dir) - if g_file: - gd.moveGdriveFolderRemote(g_file, new_author_rename_dir) - gd.updateDatabaseOnEdit(g_file['id'], new_author_rename_dir) - else: - if os.path.isdir(os.path.join(calibre_path, old_author_dir)): - old_author_path = os.path.join(calibre_path, old_author_dir) - new_author_path = os.path.join(calibre_path, new_author_rename_dir) - try: - shutil.move(os.path.normcase(old_author_path), os.path.normcase(new_author_path)) - except OSError as ex: - log.error("Rename author from: %s to %s: %s", old_author_path, new_author_path, ex) - log.debug(ex, exc_info=True) - return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", - src=old_author_path, dest=new_author_path, error=str(ex)) - else: - new_authordir = get_valid_filename(localbook.authors[0].name, chars=96) - return new_authordir''' - - def rename_author_path(first_author, old_author_dir, renamed_author, calibre_path="", gdrive=False): # Create new_author_dir from parameter or from database # Create new title_dir from database and add id @@ -459,12 +430,15 @@ def rename_author_path(first_author, old_author_dir, renamed_author, calibre_pat old_author_path = os.path.join(calibre_path, old_author_dir) new_author_path = os.path.join(calibre_path, new_author_rename_dir) try: - shutil.move(old_author_path, new_author_path) - except OSError as ex: - log.error("Rename author from: %s to %s: %s", old_author_path, new_author_path, ex) - log.debug(ex, exc_info=True) - return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", - src=old_author_path, dest=new_author_path, error=str(ex)) + os.rename(old_author_path, new_author_path) + except OSError: + try: + shutil.move(old_author_path, new_author_path) + except OSError as ex: + log.error("Rename author from: %s to %s: %s", old_author_path, new_author_path, ex) + log.error_or_exception(ex) + raise Exception(_("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", + src=old_author_path, dest=new_author_path, error=str(ex))) return new_authordir # Moves files in file storage during author/title rename, or from temp dir to file storage @@ -688,7 +662,7 @@ def check_email(email): def check_username(username): - username = username.strip() + username = strip_whitespaces(username) if ub.session.query(ub.User).filter(func.lower(ub.User.name) == username.lower()).scalar(): log.error("This username is already taken") raise Exception(_("This username is already taken")) @@ -697,14 +671,14 @@ def check_username(username): def valid_email(emails): for email in emails.split(','): - email = email.strip() - # if email is not deleted - if email: - # Regex according to https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#validation - if not re.search(r"^[\w.!#$%&'*+\\/=?^_`{|}~-]+@[\w](?:[\w-]{0,61}[\w])?(?:\.[\w](?:[\w-]{0,61}[\w])?)*$", - email): - log.error("Invalid Email address format") - raise Exception(_("Invalid Email address format")) + email = strip_whitespaces(email) + # if email is not deleted + if email: + # Regex according to https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#validation + if not re.search(r"^[\w.!#$%&'*+\\/=?^_`{|}~-]+@[\w](?:[\w-]{0,61}[\w])?(?:\.[\w](?:[\w-]{0,61}[\w])?)*$", + email): + log.error("Invalid Email address format") + raise Exception(_("Invalid Email address format")) return email @@ -815,24 +789,23 @@ def get_book_cover_internal(book, resolution=None): def get_book_cover_thumbnail(book, resolution): if book and book.has_cover: - return ub.session \ - .query(ub.Thumbnail) \ - .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_COVER) \ - .filter(ub.Thumbnail.entity_id == book.id) \ - .filter(ub.Thumbnail.resolution == resolution) \ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ - .first() + return (ub.session + .query(ub.Thumbnail) + .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_COVER) + .filter(ub.Thumbnail.entity_id == book.id) + .filter(ub.Thumbnail.resolution == resolution) + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.now(timezone.utc))) + .first()) def get_series_thumbnail_on_failure(series_id, resolution): - book = calibre_db.session \ - .query(db.Books) \ - .join(db.books_series_link) \ - .join(db.Series) \ - .filter(db.Series.id == series_id) \ - .filter(db.Books.has_cover == 1) \ - .first() - + book = (calibre_db.session + .query(db.Books) + .join(db.books_series_link) + .join(db.Series) + .filter(db.Series.id == series_id) + .filter(db.Books.has_cover == 1) + .first()) return get_book_cover_internal(book, resolution=resolution) @@ -854,13 +827,13 @@ def get_series_cover_internal(series_id, resolution=None): def get_series_thumbnail(series_id, resolution): - return ub.session \ - .query(ub.Thumbnail) \ - .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_SERIES) \ - .filter(ub.Thumbnail.entity_id == series_id) \ - .filter(ub.Thumbnail.resolution == resolution) \ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ - .first() + return (ub.session + .query(ub.Thumbnail) + .filter(ub.Thumbnail.type == THUMBNAIL_TYPE_SERIES) + .filter(ub.Thumbnail.entity_id == series_id) + .filter(ub.Thumbnail.resolution == resolution) + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.now(timezone.utc))) + .first()) # saves book cover from url diff --git a/cps/jinjia.py b/cps/jinjia.py index 14bdf7e3..3964956f 100644 --- a/cps/jinjia.py +++ b/cps/jinjia.py @@ -27,10 +27,9 @@ import datetime import mimetypes from uuid import uuid4 -# from babel.dates import format_date from flask import Blueprint, request, url_for from flask_babel import format_date -from flask_login import current_user +from .cw_login import current_user from . import constants, logger @@ -115,7 +114,10 @@ def yesno(value, yes, no): @jinjia.app_template_filter('formatfloat') def formatfloat(value, decimals=1): value = 0 if not value else value - return ('{0:.' + str(decimals) + 'f}').format(value).rstrip('0').rstrip('.') + formated_value = ('{0:.' + str(decimals) + 'f}').format(value) + if formated_value.endswith('.' + "0" * decimals): + formated_value = formated_value.rstrip('0').rstrip('.') + return formated_value @jinjia.app_template_filter('formatseriesindex') diff --git a/cps/kobo.py b/cps/kobo.py index 3c747519..3686c174 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -18,7 +18,7 @@ # along with this program. If not, see . import base64 -import datetime +from datetime import datetime, timezone import os import uuid import zipfile @@ -36,7 +36,7 @@ from flask import ( redirect, abort ) -from flask_login import current_user +from .cw_login import current_user from werkzeug.datastructures import Headers from sqlalchemy import func from sqlalchemy.sql.expression import and_, or_ @@ -44,11 +44,10 @@ from sqlalchemy.exc import StatementError from sqlalchemy.sql import select import requests - from . import config, logger, kobo_auth, db, calibre_db, helper, shelf as shelf_lib, ub, csrf, kobo_sync_status from . import isoLanguages from .epub import get_epub_layout -from .constants import COVER_THUMBNAIL_SMALL +from .constants import COVER_THUMBNAIL_SMALL, COVER_THUMBNAIL_MEDIUM, COVER_THUMBNAIL_LARGE from .helper import get_download_link from .services import SyncToken as SyncToken from .web import download_required @@ -132,7 +131,7 @@ def convert_to_kobo_timestamp_string(timestamp): return timestamp.strftime("%Y-%m-%dT%H:%M:%SZ") except AttributeError as exc: log.debug("Timestamp not valid: {}".format(exc)) - return datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") + return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") @kobo.route("/v1/library/sync") @@ -151,15 +150,15 @@ def HandleSyncRequest(): # if no books synced don't respect sync_token if not ub.session.query(ub.KoboSyncedBooks).filter(ub.KoboSyncedBooks.user_id == current_user.id).count(): - sync_token.books_last_modified = datetime.datetime.min - sync_token.books_last_created = datetime.datetime.min - sync_token.reading_state_last_modified = datetime.datetime.min + sync_token.books_last_modified = datetime.min + sync_token.books_last_created = datetime.min + sync_token.reading_state_last_modified = datetime.min new_books_last_modified = sync_token.books_last_modified # needed for sync selected shelfs only new_books_last_created = sync_token.books_last_created # needed to distinguish between new and changed entitlement new_reading_state_last_modified = sync_token.reading_state_last_modified - new_archived_last_modified = datetime.datetime.min + new_archived_last_modified = datetime.min sync_results = [] # We reload the book database so that the user gets a fresh view of the library @@ -376,7 +375,7 @@ def create_book_entitlement(book, archived): book_uuid = str(book.uuid) return { "Accessibility": "Full", - "ActivePeriod": {"From": convert_to_kobo_timestamp_string(datetime.datetime.utcnow())}, + "ActivePeriod": {"From": convert_to_kobo_timestamp_string(datetime.now(timezone.utc))}, "Created": convert_to_kobo_timestamp_string(book.timestamp), "CrossRevisionId": book_uuid, "Id": book_uuid, @@ -796,7 +795,7 @@ def HandleStateRequest(book_uuid): if new_book_read_status == ub.ReadBook.STATUS_IN_PROGRESS \ and new_book_read_status != book_read.read_status: book_read.times_started_reading += 1 - book_read.last_time_started_reading = datetime.datetime.utcnow() + book_read.last_time_started_reading = datetime.now(timezone.utc) book_read.read_status = new_book_read_status update_results_response["StatusInfoResult"] = {"Result": "Success"} except (KeyError, TypeError, ValueError, StatementError): @@ -904,7 +903,12 @@ def get_current_bookmark_response(current_bookmark): @requires_kobo_auth def HandleCoverImageRequest(book_uuid, width, height, Quality, isGreyscale): try: - resolution = None if int(height) > 1000 else COVER_THUMBNAIL_SMALL + if int(height) > 1000: + resolution = COVER_THUMBNAIL_LARGE + elif int(height) > 500: + resolution = COVER_THUMBNAIL_MEDIUM + else: + resolution = COVER_THUMBNAIL_SMALL except ValueError: log.error("Requested height %s of book %s is invalid" % (book_uuid, height)) resolution = COVER_THUMBNAIL_SMALL diff --git a/cps/kobo_auth.py b/cps/kobo_auth.py index f49b3fb0..f99bf77c 100644 --- a/cps/kobo_auth.py +++ b/cps/kobo_auth.py @@ -65,12 +65,14 @@ from os import urandom from functools import wraps from flask import g, Blueprint, abort, request -from flask_login import login_user, current_user, login_required +from .cw_login import login_user, current_user from flask_babel import gettext as _ from flask_limiter import RateLimitExceeded from . import logger, config, calibre_db, db, helper, ub, lm, limiter from .render_template import render_title_template +from .usermanagement import user_login_required + log = logger.create() @@ -78,7 +80,7 @@ kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth") @kobo_auth.route("/generate_auth_token/") -@login_required +@user_login_required def generate_auth_token(user_id): warning = False host_list = request.host.rsplit(':') @@ -120,7 +122,7 @@ def generate_auth_token(user_id): @kobo_auth.route("/deleteauthtoken/", methods=["POST"]) -@login_required +@user_login_required def delete_auth_token(user_id): # Invalidate any previously generated Kobo Auth token for this user ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.user_id == user_id)\ diff --git a/cps/kobo_sync_status.py b/cps/kobo_sync_status.py index bff4a705..357b84ef 100644 --- a/cps/kobo_sync_status.py +++ b/cps/kobo_sync_status.py @@ -17,11 +17,11 @@ # along with this program. If not, see . -from flask_login import current_user +from .cw_login import current_user from . import ub -import datetime +from datetime import datetime, timezone from sqlalchemy.sql.expression import or_, and_, true -from sqlalchemy import exc +# from sqlalchemy import exc # Add the current book id to kobo_synced_books table for current user, if entry is already present, @@ -58,7 +58,7 @@ def change_archived_books(book_id, state=None, message=None): archived_book = ub.ArchivedBook(user_id=current_user.id, book_id=book_id) archived_book.is_archived = state if state else not archived_book.is_archived - archived_book.last_modified = datetime.datetime.utcnow() # toDo. Check utc timestamp + archived_book.last_modified = datetime.now(timezone.utc) # toDo. Check utc timestamp ub.session.merge(archived_book) ub.session_commit(message) diff --git a/cps/main.py b/cps/main.py index 9eccaf50..44e563f9 100644 --- a/cps/main.py +++ b/cps/main.py @@ -20,7 +20,6 @@ import sys from . import create_app, limiter from .jinjia import jinjia -from .remotelogin import remotelogin from flask import request @@ -43,6 +42,7 @@ def main(): from .shelf import shelf from .tasks_status import tasks from .error_handler import init_errorhandler + from .remotelogin import remotelogin try: from .kobo import kobo, get_kobo_activated from .kobo_auth import kobo_auth diff --git a/cps/metadata_provider/amazon.py b/cps/metadata_provider/amazon.py index 843a9d76..ee3de1ce 100644 --- a/cps/metadata_provider/amazon.py +++ b/cps/metadata_provider/amazon.py @@ -53,7 +53,6 @@ class Amazon(Metadata): def search( self, query: str, generic_cover: str = "", locale: str = "en" ) -> Optional[List[MetaRecord]]: - #timer=time() def inner(link, index) -> [dict, int]: with self.session as session: try: @@ -61,11 +60,11 @@ class Amazon(Metadata): r.raise_for_status() except Exception as ex: log.warning(ex) - return None + return [] long_soup = BS(r.text, "lxml") #~4sec :/ soup2 = long_soup.find("div", attrs={"cel_widget_id": "dpx-books-ppd_csm_instrumentation_wrapper"}) if soup2 is None: - return None + return [] try: match = MetaRecord( title = "", @@ -88,7 +87,7 @@ class Amazon(Metadata): soup2.find("div", attrs={"data-feature-name": "bookDescription"}).stripped_strings)\ .replace("\xa0"," ")[:-9].strip().strip("\n") except (AttributeError, TypeError): - return None # if there is no description it is not a book and therefore should be ignored + return [] # if there is no description it is not a book and therefore should be ignored try: match.title = soup2.find("span", attrs={"id": "productTitle"}).text except (AttributeError, TypeError): @@ -113,7 +112,7 @@ class Amazon(Metadata): return match, index except Exception as e: log.error_or_exception(e) - return None + return [] val = list() if self.active: @@ -134,6 +133,6 @@ class Amazon(Metadata): soup.findAll("div", attrs={"data-component-type": "s-search-result"})] with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: fut = {executor.submit(inner, link, index) for index, link in enumerate(links_list[:5])} - val = list(map(lambda x : x.result() ,concurrent.futures.as_completed(fut))) + val = list(map(lambda x : x.result(), concurrent.futures.as_completed(fut))) result = list(filter(lambda x: x, val)) return [x[0] for x in sorted(result, key=itemgetter(1))] #sort by amazons listing order for best relevance diff --git a/cps/metadata_provider/google.py b/cps/metadata_provider/google.py index ba7e10af..df9c0dc2 100644 --- a/cps/metadata_provider/google.py +++ b/cps/metadata_provider/google.py @@ -54,7 +54,7 @@ class Google(Metadata): results.raise_for_status() except Exception as e: log.warning(e) - return None + return [] for result in results.json().get("items", []): val.append( self._parse_search_result( diff --git a/cps/oauth_bb.py b/cps/oauth_bb.py index 76b8d2ba..7ec813bd 100644 --- a/cps/oauth_bb.py +++ b/cps/oauth_bb.py @@ -30,8 +30,9 @@ from flask_dance.consumer import oauth_authorized, oauth_error from flask_dance.contrib.github import make_github_blueprint, github from flask_dance.contrib.google import make_google_blueprint, google from oauthlib.oauth2 import TokenExpiredError, InvalidGrantError -from flask_login import login_user, current_user, login_required +from .cw_login import login_user, current_user from sqlalchemy.orm.exc import NoResultFound +from .usermanagement import user_login_required from . import constants, logger, config, app, ub @@ -340,7 +341,7 @@ def github_login(): @oauth.route('/unlink/github', methods=["GET"]) -@login_required +@user_login_required def github_login_unlink(): return unlink_oauth(oauthblueprints[0]['id']) @@ -364,6 +365,6 @@ def google_login(): @oauth.route('/unlink/google', methods=["GET"]) -@login_required +@user_login_required def google_login_unlink(): return unlink_oauth(oauthblueprints[1]['id']) diff --git a/cps/opds.py b/cps/opds.py index b61de5a9..3d8c78b9 100644 --- a/cps/opds.py +++ b/cps/opds.py @@ -25,14 +25,15 @@ import json from urllib.parse import unquote_plus from flask import Blueprint, request, render_template, make_response, abort, Response, g -from flask_login import current_user from flask_babel import get_locale from flask_babel import gettext as _ + + from sqlalchemy.sql.expression import func, text, or_, and_, true from sqlalchemy.exc import InvalidRequestError, OperationalError from . import logger, config, db, calibre_db, ub, isoLanguages, constants -from .usermanagement import requires_basic_auth_if_no_ano +from .usermanagement import requires_basic_auth_if_no_ano, auth from .helper import get_download_link, get_book_cover from .pagination import Pagination from .web import render_read_books @@ -94,7 +95,7 @@ def feed_letter_books(book_id): @opds.route("/opds/new") @requires_basic_auth_if_no_ano def feed_new(): - if not current_user.check_visibility(constants.SIDEBAR_RECENT): + if not auth.current_user().check_visibility(constants.SIDEBAR_RECENT): abort(404) off = request.args.get("offset") or 0 entries, __, pagination = calibre_db.fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), 0, @@ -106,7 +107,7 @@ def feed_new(): @opds.route("/opds/discover") @requires_basic_auth_if_no_ano def feed_discover(): - if not current_user.check_visibility(constants.SIDEBAR_RANDOM): + if not auth.current_user().check_visibility(constants.SIDEBAR_RANDOM): abort(404) query = calibre_db.generate_linked_query(config.config_read_column, db.Books) entries = query.filter(calibre_db.common_filters()).order_by(func.random()).limit(config.config_books_per_page) @@ -117,7 +118,7 @@ def feed_discover(): @opds.route("/opds/rated") @requires_basic_auth_if_no_ano def feed_best_rated(): - if not current_user.check_visibility(constants.SIDEBAR_BEST_RATED): + if not auth.current_user().check_visibility(constants.SIDEBAR_BEST_RATED): abort(404) off = request.args.get("offset") or 0 entries, __, pagination = calibre_db.fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), 0, @@ -130,7 +131,7 @@ def feed_best_rated(): @opds.route("/opds/hot") @requires_basic_auth_if_no_ano def feed_hot(): - if not current_user.check_visibility(constants.SIDEBAR_HOT): + if not auth.current_user().check_visibility(constants.SIDEBAR_HOT): abort(404) off = request.args.get("offset") or 0 all_books = ub.session.query(ub.Downloads, func.count(ub.Downloads.book_id)).order_by( @@ -154,7 +155,7 @@ def feed_hot(): @opds.route("/opds/author") @requires_basic_auth_if_no_ano def feed_authorindex(): - if not current_user.check_visibility(constants.SIDEBAR_AUTHOR): + if not auth.current_user().check_visibility(constants.SIDEBAR_AUTHOR): abort(404) return render_element_index(db.Authors.sort, db.books_authors_link, 'opds.feed_letter_author') @@ -162,7 +163,7 @@ def feed_authorindex(): @opds.route("/opds/author/letter/") @requires_basic_auth_if_no_ano def feed_letter_author(book_id): - if not current_user.check_visibility(constants.SIDEBAR_AUTHOR): + if not auth.current_user().check_visibility(constants.SIDEBAR_AUTHOR): abort(404) off = request.args.get("offset") or 0 letter = true() if book_id == "00" else func.upper(db.Authors.sort).startswith(book_id) @@ -185,7 +186,7 @@ def feed_author(book_id): @opds.route("/opds/publisher") @requires_basic_auth_if_no_ano def feed_publisherindex(): - if not current_user.check_visibility(constants.SIDEBAR_PUBLISHER): + if not auth.current_user().check_visibility(constants.SIDEBAR_PUBLISHER): abort(404) off = request.args.get("offset") or 0 entries = calibre_db.session.query(db.Publishers)\ @@ -208,7 +209,7 @@ def feed_publisher(book_id): @opds.route("/opds/category") @requires_basic_auth_if_no_ano def feed_categoryindex(): - if not current_user.check_visibility(constants.SIDEBAR_CATEGORY): + if not auth.current_user().check_visibility(constants.SIDEBAR_CATEGORY): abort(404) return render_element_index(db.Tags.name, db.books_tags_link, 'opds.feed_letter_category') @@ -216,7 +217,7 @@ def feed_categoryindex(): @opds.route("/opds/category/letter/") @requires_basic_auth_if_no_ano def feed_letter_category(book_id): - if not current_user.check_visibility(constants.SIDEBAR_CATEGORY): + if not auth.current_user().check_visibility(constants.SIDEBAR_CATEGORY): abort(404) off = request.args.get("offset") or 0 letter = true() if book_id == "00" else func.upper(db.Tags.name).startswith(book_id) @@ -241,7 +242,7 @@ def feed_category(book_id): @opds.route("/opds/series") @requires_basic_auth_if_no_ano def feed_seriesindex(): - if not current_user.check_visibility(constants.SIDEBAR_SERIES): + if not auth.current_user().check_visibility(constants.SIDEBAR_SERIES): abort(404) return render_element_index(db.Series.sort, db.books_series_link, 'opds.feed_letter_series') @@ -249,7 +250,7 @@ def feed_seriesindex(): @opds.route("/opds/series/letter/") @requires_basic_auth_if_no_ano def feed_letter_series(book_id): - if not current_user.check_visibility(constants.SIDEBAR_SERIES): + if not auth.current_user().check_visibility(constants.SIDEBAR_SERIES): abort(404) off = request.args.get("offset") or 0 letter = true() if book_id == "00" else func.upper(db.Series.sort).startswith(book_id) @@ -280,7 +281,7 @@ def feed_series(book_id): @opds.route("/opds/ratings") @requires_basic_auth_if_no_ano def feed_ratingindex(): - if not current_user.check_visibility(constants.SIDEBAR_RATING): + if not auth.current_user().check_visibility(constants.SIDEBAR_RATING): abort(404) off = request.args.get("offset") or 0 entries = calibre_db.session.query(db.Ratings, func.count('books_ratings_link.book').label('count'), @@ -308,7 +309,7 @@ def feed_ratings(book_id): @opds.route("/opds/formats") @requires_basic_auth_if_no_ano def feed_formatindex(): - if not current_user.check_visibility(constants.SIDEBAR_FORMAT): + if not auth.current_user().check_visibility(constants.SIDEBAR_FORMAT): abort(404) off = request.args.get("offset") or 0 entries = calibre_db.session.query(db.Data).join(db.Books)\ @@ -339,14 +340,14 @@ def feed_format(book_id): @opds.route("/opds/language/") @requires_basic_auth_if_no_ano def feed_languagesindex(): - if not current_user.check_visibility(constants.SIDEBAR_LANGUAGE): + if not auth.current_user().check_visibility(constants.SIDEBAR_LANGUAGE): abort(404) off = request.args.get("offset") or 0 - if current_user.filter_language() == "all": + if auth.current_user().filter_language() == "all": languages = calibre_db.speaking_language() else: languages = calibre_db.session.query(db.Languages).filter( - db.Languages.lang_code == current_user.filter_language()).all() + db.Languages.lang_code == auth.current_user().filter_language()).all() languages[0].name = isoLanguages.get_language_name(get_locale(), languages[0].lang_code) pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, len(languages)) @@ -368,11 +369,11 @@ def feed_languages(book_id): @opds.route("/opds/shelfindex") @requires_basic_auth_if_no_ano def feed_shelfindex(): - if not (current_user.is_authenticated or g.allow_anonymous): + if not (auth.current_user().is_authenticated or g.allow_anonymous): abort(404) off = request.args.get("offset") or 0 shelf = ub.session.query(ub.Shelf).filter( - or_(ub.Shelf.is_public == 1, ub.Shelf.user_id == current_user.id)).order_by(ub.Shelf.name).all() + or_(ub.Shelf.is_public == 1, ub.Shelf.user_id == auth.current_user().id)).order_by(ub.Shelf.name).all() number = len(shelf) pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, number) @@ -382,14 +383,14 @@ def feed_shelfindex(): @opds.route("/opds/shelf/") @requires_basic_auth_if_no_ano def feed_shelf(book_id): - if not (current_user.is_authenticated or g.allow_anonymous): + if not (auth.current_user().is_authenticated or g.allow_anonymous): abort(404) off = request.args.get("offset") or 0 - if current_user.is_anonymous: + if auth.current_user().is_anonymous: shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == book_id).first() else: - shelf = ub.session.query(ub.Shelf).filter(or_(and_(ub.Shelf.user_id == int(current_user.id), + shelf = ub.session.query(ub.Shelf).filter(or_(and_(ub.Shelf.user_id == int(auth.current_user().id), ub.Shelf.id == book_id), and_(ub.Shelf.is_public == 1, ub.Shelf.id == book_id))).first() @@ -422,7 +423,7 @@ def feed_shelf(book_id): @opds.route("/opds/download///") @requires_basic_auth_if_no_ano def opds_download_link(book_id, book_format): - if not current_user.role_download(): + if not auth.current_user().role_download(): return abort(403) if "Kobo" in request.headers.get('User-Agent'): client = "kobo" @@ -468,7 +469,7 @@ def feed_get_cover(book_id): @opds.route("/opds/readbooks") @requires_basic_auth_if_no_ano def feed_read_books(): - if not (current_user.check_visibility(constants.SIDEBAR_READ_AND_UNREAD) and not current_user.is_anonymous): + if not (auth.current_user().check_visibility(constants.SIDEBAR_READ_AND_UNREAD) and not auth.current_user().is_anonymous): return abort(403) off = request.args.get("offset") or 0 result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, True, True) @@ -478,7 +479,7 @@ def feed_read_books(): @opds.route("/opds/unreadbooks") @requires_basic_auth_if_no_ano def feed_unread_books(): - if not (current_user.check_visibility(constants.SIDEBAR_READ_AND_UNREAD) and not current_user.is_anonymous): + if not (auth.current_user().check_visibility(constants.SIDEBAR_READ_AND_UNREAD) and not auth.current_user().is_anonymous): return abort(403) off = request.args.get("offset") or 0 result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, False, True) diff --git a/cps/redirect.py b/cps/redirect.py old mode 100755 new mode 100644 diff --git a/cps/remotelogin.py b/cps/remotelogin.py index ee434670..73b712e2 100644 --- a/cps/remotelogin.py +++ b/cps/remotelogin.py @@ -25,12 +25,13 @@ from datetime import datetime from functools import wraps from flask import Blueprint, request, make_response, abort, url_for, flash, redirect -from flask_login import login_required, current_user, login_user +from .cw_login import login_user, current_user from flask_babel import gettext as _ from sqlalchemy.sql.expression import true from . import config, logger, ub from .render_template import render_title_template +from .usermanagement import user_login_required remotelogin = Blueprint('remotelogin', __name__) @@ -65,7 +66,7 @@ def remote_login(): @remotelogin.route('/verify/') @remote_login_required -@login_required +@user_login_required def verify_token(token): auth_token = ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.auth_token == token).first() diff --git a/cps/render_template.py b/cps/render_template.py index 89e067d0..bf0356d0 100644 --- a/cps/render_template.py +++ b/cps/render_template.py @@ -19,14 +19,13 @@ from flask import render_template, g, abort, request from flask_babel import gettext as _ from werkzeug.local import LocalProxy -from flask_login import current_user +from .cw_login import current_user from sqlalchemy.sql.expression import or_ from . import config, constants, logger, ub from .ub import User - log = logger.create() def get_sidebar_config(kwargs=None): diff --git a/cps/schedule.py b/cps/schedule.py index 21c8d32a..d01aab16 100644 --- a/cps/schedule.py +++ b/cps/schedule.py @@ -21,7 +21,7 @@ import datetime from . import config, constants from .services.background_scheduler import BackgroundScheduler, CronTrigger, use_APScheduler from .tasks.database import TaskReconnectDatabase -from .tasks.tempFolder import TaskDeleteTempFolder +from .tasks.clean import TaskClean from .tasks.thumbnail import TaskGenerateCoverThumbnails, TaskGenerateSeriesThumbnails, TaskClearCoverThumbnailCache from .services.worker import WorkerThread from .tasks.metadata_backup import TaskBackupMetadata @@ -33,7 +33,7 @@ def get_scheduled_tasks(reconnect=True): tasks.append([lambda: TaskReconnectDatabase(), 'reconnect', False]) # Delete temp folder - tasks.append([lambda: TaskDeleteTempFolder(), 'delete temp', True]) + tasks.append([lambda: TaskClean(), 'delete temp', True]) # Generate metadata.opf file for each changed book if config.schedule_metadata_backup: @@ -94,7 +94,7 @@ def register_startup_tasks(): if constants.APP_MODE in ['development', 'test'] and not should_task_be_running(start, duration): scheduler.schedule_tasks_immediately(tasks=get_scheduled_tasks(False)) else: - scheduler.schedule_tasks_immediately(tasks=[[lambda: TaskDeleteTempFolder(), 'delete temp', True]]) + scheduler.schedule_tasks_immediately(tasks=[[lambda: TaskClean(), 'delete temp', True]]) def should_task_be_running(start, duration): diff --git a/cps/search.py b/cps/search.py index f214b3a8..da74984b 100644 --- a/cps/search.py +++ b/cps/search.py @@ -19,17 +19,19 @@ from datetime import datetime from flask import Blueprint, request, redirect, url_for, flash from flask import session as flask_session -from flask_login import current_user +from .cw_login import current_user from flask_babel import format_date from flask_babel import gettext as _ from sqlalchemy.sql.expression import func, not_, and_, or_, text, true from sqlalchemy.sql.functions import coalesce from . import logger, db, calibre_db, config, ub +from .string_helper import strip_whitespaces from .usermanagement import login_required_if_no_ano from .render_template import render_title_template from .pagination import Pagination + search = Blueprint('search', __name__) log = logger.create() @@ -80,16 +82,27 @@ def adv_search_custom_columns(cc, term, q): if custom_end: q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( func.datetime(db.cc_classes[c.id].value) <= func.datetime(custom_end))) + elif c.datatype in ["int", "float"]: + custom_low = term.get('custom_column_' + str(c.id) + '_low') + custom_high = term.get('custom_column_' + str(c.id) + '_high') + if custom_low: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value >= custom_low)) + if custom_high: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value <= custom_high)) else: custom_query = term.get('custom_column_' + str(c.id)) - if custom_query != '' and custom_query is not None: - if c.datatype == 'bool': - q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( - db.cc_classes[c.id].value == (custom_query == "True"))) - elif c.datatype == 'int' or c.datatype == 'float': - q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( - db.cc_classes[c.id].value == custom_query)) - elif c.datatype == 'rating': + if c.datatype == 'bool': + if custom_query != "Any": + if custom_query == "": + q = q.filter(~getattr(db.Books, 'custom_column_' + str(c.id)). + any(db.cc_classes[c.id].value >= 0)) + else: + q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( + db.cc_classes[c.id].value == bool(custom_query == "True"))) + elif custom_query != '' and custom_query is not None: + if c.datatype == 'rating': q = q.filter(getattr(db.Books, 'custom_column_' + str(c.id)).any( db.cc_classes[c.id].value == int(float(custom_query) * 2))) else: @@ -128,10 +141,10 @@ def adv_search_read_status(read_status): db_filter = coalesce(ub.ReadBook.read_status, 0) != ub.ReadBook.STATUS_FINISHED else: try: - if read_status == "True": - db_filter = db.cc_classes[config.config_read_column].value == True + if read_status == "": + db_filter = coalesce(db.cc_classes[config.config_read_column].value, 2) == 2 else: - db_filter = coalesce(db.cc_classes[config.config_read_column].value, False) != True + db_filter = db.cc_classes[config.config_read_column].value == bool(read_status == "True") except (KeyError, AttributeError, IndexError): log.error("Custom Column No.{} does not exist in calibre database".format(config.config_read_column)) flash(_("Custom Column No.%(column)d does not exist in calibre database", @@ -254,11 +267,11 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): description = term.get("comment") read_status = term.get("read_status") if author_name: - author_name = author_name.strip().lower().replace(',', '|') + author_name = strip_whitespaces(author_name).lower().replace(',', '|') if book_title: - book_title = book_title.strip().lower() + book_title = strip_whitespaces(book_title).lower() if publisher: - publisher = publisher.strip().lower() + publisher = strip_whitespaces(publisher).lower() search_term = [] cc_present = False @@ -274,10 +287,23 @@ def render_adv_search_results(term, offset=None, order=None, limit=None): cc_present = True if column_end: search_term.extend(["{} <= {}".format(c.name, - format_date(datetime.strptime(column_end, "%Y-%m-%d").date(), + format_date(datetime.strptime(column_end, "%Y-%m-%d").date(), format='medium') )]) cc_present = True + if c.datatype in ["int", "float"]: + column_low = term.get('custom_column_' + str(c.id) + '_low') + column_high = term.get('custom_column_' + str(c.id) + '_high') + if column_low: + search_term.extend(["{} >= {}".format(c.name, column_low)]) + cc_present = True + if column_high: + search_term.extend(["{} <= {}".format(c.name,column_high)]) + cc_present = True + elif c.datatype == "bool": + if term.get('custom_column_' + str(c.id)) != "Any": + search_term.extend([("{}: {}".format(c.name, term.get('custom_column_' + str(c.id))))]) + cc_present = True elif term.get('custom_column_' + str(c.id)): search_term.extend([("{}: {}".format(c.name, term.get('custom_column_' + str(c.id))))]) cc_present = True diff --git a/cps/search_metadata.py b/cps/search_metadata.py index e018da32..b818a87c 100644 --- a/cps/search_metadata.py +++ b/cps/search_metadata.py @@ -24,14 +24,14 @@ import os import sys from flask import Blueprint, Response, request, url_for -from flask_login import current_user -from flask_login import login_required +from .cw_login import current_user from flask_babel import get_locale from sqlalchemy.exc import InvalidRequestError, OperationalError from sqlalchemy.orm.attributes import flag_modified from cps.services.Metadata import Metadata from . import constants, logger, ub, web_server +from .usermanagement import user_login_required # current_milli_time = lambda: int(round(time() * 1000)) @@ -81,7 +81,7 @@ cl = list_classes(new_list) @meta.route("/metadata/provider") -@login_required +@user_login_required def metadata_provider(): active = current_user.view_settings.get("metadata", {}) provider = list() @@ -95,7 +95,7 @@ def metadata_provider(): @meta.route("/metadata/provider", methods=["POST"]) @meta.route("/metadata/provider/", methods=["POST"]) -@login_required +@user_login_required def metadata_change_active_provider(prov_name): new_state = request.get_json() active = current_user.view_settings.get("metadata", {}) @@ -122,7 +122,7 @@ def metadata_change_active_provider(prov_name): @meta.route("/metadata/search", methods=["POST"]) -@login_required +@user_login_required def metadata_search(): query = request.form.to_dict().get("query") data = list() diff --git a/cps/shelf.py b/cps/shelf.py index 9d969322..41d5ce1d 100644 --- a/cps/shelf.py +++ b/cps/shelf.py @@ -21,17 +21,17 @@ # along with this program. If not, see . import sys -from datetime import datetime +from datetime import datetime, timezone from flask import Blueprint, flash, redirect, request, url_for, abort from flask_babel import gettext as _ -from flask_login import current_user, login_required +from .cw_login import current_user from sqlalchemy.exc import InvalidRequestError, OperationalError from sqlalchemy.sql.expression import func, true from . import calibre_db, config, db, logger, ub from .render_template import render_title_template -from .usermanagement import login_required_if_no_ano +from .usermanagement import login_required_if_no_ano, user_login_required log = logger.create() @@ -39,7 +39,7 @@ shelf = Blueprint('shelf', __name__) @shelf.route("/shelf/add//", methods=["POST"]) -@login_required +@user_login_required def add_to_shelf(shelf_id, book_id): xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest' shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() @@ -80,7 +80,7 @@ def add_to_shelf(shelf_id, book_id): return "%s is a invalid Book Id. Could not be added to Shelf" % book_id, 400 shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book_id, order=maxOrder + 1)) - shelf.last_modified = datetime.utcnow() + shelf.last_modified = datetime.now(timezone.utc) try: ub.session.merge(shelf) ub.session.commit() @@ -103,7 +103,7 @@ def add_to_shelf(shelf_id, book_id): @shelf.route("/shelf/massadd/", methods=["POST"]) -@login_required +@user_login_required def search_to_shelf(shelf_id): shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() if shelf is None: @@ -139,7 +139,7 @@ def search_to_shelf(shelf_id): for book in books_for_shelf: maxOrder += 1 shelf.books.append(ub.BookShelf(shelf=shelf.id, book_id=book, order=maxOrder)) - shelf.last_modified = datetime.utcnow() + shelf.last_modified = datetime.now(timezone.utc) try: ub.session.merge(shelf) ub.session.commit() @@ -155,7 +155,7 @@ def search_to_shelf(shelf_id): @shelf.route("/shelf/remove//", methods=["POST"]) -@login_required +@user_login_required def remove_from_shelf(shelf_id, book_id): xhr = request.headers.get('X-Requested-With') == 'XMLHttpRequest' shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() @@ -185,7 +185,7 @@ def remove_from_shelf(shelf_id, book_id): try: ub.session.delete(book_shelf) - shelf.last_modified = datetime.utcnow() + shelf.last_modified = datetime.now(timezone.utc) ub.session.commit() except (OperationalError, InvalidRequestError) as e: ub.session.rollback() @@ -212,14 +212,14 @@ def remove_from_shelf(shelf_id, book_id): @shelf.route("/shelf/create", methods=["GET", "POST"]) -@login_required +@user_login_required def create_shelf(): shelf = ub.Shelf() return create_edit_shelf(shelf, page_title=_("Create a Shelf"), page="shelfcreate") @shelf.route("/shelf/edit/", methods=["GET", "POST"]) -@login_required +@user_login_required def edit_shelf(shelf_id): shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() if not check_shelf_edit_permissions(shelf): @@ -229,7 +229,7 @@ def edit_shelf(shelf_id): @shelf.route("/shelf/delete/", methods=["POST"]) -@login_required +@user_login_required def delete_shelf(shelf_id): cur_shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() try: @@ -259,7 +259,7 @@ def show_shelf(shelf_id, sort_param, page): @shelf.route("/shelf/order/", methods=["GET", "POST"]) -@login_required +@user_login_required def order_shelf(shelf_id): shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() if shelf and check_shelf_view_permissions(shelf): @@ -271,7 +271,7 @@ def order_shelf(shelf_id): for book in books_in_shelf: setattr(book, 'order', to_save[str(book.book_id)]) counter += 1 - # if order different from before -> shelf.last_modified = datetime.utcnow() + # if order different from before -> shelf.last_modified = datetime.now(timezone.utc) try: ub.session.commit() except (OperationalError, InvalidRequestError) as e: @@ -422,11 +422,14 @@ def render_show_shelf(shelf_type, shelf_id, page_no, sort_param): # check user is allowed to access shelf if shelf and check_shelf_view_permissions(shelf): if shelf_type == 1: - # order = [ub.BookShelf.order.asc()] if sort_param == 'pubnew': change_shelf_order(shelf_id, [db.Books.pubdate.desc()]) if sort_param == 'pubold': change_shelf_order(shelf_id, [db.Books.pubdate]) + if sort_param == 'shelfnew': + change_shelf_order(shelf_id, [ub.BookShelf.date_added.desc()]) + if sort_param == 'shelfold': + change_shelf_order(shelf_id, [ub.BookShelf.date_added]) if sort_param == 'abc': change_shelf_order(shelf_id, [db.Books.sort]) if sort_param == 'zyx': @@ -453,7 +456,7 @@ def render_show_shelf(shelf_type, shelf_id, page_no, sort_param): [ub.BookShelf.order.asc()], True, config.config_read_column, ub.BookShelf, ub.BookShelf.book_id == db.Books.id) - # delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web + # delete shelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web wrong_entries = calibre_db.session.query(ub.BookShelf) \ .join(db.Books, ub.BookShelf.book_id == db.Books.id, isouter=True) \ .filter(db.Books.id == None).all() diff --git a/cps/static/css/libs/viewer.css b/cps/static/css/libs/viewer.css index 95d45b8f..656bbdc9 100644 --- a/cps/static/css/libs/viewer.css +++ b/cps/static/css/libs/viewer.css @@ -1894,6 +1894,8 @@ width:100%; height:100%; margin:0; + top:0; + left:0; } .annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers{ @@ -2646,6 +2648,10 @@ } } +.pdfViewer.copyAll{ + cursor:wait; + } + .pdfViewer .canvasWrapper{ overflow:hidden; width:100%; @@ -3010,6 +3016,15 @@ body{ scrollbar-color:var(--scrollbar-color) var(--scrollbar-bg-color); } +body.wait::before{ + content:""; + position:fixed; + width:100%; + height:100%; + z-index:100000; + cursor:wait; + } + .hidden, [hidden]{ display:none !important; diff --git a/cps/static/js/libs/pdf.mjs b/cps/static/js/libs/pdf.mjs index 00303559..52a97c21 100644 --- a/cps/static/js/libs/pdf.mjs +++ b/cps/static/js/libs/pdf.mjs @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,4712 @@ * JavaScript code in this page */ -/******/ // The require scope -/******/ var __webpack_require__ = {}; +/******/ var __webpack_modules__ = ({ + +/***/ 9306: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var tryToString = __webpack_require__(6823); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }), + +/***/ 3506: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isPossiblePrototype = __webpack_require__(3925); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + + +/***/ }), + +/***/ 7080: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var has = (__webpack_require__(4402).has); + +// Perform ? RequireInternalSlot(M, [[SetData]]) +module.exports = function (it) { + has(it); + return it; +}; + + +/***/ }), + +/***/ 679: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isPrototypeOf = __webpack_require__(1625); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + + +/***/ }), + +/***/ 8551: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isObject = __webpack_require__(34); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + + +/***/ }), + +/***/ 7811: +/***/ ((module) => { + + +// eslint-disable-next-line es/no-typed-arrays -- safe +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + + +/***/ }), + +/***/ 7394: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThisAccessor = __webpack_require__(6706); +var classof = __webpack_require__(4576); + +var $TypeError = TypeError; + +// Includes +// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +module.exports = uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) { + if (classof(O) !== 'ArrayBuffer') throw new $TypeError('ArrayBuffer expected'); + return O.byteLength; +}; + + +/***/ }), + +/***/ 3238: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var arrayBufferByteLength = __webpack_require__(7394); + +var slice = uncurryThis(ArrayBuffer.prototype.slice); + +module.exports = function (O) { + if (arrayBufferByteLength(O) !== 0) return false; + try { + slice(O, 0, 0); + return false; + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ 5636: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var uncurryThis = __webpack_require__(9504); +var uncurryThisAccessor = __webpack_require__(6706); +var toIndex = __webpack_require__(7696); +var isDetached = __webpack_require__(3238); +var arrayBufferByteLength = __webpack_require__(7394); +var detachTransferable = __webpack_require__(4483); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); + +var structuredClone = global.structuredClone; +var ArrayBuffer = global.ArrayBuffer; +var DataView = global.DataView; +var TypeError = global.TypeError; +var min = Math.min; +var ArrayBufferPrototype = ArrayBuffer.prototype; +var DataViewPrototype = DataView.prototype; +var slice = uncurryThis(ArrayBufferPrototype.slice); +var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get'); +var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get'); +var getInt8 = uncurryThis(DataViewPrototype.getInt8); +var setInt8 = uncurryThis(DataViewPrototype.setInt8); + +module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) { + var byteLength = arrayBufferByteLength(arrayBuffer); + var newByteLength = newLength === undefined ? byteLength : toIndex(newLength); + var fixedLength = !isResizable || !isResizable(arrayBuffer); + var newBuffer; + if (isDetached(arrayBuffer)) throw new TypeError('ArrayBuffer is detached'); + if (PROPER_STRUCTURED_CLONE_TRANSFER) { + arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] }); + if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer; + } + if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) { + newBuffer = slice(arrayBuffer, 0, newByteLength); + } else { + var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : undefined; + newBuffer = new ArrayBuffer(newByteLength, options); + var a = new DataView(arrayBuffer); + var b = new DataView(newBuffer); + var copyLength = min(newByteLength, byteLength); + for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i)); + } + if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer); + return newBuffer; +}; + + +/***/ }), + +/***/ 4644: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_ARRAY_BUFFER = __webpack_require__(7811); +var DESCRIPTORS = __webpack_require__(3724); +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var hasOwn = __webpack_require__(9297); +var classof = __webpack_require__(6955); +var tryToString = __webpack_require__(6823); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIn = __webpack_require__(6840); +var defineBuiltInAccessor = __webpack_require__(2106); +var isPrototypeOf = __webpack_require__(1625); +var getPrototypeOf = __webpack_require__(2787); +var setPrototypeOf = __webpack_require__(2967); +var wellKnownSymbol = __webpack_require__(8227); +var uid = __webpack_require__(3392); +var InternalStateModule = __webpack_require__(1181); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = global.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = global.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = global.TypeError; + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +// Fixing native typed arrays in Opera Presto crashes the browser, see #595 +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; + +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; + +var isView = function isView(it) { + if (!isObject(it)) return false; + var klass = classof(it); + return klass === 'DataView' + || hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) return; + var state = getInternalState(proto); + return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; + +var isTypedArray = function (it) { + if (!isObject(it)) return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw new TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; + throw new TypeError(tryToString(C) + ' is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) return; + if (setPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME in TypedArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else NATIVE_ARRAY_BUFFER_VIEWS = false; +} + +for (NAME in BigIntArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} + +// WebKit bug - typed arrays constructors prototype is Object.prototype +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray = function TypedArray() { + throw new TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) setPrototypeOf(global[NAME], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype); + } +} + +// WebKit bug - one more object in Uint8ClampedArray prototype chain +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { + configurable: true, + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) if (global[NAME]) { + createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME); + } +} + +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + + +/***/ }), + +/***/ 5370: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); + +module.exports = function (Constructor, list, $length) { + var index = 0; + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; +}; + + +/***/ }), + +/***/ 9617: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIndexedObject = __webpack_require__(5397); +var toAbsoluteIndex = __webpack_require__(5610); +var lengthOfArrayLike = __webpack_require__(6198); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ 4527: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var isArray = __webpack_require__(4376); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + + +/***/ }), + +/***/ 7628: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); + +// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toReversed +// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toReversed +module.exports = function (O, C) { + var len = lengthOfArrayLike(O); + var A = new C(len); + var k = 0; + for (; k < len; k++) A[k] = O[len - k - 1]; + return A; +}; + + +/***/ }), + +/***/ 9928: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); +var toIntegerOrInfinity = __webpack_require__(1291); + +var $RangeError = RangeError; + +// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.with +// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with +module.exports = function (O, C, index, value) { + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; + if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); + var A = new C(len); + var k = 0; + for (; k < len; k++) A[k] = k === actualIndex ? value : O[k]; + return A; +}; + + +/***/ }), + +/***/ 6319: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var anObject = __webpack_require__(8551); +var iteratorClose = __webpack_require__(9539); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + + +/***/ }), + +/***/ 4576: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ 6955: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var TO_STRING_TAG_SUPPORT = __webpack_require__(2140); +var isCallable = __webpack_require__(4901); +var classofRaw = __webpack_require__(4576); +var wellKnownSymbol = __webpack_require__(8227); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ 7740: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var hasOwn = __webpack_require__(9297); +var ownKeys = __webpack_require__(5031); +var getOwnPropertyDescriptorModule = __webpack_require__(7347); +var definePropertyModule = __webpack_require__(4913); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + + +/***/ }), + +/***/ 2211: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ 2529: +/***/ ((module) => { + + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }), + +/***/ 6699: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var definePropertyModule = __webpack_require__(4913); +var createPropertyDescriptor = __webpack_require__(6980); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ 6980: +/***/ ((module) => { + + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ 4659: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var definePropertyModule = __webpack_require__(4913); +var createPropertyDescriptor = __webpack_require__(6980); + +module.exports = function (object, key, value) { + if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); + else object[key] = value; +}; + + +/***/ }), + +/***/ 2106: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var makeBuiltIn = __webpack_require__(283); +var defineProperty = __webpack_require__(4913); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + + +/***/ }), + +/***/ 6840: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var definePropertyModule = __webpack_require__(4913); +var makeBuiltIn = __webpack_require__(283); +var defineGlobalProperty = __webpack_require__(9433); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + + +/***/ }), + +/***/ 6279: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); + +module.exports = function (target, src, options) { + for (var key in src) defineBuiltIn(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ 9433: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ 3724: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + + +/***/ }), + +/***/ 4483: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var tryNodeRequire = __webpack_require__(9714); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); + +var structuredClone = global.structuredClone; +var $ArrayBuffer = global.ArrayBuffer; +var $MessageChannel = global.MessageChannel; +var detach = false; +var WorkerThreads, channel, buffer, $detach; + +if (PROPER_STRUCTURED_CLONE_TRANSFER) { + detach = function (transferable) { + structuredClone(transferable, { transfer: [transferable] }); + }; +} else if ($ArrayBuffer) try { + if (!$MessageChannel) { + WorkerThreads = tryNodeRequire('worker_threads'); + if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel; + } + + if ($MessageChannel) { + channel = new $MessageChannel(); + buffer = new $ArrayBuffer(2); + + $detach = function (transferable) { + channel.port1.postMessage(null, [transferable]); + }; + + if (buffer.byteLength === 2) { + $detach(buffer); + if (buffer.byteLength === 0) detach = $detach; + } + } +} catch (error) { /* empty */ } + +module.exports = detach; + + +/***/ }), + +/***/ 4055: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isObject = __webpack_require__(34); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ 6837: +/***/ ((module) => { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }), + +/***/ 5002: +/***/ ((module) => { + + +module.exports = { + IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 }, + DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 }, + HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 }, + WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 }, + InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 }, + NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 }, + NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 }, + NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 }, + NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 }, + InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 }, + InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 }, + SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 }, + InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 }, + NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 }, + InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 }, + ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 }, + TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 }, + SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 }, + NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 }, + AbortError: { s: 'ABORT_ERR', c: 20, m: 1 }, + URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 }, + QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 }, + TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 }, + InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 }, + DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 } +}; + + +/***/ }), + +/***/ 7290: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_DENO = __webpack_require__(516); +var IS_NODE = __webpack_require__(9088); + +module.exports = !IS_DENO && !IS_NODE + && typeof window == 'object' + && typeof document == 'object'; + + +/***/ }), + +/***/ 516: +/***/ ((module) => { + + +/* global Deno -- Deno case */ +module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; + + +/***/ }), + +/***/ 9088: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var classof = __webpack_require__(4576); + +module.exports = classof(global.process) === 'process'; + + +/***/ }), + +/***/ 9392: +/***/ ((module) => { + + +module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; + + +/***/ }), + +/***/ 7388: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var userAgent = __webpack_require__(9392); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ 8727: +/***/ ((module) => { + + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ 6193: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var $Error = Error; +var replace = uncurryThis(''.replace); + +var TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd'); +// eslint-disable-next-line redos/no-vulnerable -- safe +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); + +module.exports = function (stack, dropEntries) { + if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } return stack; +}; + + +/***/ }), + +/***/ 6518: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var getOwnPropertyDescriptor = (__webpack_require__(7347).f); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIn = __webpack_require__(6840); +var defineGlobalProperty = __webpack_require__(9433); +var copyConstructorProperties = __webpack_require__(7740); +var isForced = __webpack_require__(2796); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = global[TARGET] && global[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ 9039: +/***/ ((module) => { + + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ 6080: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(7476); +var aCallable = __webpack_require__(9306); +var NATIVE_BIND = __webpack_require__(616); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ 616: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = (function () { /* empty */ }).bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + + +/***/ }), + +/***/ 9565: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_BIND = __webpack_require__(616); + +var call = Function.prototype.call; + +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + + +/***/ }), + +/***/ 350: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var hasOwn = __webpack_require__(9297); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + + +/***/ }), + +/***/ 6706: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var aCallable = __webpack_require__(9306); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ 7476: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classofRaw = __webpack_require__(4576); +var uncurryThis = __webpack_require__(9504); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + + +/***/ }), + +/***/ 9504: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_BIND = __webpack_require__(616); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ 7751: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ 1767: +/***/ ((module) => { + + +// `GetIteratorDirect(obj)` abstract operation +// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect +module.exports = function (obj) { + return { + iterator: obj, + next: obj.next, + done: false + }; +}; + + +/***/ }), + +/***/ 8646: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var getIteratorMethod = __webpack_require__(851); + +module.exports = function (obj, stringHandling) { + if (!stringHandling || typeof obj !== 'string') anObject(obj); + var method = getIteratorMethod(obj); + return getIteratorDirect(anObject(method !== undefined ? call(method, obj) : obj)); +}; + + +/***/ }), + +/***/ 851: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); +var getMethod = __webpack_require__(5966); +var isNullOrUndefined = __webpack_require__(4117); +var Iterators = __webpack_require__(6269); +var wellKnownSymbol = __webpack_require__(8227); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ 81: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var tryToString = __webpack_require__(6823); +var getIteratorMethod = __webpack_require__(851); + +var $TypeError = TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw new $TypeError(tryToString(argument) + ' is not iterable'); +}; + + +/***/ }), + +/***/ 5966: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); +var isNullOrUndefined = __webpack_require__(4117); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + + +/***/ }), + +/***/ 3789: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var call = __webpack_require__(9565); +var toIntegerOrInfinity = __webpack_require__(1291); +var getIteratorDirect = __webpack_require__(1767); + +var INVALID_SIZE = 'Invalid size'; +var $RangeError = RangeError; +var $TypeError = TypeError; +var max = Math.max; + +var SetRecord = function (set, intSize) { + this.set = set; + this.size = max(intSize, 0); + this.has = aCallable(set.has); + this.keys = aCallable(set.keys); +}; + +SetRecord.prototype = { + getIterator: function () { + return getIteratorDirect(anObject(call(this.keys, this.set))); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); + var intSize = toIntegerOrInfinity(numSize); + if (intSize < 0) throw new $RangeError(INVALID_SIZE); + return new SetRecord(obj, intSize); +}; + + +/***/ }), + +/***/ 4475: +/***/ (function(module) { + + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + + +/***/ }), + +/***/ 9297: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var toObject = __webpack_require__(8981); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ 421: +/***/ ((module) => { + + +module.exports = {}; + + +/***/ }), + +/***/ 397: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ 5917: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var fails = __webpack_require__(9039); +var createElement = __webpack_require__(4055); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + + +/***/ }), + +/***/ 7055: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var fails = __webpack_require__(9039); +var classof = __webpack_require__(4576); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + + +/***/ }), + +/***/ 3167: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var setPrototypeOf = __webpack_require__(2967); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ 3706: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var isCallable = __webpack_require__(4901); +var store = __webpack_require__(7629); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ 1181: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_WEAK_MAP = __webpack_require__(8622); +var global = __webpack_require__(4475); +var isObject = __webpack_require__(34); +var createNonEnumerableProperty = __webpack_require__(6699); +var hasOwn = __webpack_require__(9297); +var shared = __webpack_require__(7629); +var sharedKey = __webpack_require__(6119); +var hiddenKeys = __webpack_require__(421); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ 4209: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var wellKnownSymbol = __webpack_require__(8227); +var Iterators = __webpack_require__(6269); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ 4376: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(4576); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + + +/***/ }), + +/***/ 1108: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); + +module.exports = function (it) { + var klass = classof(it); + return klass === 'BigInt64Array' || klass === 'BigUint64Array'; +}; + + +/***/ }), + +/***/ 4901: +/***/ ((module) => { + + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }), + +/***/ 2796: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ 4117: +/***/ ((module) => { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }), + +/***/ 34: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + + +/***/ }), + +/***/ 3925: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isObject = __webpack_require__(34); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + + +/***/ }), + +/***/ 6395: +/***/ ((module) => { + + +module.exports = false; + + +/***/ }), + +/***/ 757: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); +var isCallable = __webpack_require__(4901); +var isPrototypeOf = __webpack_require__(1625); +var USE_SYMBOL_AS_UID = __webpack_require__(7040); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + + +/***/ }), + +/***/ 507: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); + +module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { + var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; + var next = record.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; + + +/***/ }), + +/***/ 2652: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var bind = __webpack_require__(6080); +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var tryToString = __webpack_require__(6823); +var isArrayIteratorMethod = __webpack_require__(4209); +var lengthOfArrayLike = __webpack_require__(6198); +var isPrototypeOf = __webpack_require__(1625); +var getIterator = __webpack_require__(81); +var getIteratorMethod = __webpack_require__(851); +var iteratorClose = __webpack_require__(9539); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ 9539: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var getMethod = __webpack_require__(5966); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + + +/***/ }), + +/***/ 9462: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var create = __webpack_require__(2360); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIns = __webpack_require__(6279); +var wellKnownSymbol = __webpack_require__(8227); +var InternalStateModule = __webpack_require__(1181); +var getMethod = __webpack_require__(5966); +var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); +var createIterResultObject = __webpack_require__(2529); +var iteratorClose = __webpack_require__(9539); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; +var setInternalState = InternalStateModule.set; + +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); + + return defineBuiltIns(create(IteratorPrototype), { + next: function next() { + var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); + try { + var result = state.done ? undefined : state.nextHandler(); + return createIterResultObject(result, state.done); + } catch (error) { + state.done = true; + throw error; + } + }, + 'return': function () { + var state = getInternalState(this); + var iterator = state.iterator; + state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); + } + if (state.inner) try { + iteratorClose(state.inner.iterator, 'normal'); + } catch (error) { + return iteratorClose(iterator, 'throw', error); + } + iteratorClose(iterator, 'normal'); + return createIterResultObject(undefined, true); + } + }); +}; + +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); +var IteratorHelperPrototype = createIteratorProxyPrototype(false); + +createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); + +module.exports = function (nextHandler, IS_ITERATOR) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + state.nextHandler = nextHandler; + state.counter = 0; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; + + return IteratorProxy; +}; + + +/***/ }), + +/***/ 713: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var createIteratorProxy = __webpack_require__(9462); +var callWithSafeIterationClosing = __webpack_require__(6319); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +// `Iterator.prototype.map` method +// https://github.com/tc39/proposal-iterator-helpers +module.exports = function map(mapper) { + anObject(this); + aCallable(mapper); + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper + }); +}; + + +/***/ }), + +/***/ 7657: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var create = __webpack_require__(2360); +var getPrototypeOf = __webpack_require__(2787); +var defineBuiltIn = __webpack_require__(6840); +var wellKnownSymbol = __webpack_require__(8227); +var IS_PURE = __webpack_require__(6395); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ 6269: +/***/ ((module) => { + + +module.exports = {}; + + +/***/ }), + +/***/ 6198: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toLength = __webpack_require__(8014); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + + +/***/ }), + +/***/ 283: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); +var hasOwn = __webpack_require__(9297); +var DESCRIPTORS = __webpack_require__(3724); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(350).CONFIGURABLE); +var inspectSource = __webpack_require__(3706); +var InternalStateModule = __webpack_require__(1181); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + + +/***/ }), + +/***/ 741: +/***/ ((module) => { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }), + +/***/ 6043: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); + +var $TypeError = TypeError; + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ 2603: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toString = __webpack_require__(655); + +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; + + +/***/ }), + +/***/ 4149: +/***/ ((module) => { + + +var $RangeError = RangeError; + +module.exports = function (it) { + // eslint-disable-next-line no-self-compare -- NaN check + if (it === it) return it; + throw new $RangeError('NaN is not allowed'); +}; + + +/***/ }), + +/***/ 2360: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(8551); +var definePropertiesModule = __webpack_require__(6801); +var enumBugKeys = __webpack_require__(8727); +var hiddenKeys = __webpack_require__(421); +var html = __webpack_require__(397); +var documentCreateElement = __webpack_require__(4055); +var sharedKey = __webpack_require__(6119); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + + +/***/ }), + +/***/ 6801: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); +var definePropertyModule = __webpack_require__(4913); +var anObject = __webpack_require__(8551); +var toIndexedObject = __webpack_require__(5397); +var objectKeys = __webpack_require__(1072); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ 4913: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var IE8_DOM_DEFINE = __webpack_require__(5917); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); +var anObject = __webpack_require__(8551); +var toPropertyKey = __webpack_require__(6969); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ 7347: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var call = __webpack_require__(9565); +var propertyIsEnumerableModule = __webpack_require__(8773); +var createPropertyDescriptor = __webpack_require__(6980); +var toIndexedObject = __webpack_require__(5397); +var toPropertyKey = __webpack_require__(6969); +var hasOwn = __webpack_require__(9297); +var IE8_DOM_DEFINE = __webpack_require__(5917); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + + +/***/ }), + +/***/ 8480: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var internalObjectKeys = __webpack_require__(1828); +var enumBugKeys = __webpack_require__(8727); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ 3717: +/***/ ((__unused_webpack_module, exports) => { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ 2787: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var hasOwn = __webpack_require__(9297); +var isCallable = __webpack_require__(4901); +var toObject = __webpack_require__(8981); +var sharedKey = __webpack_require__(6119); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(2211); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ 1625: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ 1828: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var hasOwn = __webpack_require__(9297); +var toIndexedObject = __webpack_require__(5397); +var indexOf = (__webpack_require__(9617).indexOf); +var hiddenKeys = __webpack_require__(421); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + + +/***/ }), + +/***/ 1072: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var internalObjectKeys = __webpack_require__(1828); +var enumBugKeys = __webpack_require__(8727); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ 8773: +/***/ ((__unused_webpack_module, exports) => { + + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ 2967: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = __webpack_require__(6706); +var isObject = __webpack_require__(34); +var requireObjectCoercible = __webpack_require__(7750); +var aPossiblePrototype = __webpack_require__(3506); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ 4270: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ 5031: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); +var uncurryThis = __webpack_require__(9504); +var getOwnPropertyNamesModule = __webpack_require__(8480); +var getOwnPropertySymbolsModule = __webpack_require__(3717); +var anObject = __webpack_require__(8551); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ 8235: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var hasOwn = __webpack_require__(9297); + +var $SyntaxError = SyntaxError; +var $parseInt = parseInt; +var fromCharCode = String.fromCharCode; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); + +var codePoints = { + '\\"': '"', + '\\\\': '\\', + '\\/': '/', + '\\b': '\b', + '\\f': '\f', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' +}; + +var IS_4_HEX_DIGITS = /^[\da-f]{4}$/i; +// eslint-disable-next-line regexp/no-control-character -- safe +var IS_C0_CONTROL_CODE = /^[\u0000-\u001F]$/; + +module.exports = function (source, i) { + var unterminated = true; + var value = ''; + while (i < source.length) { + var chr = at(source, i); + if (chr === '\\') { + var twoChars = slice(source, i, i + 2); + if (hasOwn(codePoints, twoChars)) { + value += codePoints[twoChars]; + i += 2; + } else if (twoChars === '\\u') { + i += 2; + var fourHexDigits = slice(source, i, i + 4); + if (!exec(IS_4_HEX_DIGITS, fourHexDigits)) throw new $SyntaxError('Bad Unicode escape at: ' + i); + value += fromCharCode($parseInt(fourHexDigits, 16)); + i += 4; + } else throw new $SyntaxError('Unknown escape sequence: "' + twoChars + '"'); + } else if (chr === '"') { + unterminated = false; + i++; + break; + } else { + if (exec(IS_C0_CONTROL_CODE, chr)) throw new $SyntaxError('Bad control character in string literal at: ' + i); + value += chr; + i++; + } + } + if (unterminated) throw new $SyntaxError('Unterminated string at: ' + i); + return { value: value, end: i }; +}; + + +/***/ }), + +/***/ 7750: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isNullOrUndefined = __webpack_require__(4117); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ 9286: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var SetHelpers = __webpack_require__(4402); +var iterate = __webpack_require__(8469); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; + +module.exports = function (set) { + var result = new Set(); + iterate(set, function (it) { + add(result, it); + }); + return result; +}; + + +/***/ }), + +/***/ 3440: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var clone = __webpack_require__(9286); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); + +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(O) <= otherRec.size) iterateSet(O, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) remove(result, e); + }); + return result; +}; + + +/***/ }), + +/***/ 4402: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +// eslint-disable-next-line es/no-set -- safe +var SetPrototype = Set.prototype; + +module.exports = { + // eslint-disable-next-line es/no-set -- safe + Set: Set, + add: uncurryThis(SetPrototype.add), + has: uncurryThis(SetPrototype.has), + remove: uncurryThis(SetPrototype['delete']), + proto: SetPrototype +}; + + +/***/ }), + +/***/ 8750: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + + +/***/ }), + +/***/ 4449: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var has = (__webpack_require__(4402).has); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); +var iteratorClose = __webpack_require__(9539); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) <= otherRec.size) return iterateSet(O, function (e) { + if (otherRec.includes(e)) return false; + }, true) !== false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (has(O, e)) return iteratorClose(iterator, 'normal', false); + }) !== false; +}; + + +/***/ }), + +/***/ 3838: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var size = __webpack_require__(5170); +var iterate = __webpack_require__(8469); +var getSetRecord = __webpack_require__(3789); + +// `Set.prototype.isSubsetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }, true) !== false; +}; + + +/***/ }), + +/***/ 8527: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var has = (__webpack_require__(4402).has); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); +var iteratorClose = __webpack_require__(9539); + +// `Set.prototype.isSupersetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (!has(O, e)) return iteratorClose(iterator, 'normal', false); + }) !== false; +}; + + +/***/ }), + +/***/ 8469: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var iterateSimple = __webpack_require__(507); +var SetHelpers = __webpack_require__(4402); + +var Set = SetHelpers.Set; +var SetPrototype = SetHelpers.proto; +var forEach = uncurryThis(SetPrototype.forEach); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new Set()).next; + +module.exports = function (set, fn, interruptible) { + return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); +}; + + +/***/ }), + +/***/ 4916: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); + +var createSetLike = function (size) { + return { + size: size, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +module.exports = function (name) { + var Set = getBuiltIn('Set'); + try { + new Set()[name](createSetLike(0)); + try { + // late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it + // https://github.com/tc39/proposal-set-methods/pull/88 + new Set()[name](createSetLike(-1)); + return false; + } catch (error2) { + return true; + } + } catch (error) { + return false; + } +}; + + +/***/ }), + +/***/ 5170: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThisAccessor = __webpack_require__(6706); +var SetHelpers = __webpack_require__(4402); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + + +/***/ }), + +/***/ 3650: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var clone = __webpack_require__(9286); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + + +/***/ }), + +/***/ 4204: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var add = (__webpack_require__(4402).add); +var clone = __webpack_require__(9286); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; + + +/***/ }), + +/***/ 6119: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var shared = __webpack_require__(5745); +var uid = __webpack_require__(3392); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ 7629: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_PURE = __webpack_require__(6395); +var globalThis = __webpack_require__(4475); +var defineGlobalProperty = __webpack_require__(9433); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.37.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + + +/***/ }), + +/***/ 5745: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var store = __webpack_require__(7629); + +module.exports = function (key, value) { + return store[key] || (store[key] = value || {}); +}; + + +/***/ }), + +/***/ 1548: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var fails = __webpack_require__(9039); +var V8 = __webpack_require__(7388); +var IS_BROWSER = __webpack_require__(7290); +var IS_DENO = __webpack_require__(516); +var IS_NODE = __webpack_require__(9088); + +var structuredClone = global.structuredClone; + +module.exports = !!structuredClone && !fails(function () { + // prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if ((IS_DENO && V8 > 92) || (IS_NODE && V8 > 94) || (IS_BROWSER && V8 > 97)) return false; + var buffer = new ArrayBuffer(8); + var clone = structuredClone(buffer, { transfer: [buffer] }); + return buffer.byteLength !== 0 || clone.byteLength !== 8; +}); + + +/***/ }), + +/***/ 4495: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(7388); +var fails = __webpack_require__(9039); +var global = __webpack_require__(4475); + +var $String = global.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + + +/***/ }), + +/***/ 5610: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ 5854: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toPrimitive = __webpack_require__(2777); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + + +/***/ }), + +/***/ 7696: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); +var toLength = __webpack_require__(8014); + +var $RangeError = RangeError; + +// `ToIndex` abstract operation +// https://tc39.es/ecma262/#sec-toindex +module.exports = function (it) { + if (it === undefined) return 0; + var number = toIntegerOrInfinity(it); + var length = toLength(number); + if (number !== length) throw new $RangeError('Wrong length or index'); + return length; +}; + + +/***/ }), + +/***/ 5397: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(7055); +var requireObjectCoercible = __webpack_require__(7750); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ 1291: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }), + +/***/ 8014: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ 8981: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var requireObjectCoercible = __webpack_require__(7750); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ 9590: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); + +var $RangeError = RangeError; + +module.exports = function (it) { + var result = toIntegerOrInfinity(it); + if (result < 0) throw new $RangeError("The argument can't be less than 0"); + return result; +}; + + +/***/ }), + +/***/ 2777: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var isObject = __webpack_require__(34); +var isSymbol = __webpack_require__(757); +var getMethod = __webpack_require__(5966); +var ordinaryToPrimitive = __webpack_require__(4270); +var wellKnownSymbol = __webpack_require__(8227); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + + +/***/ }), + +/***/ 6969: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toPrimitive = __webpack_require__(2777); +var isSymbol = __webpack_require__(757); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ 2140: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var wellKnownSymbol = __webpack_require__(8227); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ 655: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + + +/***/ }), + +/***/ 9714: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_NODE = __webpack_require__(9088); + +module.exports = function (name) { + try { + // eslint-disable-next-line no-new-func -- safe + if (IS_NODE) return Function('return require("' + name + '")')(); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ 6823: +/***/ ((module) => { + + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }), + +/***/ 3392: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ }), + +/***/ 7040: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(4495); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ 8686: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var fails = __webpack_require__(9039); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + + +/***/ }), + +/***/ 2812: +/***/ ((module) => { + + +var $TypeError = TypeError; + +module.exports = function (passed, required) { + if (passed < required) throw new $TypeError('Not enough arguments'); + return passed; +}; + + +/***/ }), + +/***/ 8622: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + + +/***/ }), + +/***/ 8227: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var shared = __webpack_require__(5745); +var hasOwn = __webpack_require__(9297); +var uid = __webpack_require__(3392); +var NATIVE_SYMBOL = __webpack_require__(4495); +var USE_SYMBOL_AS_UID = __webpack_require__(7040); + +var Symbol = global.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ 6573: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var defineBuiltInAccessor = __webpack_require__(2106); +var isDetached = __webpack_require__(3238); + +var ArrayBufferPrototype = ArrayBuffer.prototype; + +if (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) { + defineBuiltInAccessor(ArrayBufferPrototype, 'detached', { + configurable: true, + get: function detached() { + return isDetached(this); + } + }); +} + + +/***/ }), + +/***/ 7936: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var $transfer = __webpack_require__(5636); + +// `ArrayBuffer.prototype.transferToFixedLength` method +// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfertofixedlength +if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { + transferToFixedLength: function transferToFixedLength() { + return $transfer(this, arguments.length ? arguments[0] : undefined, false); + } +}); + + +/***/ }), + +/***/ 8100: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var $transfer = __webpack_require__(5636); + +// `ArrayBuffer.prototype.transfer` method +// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfer +if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { + transfer: function transfer() { + return $transfer(this, arguments.length ? arguments[0] : undefined, true); + } +}); + + +/***/ }), + +/***/ 4114: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var toObject = __webpack_require__(8981); +var lengthOfArrayLike = __webpack_require__(6198); +var setArrayLength = __webpack_require__(4527); +var doesNotExceedSafeInteger = __webpack_require__(6837); +var fails = __webpack_require__(9039); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + + +/***/ }), + +/***/ 4628: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var newPromiseCapabilityModule = __webpack_require__(6043); + +// `Promise.withResolvers` method +// https://github.com/tc39/proposal-promise-with-resolvers +$({ target: 'Promise', stat: true }, { + withResolvers: function withResolvers() { + var promiseCapability = newPromiseCapabilityModule.f(this); + return { + promise: promiseCapability.promise, + resolve: promiseCapability.resolve, + reject: promiseCapability.reject + }; + } +}); + + +/***/ }), + +/***/ 7642: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var difference = __webpack_require__(3440); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, { + difference: difference +}); + + +/***/ }), + +/***/ 8004: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var fails = __webpack_require__(9039); +var intersection = __webpack_require__(8750); +var setMethodAcceptSetLike = __webpack_require__(4916); + +var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () { + // eslint-disable-next-line es/no-array-from, es/no-set -- testing + return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; +}); + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + intersection: intersection +}); + + +/***/ }), + +/***/ 3853: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isDisjointFrom = __webpack_require__(4449); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isDisjointFrom` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, { + isDisjointFrom: isDisjointFrom +}); + + +/***/ }), + +/***/ 5876: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isSubsetOf = __webpack_require__(3838); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isSubsetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, { + isSubsetOf: isSubsetOf +}); + + +/***/ }), + +/***/ 2475: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isSupersetOf = __webpack_require__(8527); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isSupersetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, { + isSupersetOf: isSupersetOf +}); + + +/***/ }), + +/***/ 5024: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var symmetricDifference = __webpack_require__(3650); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, { + symmetricDifference: symmetricDifference +}); + + +/***/ }), + +/***/ 1698: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var union = __webpack_require__(4204); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, { + union: union +}); + + +/***/ }), + +/***/ 7467: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var arrayToReversed = __webpack_require__(7628); +var ArrayBufferViewCore = __webpack_require__(4644); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; + +// `%TypedArray%.prototype.toReversed` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed +exportTypedArrayMethod('toReversed', function toReversed() { + return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this)); +}); + + +/***/ }), + +/***/ 4732: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var ArrayBufferViewCore = __webpack_require__(4644); +var uncurryThis = __webpack_require__(9504); +var aCallable = __webpack_require__(9306); +var arrayFromConstructorAndList = __webpack_require__(5370); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +var sort = uncurryThis(ArrayBufferViewCore.TypedArrayPrototype.sort); + +// `%TypedArray%.prototype.toSorted` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tosorted +exportTypedArrayMethod('toSorted', function toSorted(compareFn) { + if (compareFn !== undefined) aCallable(compareFn); + var O = aTypedArray(this); + var A = arrayFromConstructorAndList(getTypedArrayConstructor(O), O); + return sort(A, compareFn); +}); + + +/***/ }), + +/***/ 9577: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var arrayWith = __webpack_require__(9928); +var ArrayBufferViewCore = __webpack_require__(4644); +var isBigIntArray = __webpack_require__(1108); +var toIntegerOrInfinity = __webpack_require__(1291); +var toBigInt = __webpack_require__(5854); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var PROPER_ORDER = !!function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var relativeIndex = toIntegerOrInfinity(index); + var actualValue = isBigIntArray(O) ? toBigInt(value) : +value; + return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue); +} }['with'], !PROPER_ORDER); + + +/***/ }), + +/***/ 8992: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var global = __webpack_require__(4475); +var anInstance = __webpack_require__(679); +var anObject = __webpack_require__(8551); +var isCallable = __webpack_require__(4901); +var getPrototypeOf = __webpack_require__(2787); +var defineBuiltInAccessor = __webpack_require__(2106); +var createProperty = __webpack_require__(4659); +var fails = __webpack_require__(9039); +var hasOwn = __webpack_require__(9297); +var wellKnownSymbol = __webpack_require__(8227); +var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); +var DESCRIPTORS = __webpack_require__(3724); +var IS_PURE = __webpack_require__(6395); + +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var $TypeError = TypeError; +var NativeIterator = global[ITERATOR]; + +// FF56- have non-standard global helper `Iterator` +var FORCED = IS_PURE + || !isCallable(NativeIterator) + || NativeIterator.prototype !== IteratorPrototype + // FF44- non-standard `Iterator` passes previous tests + || !fails(function () { NativeIterator({}); }); + +var IteratorConstructor = function Iterator() { + anInstance(this, IteratorPrototype); + if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); +}; + +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); +} + +IteratorConstructor.prototype = IteratorPrototype; + +// `Iterator` constructor +// https://github.com/tc39/proposal-iterator-helpers +$({ global: true, constructor: true, forced: FORCED }, { + Iterator: IteratorConstructor +}); + + +/***/ }), + +/***/ 4743: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var notANaN = __webpack_require__(4149); +var toPositiveInteger = __webpack_require__(9590); +var createIteratorProxy = __webpack_require__(9462); +var IS_PURE = __webpack_require__(6395); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var next = this.next; + var result, done; + while (this.remaining) { + this.remaining--; + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + } + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (!done) return result.value; +}); + +// `Iterator.prototype.drop` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + drop: function drop(limit) { + anObject(this); + var remaining = toPositiveInteger(notANaN(+limit)); + return new IteratorProxy(getIteratorDirect(this), { + remaining: remaining + }); + } +}); + + +/***/ }), + +/***/ 3215: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.every` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + every: function every(predicate) { + anObject(this); + aCallable(predicate); + var record = getIteratorDirect(this); + var counter = 0; + return !iterate(record, function (value, stop) { + if (!predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + + +/***/ }), + +/***/ 4520: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var createIteratorProxy = __webpack_require__(9462); +var callWithSafeIterationClosing = __webpack_require__(6319); +var IS_PURE = __webpack_require__(6395); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var predicate = this.predicate; + var next = this.next; + var result, done, value; + while (true) { + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + value = result.value; + if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; + } +}); + +// `Iterator.prototype.filter` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + filter: function filter(predicate) { + anObject(this); + aCallable(predicate); + return new IteratorProxy(getIteratorDirect(this), { + predicate: predicate + }); + } +}); + + +/***/ }), + +/***/ 670: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var getIteratorFlattenable = __webpack_require__(8646); +var createIteratorProxy = __webpack_require__(9462); +var iteratorClose = __webpack_require__(9539); +var IS_PURE = __webpack_require__(6395); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var mapper = this.mapper; + var result, inner; + + while (true) { + if (inner = this.inner) try { + result = anObject(call(inner.next, inner.iterator)); + if (!result.done) return result.value; + this.inner = null; + } catch (error) { iteratorClose(iterator, 'throw', error); } + + result = anObject(call(this.next, iterator)); + + if (this.done = !!result.done) return; + + try { + this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false); + } catch (error) { iteratorClose(iterator, 'throw', error); } + } +}); + +// `Iterator.prototype.flatMap` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + flatMap: function flatMap(mapper) { + anObject(this); + aCallable(mapper); + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper, + inner: null + }); + } +}); + + +/***/ }), + +/***/ 1454: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var map = __webpack_require__(713); +var IS_PURE = __webpack_require__(6395); + +// `Iterator.prototype.map` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + map: map +}); + + +/***/ }), + +/***/ 7550: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.some` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + some: function some(predicate) { + anObject(this); + aCallable(predicate); + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + + +/***/ }), + +/***/ 8335: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var DESCRIPTORS = __webpack_require__(3724); +var global = __webpack_require__(4475); +var getBuiltIn = __webpack_require__(7751); +var uncurryThis = __webpack_require__(9504); +var call = __webpack_require__(9565); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var isArray = __webpack_require__(4376); +var hasOwn = __webpack_require__(9297); +var toString = __webpack_require__(655); +var lengthOfArrayLike = __webpack_require__(6198); +var createProperty = __webpack_require__(4659); +var fails = __webpack_require__(9039); +var parseJSONString = __webpack_require__(8235); +var NATIVE_SYMBOL = __webpack_require__(4495); + +var JSON = global.JSON; +var Number = global.Number; +var SyntaxError = global.SyntaxError; +var nativeParse = JSON && JSON.parse; +var enumerableOwnProperties = getBuiltIn('Object', 'keys'); +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var at = uncurryThis(''.charAt); +var slice = uncurryThis(''.slice); +var exec = uncurryThis(/./.exec); +var push = uncurryThis([].push); + +var IS_DIGIT = /^\d$/; +var IS_NON_ZERO_DIGIT = /^[1-9]$/; +var IS_NUMBER_START = /^(?:-|\d)$/; +var IS_WHITESPACE = /^[\t\n\r ]$/; + +var PRIMITIVE = 0; +var OBJECT = 1; + +var $parse = function (source, reviver) { + source = toString(source); + var context = new Context(source, 0, ''); + var root = context.parse(); + var value = root.value; + var endIndex = context.skip(IS_WHITESPACE, root.end); + if (endIndex < source.length) { + throw new SyntaxError('Unexpected extra character: "' + at(source, endIndex) + '" after the parsed data at: ' + endIndex); + } + return isCallable(reviver) ? internalize({ '': value }, '', reviver, root) : value; +}; + +var internalize = function (holder, name, reviver, node) { + var val = holder[name]; + var unmodified = node && val === node.value; + var context = unmodified && typeof node.source == 'string' ? { source: node.source } : {}; + var elementRecordsLen, keys, len, i, P; + if (isObject(val)) { + var nodeIsArray = isArray(val); + var nodes = unmodified ? node.nodes : nodeIsArray ? [] : {}; + if (nodeIsArray) { + elementRecordsLen = nodes.length; + len = lengthOfArrayLike(val); + for (i = 0; i < len; i++) { + internalizeProperty(val, i, internalize(val, '' + i, reviver, i < elementRecordsLen ? nodes[i] : undefined)); + } + } else { + keys = enumerableOwnProperties(val); + len = lengthOfArrayLike(keys); + for (i = 0; i < len; i++) { + P = keys[i]; + internalizeProperty(val, P, internalize(val, P, reviver, hasOwn(nodes, P) ? nodes[P] : undefined)); + } + } + } + return call(reviver, holder, name, val, context); +}; + +var internalizeProperty = function (object, key, value) { + if (DESCRIPTORS) { + var descriptor = getOwnPropertyDescriptor(object, key); + if (descriptor && !descriptor.configurable) return; + } + if (value === undefined) delete object[key]; + else createProperty(object, key, value); +}; + +var Node = function (value, end, source, nodes) { + this.value = value; + this.end = end; + this.source = source; + this.nodes = nodes; +}; + +var Context = function (source, index) { + this.source = source; + this.index = index; +}; + +// https://www.json.org/json-en.html +Context.prototype = { + fork: function (nextIndex) { + return new Context(this.source, nextIndex); + }, + parse: function () { + var source = this.source; + var i = this.skip(IS_WHITESPACE, this.index); + var fork = this.fork(i); + var chr = at(source, i); + if (exec(IS_NUMBER_START, chr)) return fork.number(); + switch (chr) { + case '{': + return fork.object(); + case '[': + return fork.array(); + case '"': + return fork.string(); + case 't': + return fork.keyword(true); + case 'f': + return fork.keyword(false); + case 'n': + return fork.keyword(null); + } throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + }, + node: function (type, value, start, end, nodes) { + return new Node(value, end, type ? null : slice(this.source, start, end), nodes); + }, + object: function () { + var source = this.source; + var i = this.index + 1; + var expectKeypair = false; + var object = {}; + var nodes = {}; + while (i < source.length) { + i = this.until(['"', '}'], i); + if (at(source, i) === '}' && !expectKeypair) { + i++; + break; + } + // Parsing the key + var result = this.fork(i).string(); + var key = result.value; + i = result.end; + i = this.until([':'], i) + 1; + // Parsing value + i = this.skip(IS_WHITESPACE, i); + result = this.fork(i).parse(); + createProperty(nodes, key, result); + createProperty(object, key, result.value); + i = this.until([',', '}'], result.end); + var chr = at(source, i); + if (chr === ',') { + expectKeypair = true; + i++; + } else if (chr === '}') { + i++; + break; + } + } + return this.node(OBJECT, object, this.index, i, nodes); + }, + array: function () { + var source = this.source; + var i = this.index + 1; + var expectElement = false; + var array = []; + var nodes = []; + while (i < source.length) { + i = this.skip(IS_WHITESPACE, i); + if (at(source, i) === ']' && !expectElement) { + i++; + break; + } + var result = this.fork(i).parse(); + push(nodes, result); + push(array, result.value); + i = this.until([',', ']'], result.end); + if (at(source, i) === ',') { + expectElement = true; + i++; + } else if (at(source, i) === ']') { + i++; + break; + } + } + return this.node(OBJECT, array, this.index, i, nodes); + }, + string: function () { + var index = this.index; + var parsed = parseJSONString(this.source, this.index + 1); + return this.node(PRIMITIVE, parsed.value, index, parsed.end); + }, + number: function () { + var source = this.source; + var startIndex = this.index; + var i = startIndex; + if (at(source, i) === '-') i++; + if (at(source, i) === '0') i++; + else if (exec(IS_NON_ZERO_DIGIT, at(source, i))) i = this.skip(IS_DIGIT, ++i); + else throw new SyntaxError('Failed to parse number at: ' + i); + if (at(source, i) === '.') i = this.skip(IS_DIGIT, ++i); + if (at(source, i) === 'e' || at(source, i) === 'E') { + i++; + if (at(source, i) === '+' || at(source, i) === '-') i++; + var exponentStartIndex = i; + i = this.skip(IS_DIGIT, i); + if (exponentStartIndex === i) throw new SyntaxError("Failed to parse number's exponent value at: " + i); + } + return this.node(PRIMITIVE, Number(slice(source, startIndex, i)), startIndex, i); + }, + keyword: function (value) { + var keyword = '' + value; + var index = this.index; + var endIndex = index + keyword.length; + if (slice(this.source, index, endIndex) !== keyword) throw new SyntaxError('Failed to parse value at: ' + index); + return this.node(PRIMITIVE, value, index, endIndex); + }, + skip: function (regex, i) { + var source = this.source; + for (; i < source.length; i++) if (!exec(regex, at(source, i))) break; + return i; + }, + until: function (array, i) { + i = this.skip(IS_WHITESPACE, i); + var chr = at(this.source, i); + for (var j = 0; j < array.length; j++) if (array[j] === chr) return i; + throw new SyntaxError('Unexpected character: "' + chr + '" at: ' + i); + } +}; + +var NO_SOURCE_SUPPORT = fails(function () { + var unsafeInt = '9007199254740993'; + var source; + nativeParse(unsafeInt, function (key, value, context) { + source = context.source; + }); + return source !== unsafeInt; +}); + +var PROPER_BASE_PARSE = NATIVE_SYMBOL && !fails(function () { + // Safari 9 bug + return 1 / nativeParse('-0 \t') !== -Infinity; +}); + +// `JSON.parse` method +// https://tc39.es/ecma262/#sec-json.parse +// https://github.com/tc39/proposal-json-parse-with-source +$({ target: 'JSON', stat: true, forced: NO_SOURCE_SUPPORT }, { + parse: function parse(text, reviver) { + return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text) : $parse(text, reviver); + } +}); + + +/***/ }), + +/***/ 3375: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(7642); + + +/***/ }), + +/***/ 9225: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(8004); + + +/***/ }), + +/***/ 3972: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(3853); + + +/***/ }), + +/***/ 9209: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(5876); + + +/***/ }), + +/***/ 5714: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(2475); + + +/***/ }), + +/***/ 7561: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(5024); + + +/***/ }), + +/***/ 6197: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(1698); + + +/***/ }), + +/***/ 4979: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var global = __webpack_require__(4475); +var getBuiltIn = __webpack_require__(7751); +var createPropertyDescriptor = __webpack_require__(6980); +var defineProperty = (__webpack_require__(4913).f); +var hasOwn = __webpack_require__(9297); +var anInstance = __webpack_require__(679); +var inheritIfRequired = __webpack_require__(3167); +var normalizeStringArgument = __webpack_require__(2603); +var DOMExceptionConstants = __webpack_require__(5002); +var clearErrorStack = __webpack_require__(6193); +var DESCRIPTORS = __webpack_require__(3724); +var IS_PURE = __webpack_require__(6395); + +var DOM_EXCEPTION = 'DOMException'; +var Error = getBuiltIn('Error'); +var NativeDOMException = getBuiltIn(DOM_EXCEPTION); + +var $DOMException = function DOMException() { + anInstance(this, DOMExceptionPrototype); + var argumentsLength = arguments.length; + var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]); + var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error'); + var that = new NativeDOMException(message, name); + var error = new Error(message); + error.name = DOM_EXCEPTION; + defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1))); + inheritIfRequired(that, this, $DOMException); + return that; +}; + +var DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype; + +var ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION); +var DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(global, DOM_EXCEPTION); + +// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it +// https://github.com/Jarred-Sumner/bun/issues/399 +var BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable); + +var FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK; + +// `DOMException` constructor patch for `.stack` where it's required +// https://webidl.spec.whatwg.org/#es-DOMException-specialness +$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic + DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException +}); + +var PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION); +var PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype; + +if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) { + if (!IS_PURE) { + defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException)); + } + + for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) { + var constant = DOMExceptionConstants[key]; + var constantName = constant.s; + if (!hasOwn(PolyfilledDOMException, constantName)) { + defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c)); + } + } +} + + +/***/ }), + +/***/ 4603: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); +var uncurryThis = __webpack_require__(9504); +var toString = __webpack_require__(655); +var validateArgumentsLength = __webpack_require__(2812); + +var $URLSearchParams = URLSearchParams; +var URLSearchParamsPrototype = $URLSearchParams.prototype; +var append = uncurryThis(URLSearchParamsPrototype.append); +var $delete = uncurryThis(URLSearchParamsPrototype['delete']); +var forEach = uncurryThis(URLSearchParamsPrototype.forEach); +var push = uncurryThis([].push); +var params = new $URLSearchParams('a=1&a=2&b=3'); + +params['delete']('a', 1); +// `undefined` case is a Chromium 117 bug +// https://bugs.chromium.org/p/v8/issues/detail?id=14222 +params['delete']('b', undefined); + +if (params + '' !== 'a=2') { + defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name /* , value */) { + var length = arguments.length; + var $value = length < 2 ? undefined : arguments[1]; + if (length && $value === undefined) return $delete(this, name); + var entries = []; + forEach(this, function (v, k) { // also validates `this` + push(entries, { key: k, value: v }); + }); + validateArgumentsLength(length, 1); + var key = toString(name); + var value = toString($value); + var index = 0; + var dindex = 0; + var found = false; + var entriesLength = entries.length; + var entry; + while (index < entriesLength) { + entry = entries[index++]; + if (found || entry.key === key) { + found = true; + $delete(this, entry.key); + } else dindex++; + } + while (dindex < entriesLength) { + entry = entries[dindex++]; + if (!(entry.key === key && entry.value === value)) append(this, entry.key, entry.value); + } + }, { enumerable: true, unsafe: true }); +} + + +/***/ }), + +/***/ 7566: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); +var uncurryThis = __webpack_require__(9504); +var toString = __webpack_require__(655); +var validateArgumentsLength = __webpack_require__(2812); + +var $URLSearchParams = URLSearchParams; +var URLSearchParamsPrototype = $URLSearchParams.prototype; +var getAll = uncurryThis(URLSearchParamsPrototype.getAll); +var $has = uncurryThis(URLSearchParamsPrototype.has); +var params = new $URLSearchParams('a=1'); + +// `undefined` case is a Chromium 117 bug +// https://bugs.chromium.org/p/v8/issues/detail?id=14222 +if (params.has('a', 2) || !params.has('a', undefined)) { + defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name /* , value */) { + var length = arguments.length; + var $value = length < 2 ? undefined : arguments[1]; + if (length && $value === undefined) return $has(this, name); + var values = getAll(this, name); // also validates `this` + validateArgumentsLength(length, 1); + var value = toString($value); + var index = 0; + while (index < values.length) { + if (values[index++] === value) return true; + } return false; + }, { enumerable: true, unsafe: true }); +} + + +/***/ }), + +/***/ 8721: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var uncurryThis = __webpack_require__(9504); +var defineBuiltInAccessor = __webpack_require__(2106); + +var URLSearchParamsPrototype = URLSearchParams.prototype; +var forEach = uncurryThis(URLSearchParamsPrototype.forEach); + +// `URLSearchParams.prototype.size` getter +// https://github.com/whatwg/url/pull/734 +if (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) { + defineBuiltInAccessor(URLSearchParamsPrototype, 'size', { + get: function size() { + var count = 0; + forEach(this, function () { count++; }); + return count; + }, + configurable: true, + enumerable: true + }); +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ @@ -63,7 +4767,6 @@ __webpack_require__.d(__webpack_exports__, { InvalidPDFException: () => (/* reexport */ InvalidPDFException), MissingPDFException: () => (/* reexport */ MissingPDFException), OPS: () => (/* reexport */ OPS), - Outliner: () => (/* reexport */ Outliner), PDFDataRangeTransport: () => (/* reexport */ PDFDataRangeTransport), PDFDateString: () => (/* reexport */ PDFDateString), PDFWorker: () => (/* reexport */ PDFWorker), @@ -87,14 +4790,42 @@ __webpack_require__.d(__webpack_exports__, { isPdfFile: () => (/* reexport */ isPdfFile), noContextMenu: () => (/* reexport */ noContextMenu), normalizeUnicode: () => (/* reexport */ normalizeUnicode), - renderTextLayer: () => (/* reexport */ renderTextLayer), setLayerDimensions: () => (/* reexport */ setLayerDimensions), shadow: () => (/* reexport */ shadow), - updateTextLayer: () => (/* reexport */ updateTextLayer), version: () => (/* reexport */ version) }); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push = __webpack_require__(4114); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.detached.js +var es_array_buffer_detached = __webpack_require__(6573); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer.js +var es_array_buffer_transfer = __webpack_require__(8100); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer-to-fixed-length.js +var es_array_buffer_transfer_to_fixed_length = __webpack_require__(7936); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js +var es_typed_array_to_reversed = __webpack_require__(7467); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js +var es_typed_array_to_sorted = __webpack_require__(4732); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js +var es_typed_array_with = __webpack_require__(9577); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js +var web_url_search_params_delete = __webpack_require__(4603); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js +var web_url_search_params_has = __webpack_require__(7566); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js +var web_url_search_params_size = __webpack_require__(8721); ;// CONCATENATED MODULE: ./src/shared/util.js + + + + + + + + + + const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; @@ -110,6 +4841,7 @@ const RenderingIntentFlag = { ANNOTATIONS_FORMS: 0x10, ANNOTATIONS_STORAGE: 0x20, ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, OPLIST: 0x100 }; const AnnotationMode = { @@ -365,7 +5097,9 @@ const OPS = { paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, - constructPath: 91 + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 }; const PasswordResponses = { NEED_PASSWORD: 1, @@ -830,6 +5564,38 @@ const FontRenderOps = { TRANSLATE: 8 }; +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.with-resolvers.js +var es_promise_with_resolvers = __webpack_require__(4628); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js +var esnext_iterator_map = __webpack_require__(1454); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.difference.v2.js +var esnext_set_difference_v2 = __webpack_require__(3375); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.intersection.v2.js +var esnext_set_intersection_v2 = __webpack_require__(9225); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-disjoint-from.v2.js +var esnext_set_is_disjoint_from_v2 = __webpack_require__(3972); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-subset-of.v2.js +var esnext_set_is_subset_of_v2 = __webpack_require__(9209); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-superset-of.v2.js +var esnext_set_is_superset_of_v2 = __webpack_require__(5714); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.symmetric-difference.v2.js +var esnext_set_symmetric_difference_v2 = __webpack_require__(7561); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.union.v2.js +var esnext_set_union_v2 = __webpack_require__(6197); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js +var web_dom_exception_stack = __webpack_require__(4979); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js +var esnext_iterator_constructor = __webpack_require__(8992); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.drop.js +var esnext_iterator_drop = __webpack_require__(4743); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.every.js +var esnext_iterator_every = __webpack_require__(3215); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.some.js +var esnext_iterator_some = __webpack_require__(7550); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.json.parse.js +var esnext_json_parse = __webpack_require__(8335); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js +var esnext_iterator_filter = __webpack_require__(4520); ;// CONCATENATED MODULE: ./src/display/base_factory.js class BaseFilterFactory { @@ -856,10 +5622,14 @@ class BaseFilterFactory { destroy(keepHCM = false) {} } class BaseCanvasFactory { - constructor() { + #enableHWA = false; + constructor({ + enableHWA = false + } = {}) { if (this.constructor === BaseCanvasFactory) { unreachable("Cannot initialize BaseCanvasFactory."); } + this.#enableHWA = enableHWA; } create(width, height) { if (width <= 0 || height <= 0) { @@ -868,7 +5638,9 @@ class BaseCanvasFactory { const canvas = this._createCanvas(width, height); return { canvas, - context: canvas.getContext("2d") + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) }; } reset(canvasAndContext, width, height) { @@ -985,6 +5757,19 @@ class BaseSVGFactory { ;// CONCATENATED MODULE: ./src/display/display_utils.js + + + + + + + + + + + + + const SVG_NS = "http://www.w3.org/2000/svg"; class PixelsPerInch { static CSS = 96.0; @@ -992,6 +5777,7 @@ class PixelsPerInch { static PDF_TO_CSS_UNITS = this.CSS / this.PDF; } class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; #_cache; #_defs; #docId; @@ -1055,6 +5841,20 @@ class DOMFilterFactory extends BaseFilterFactory { } return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = url.split("#", 1)[0]; + } + } + } + return `url(${this.#baseUrl}#${id})`; + } addFilter(maps) { if (!maps) { return "none"; @@ -1071,7 +5871,7 @@ class DOMFilterFactory extends BaseFilterFactory { return value; } const id = `g_${this.#docId}_transfer_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(maps, url); this.#cache.set(key, url); const filter = this.#createFilter(id); @@ -1129,7 +5929,7 @@ class DOMFilterFactory extends BaseFilterFactory { return arr.join(","); }; this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); - info.url = `url(#${id})`; + info.url = this.#createUrl(id); return info.url; } addAlphaFilter(map) { @@ -1145,7 +5945,7 @@ class DOMFilterFactory extends BaseFilterFactory { return value; } const id = `g_${this.#docId}_alpha_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(map, url); this.#cache.set(key, url); const filter = this.#createFilter(id); @@ -1170,7 +5970,7 @@ class DOMFilterFactory extends BaseFilterFactory { return value; } const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(map, url); this.#cache.set(key, url); const filter = this.#createFilter(id); @@ -1233,7 +6033,7 @@ class DOMFilterFactory extends BaseFilterFactory { const filter = info.filter = this.#createFilter(id); this.#addGrayConversion(filter); this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); - info.url = `url(#${id})`; + info.url = this.#createUrl(id); return info.url; } destroy(keepHCM = false) { @@ -1294,9 +6094,12 @@ class DOMFilterFactory extends BaseFilterFactory { } class DOMCanvasFactory extends BaseCanvasFactory { constructor({ - ownerDocument = globalThis.document + ownerDocument = globalThis.document, + enableHWA = false } = {}) { - super(); + super({ + enableHWA + }); this._document = ownerDocument; } _createCanvas(width, height) { @@ -1710,8 +6513,13 @@ class EditorToolbar { const editToolbar = this.#toolbar = document.createElement("div"); editToolbar.className = "editToolbar"; editToolbar.setAttribute("role", "toolbar"); - editToolbar.addEventListener("contextmenu", noContextMenu); - editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown); + const signal = this.#editor._uiManager._signal; + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); const buttons = this.#buttons = document.createElement("div"); buttons.className = "buttons"; editToolbar.append(buttons); @@ -1741,13 +6549,18 @@ class EditorToolbar { e.stopPropagation(); } #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; element.addEventListener("focusin", this.#focusIn.bind(this), { - capture: true + capture: true, + signal }); element.addEventListener("focusout", this.#focusOut.bind(this), { - capture: true + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal }); - element.addEventListener("contextmenu", noContextMenu); } hide() { this.#toolbar.classList.add("hidden"); @@ -1764,6 +6577,8 @@ class EditorToolbar { this.#addListenersToElement(button); button.addEventListener("click", e => { this.#editor._uiManager.delete(); + }, { + signal: this.#editor._uiManager._signal }); this.#buttons.append(button); } @@ -1799,7 +6614,9 @@ class HighlightToolbar { const editToolbar = this.#toolbar = document.createElement("div"); editToolbar.className = "editToolbar"; editToolbar.setAttribute("role", "toolbar"); - editToolbar.addEventListener("contextmenu", noContextMenu); + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal: this.#uiManager._signal + }); const buttons = this.#buttons = document.createElement("div"); buttons.className = "buttons"; editToolbar.append(buttons); @@ -1851,9 +6668,14 @@ class HighlightToolbar { button.append(span); span.className = "visuallyHidden"; span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); - button.addEventListener("contextmenu", noContextMenu); + const signal = this.#uiManager._signal; + button.addEventListener("contextmenu", noContextMenu, { + signal + }); button.addEventListener("click", () => { this.#uiManager.highlightSelection("floating_button"); + }, { + signal }); this.#buttons.append(button); } @@ -1862,6 +6684,26 @@ class HighlightToolbar { ;// CONCATENATED MODULE: ./src/display/editor/tools.js + + + + + + + + + + + + + + + + + + + + function bindEvents(obj, element, names) { for (const name of names) { @@ -1884,7 +6726,9 @@ class ImageManager { static get _isSVGFittingCanvas() { const svg = `data:image/svg+xml;charset=UTF-8,`; const canvas = new OffscreenCanvas(1, 3); - const ctx = canvas.getContext("2d"); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); const image = new Image(); image.src = svg; const promise = image.decode().then(() => { @@ -2190,6 +7034,7 @@ class ColorManager { } } class AnnotationEditorUIManager { + #abortController = new AbortController(); #activeEditor = null; #allEditors = new Map(); #allLayers = new Map(); @@ -2203,6 +7048,7 @@ class AnnotationEditorUIManager { #editorTypes = null; #editorsToRescale = new Set(); #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; #filterFactory = null; #focusMainContainerTimeoutId = null; #highlightColors = null; @@ -2229,7 +7075,6 @@ class AnnotationEditorUIManager { #boundOnEditingAction = this.onEditingAction.bind(this); #boundOnPageChanging = this.onPageChanging.bind(this); #boundOnScaleChanging = this.onScaleChanging.bind(this); - #boundSelectionChange = this.#selectionChange.bind(this); #boundOnRotationChanging = this.onRotationChanging.bind(this); #previousStates = { isEditing: false, @@ -2303,7 +7148,8 @@ class AnnotationEditorUIManager { checker: arrowChecker }]])); } - constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, mlManager) { + constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, mlManager) { + this._signal = this.#abortController.signal; this.#container = container; this.#viewer = viewer; this.#altTextManager = altTextManager; @@ -2313,12 +7159,14 @@ class AnnotationEditorUIManager { this._eventBus._on("scalechanging", this.#boundOnScaleChanging); this._eventBus._on("rotationchanging", this.#boundOnRotationChanging); this.#addSelectionListener(); + this.#addDragAndDropListeners(); this.#addKeyboardManager(); this.#annotationStorage = pdfDocument.annotationStorage; this.#filterFactory = pdfDocument.filterFactory; this.#pageColors = pageColors; this.#highlightColors = highlightColors || null; this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; this.#mlManager = mlManager || null; this.viewParameters = { realScale: PixelsPerInch.PDF_TO_CSS_UNITS, @@ -2327,8 +7175,9 @@ class AnnotationEditorUIManager { this.isShiftKeyDown = false; } destroy() { - this.#removeKeyboardManager(); - this.#removeFocusManager(); + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; this._eventBus._off("editingaction", this.#boundOnEditingAction); this._eventBus._off("pagechanging", this.#boundOnPageChanging); this._eventBus._off("scalechanging", this.#boundOnScaleChanging); @@ -2353,13 +7202,15 @@ class AnnotationEditorUIManager { clearTimeout(this.#translationTimeoutId); this.#translationTimeoutId = null; } - this.#removeSelectionListener(); } async mlGuess(data) { return this.#mlManager?.guess(data) || null; } - get hasMLManager() { - return !!this.#mlManager; + async isMLEnabledFor(name) { + return !!(await this.#mlManager?.isEnabledFor(name)); + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; } get hcmFilter() { return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); @@ -2379,6 +7230,23 @@ class AnnotationEditorUIManager { editAltText(editor) { this.#altTextManager?.editAltText(this, editor); } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } onPageChanging({ pageNumber }) { @@ -2430,6 +7298,20 @@ class AnnotationEditorUIManager { }) { return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } highlightSelection(methodOfCreation = "") { const selection = document.getSelection(); if (!selection || selection.isCollapsed) { @@ -2449,30 +7331,30 @@ class AnnotationEditorUIManager { return; } selection.empty(); - if (this.#mode === AnnotationEditorType.NONE) { - this._eventBus.dispatch("showannotationeditorui", { - source: this, - mode: AnnotationEditorType.HIGHLIGHT + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text }); - this.showAllEditors("highlight", true, true); - } - for (const layer of this.#allLayers.values()) { - if (layer.hasTextLayer(textLayer)) { - layer.createAndAddNewEditor({ - x: 0, - y: 0 - }, false, { - methodOfCreation, - boxes, - anchorNode, - anchorOffset, - focusNode, - focusOffset, - text - }); - break; + if (isNoneMode) { + this.showAllEditors("highlight", true, true); } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; } + callback(); } #displayHighlightToolbar() { const selection = document.getSelection(); @@ -2536,18 +7418,26 @@ class AnnotationEditorUIManager { } this.#highlightWhenShiftUp = this.isShiftKeyDown; if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + const signal = this._signal; const pointerup = e => { if (e.type === "pointerup" && e.button !== 0) { return; } + activeLayer?.toggleDrawing(true); window.removeEventListener("pointerup", pointerup); window.removeEventListener("blur", pointerup); if (e.type === "pointerup") { this.#onSelectEnd("main_toolbar"); } }; - window.addEventListener("pointerup", pointerup); - window.addEventListener("blur", pointerup); + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); } } #onSelectEnd(methodOfCreation = "") { @@ -2558,14 +7448,18 @@ class AnnotationEditorUIManager { } } #addSelectionListener() { - document.addEventListener("selectionchange", this.#boundSelectionChange); - } - #removeSelectionListener() { - document.removeEventListener("selectionchange", this.#boundSelectionChange); + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); } #addFocusManager() { - window.addEventListener("focus", this.#boundFocus); - window.addEventListener("blur", this.#boundBlur); + const signal = this._signal; + window.addEventListener("focus", this.#boundFocus, { + signal + }); + window.addEventListener("blur", this.#boundBlur, { + signal + }); } #removeFocusManager() { window.removeEventListener("focus", this.#boundFocus); @@ -2600,28 +7494,50 @@ class AnnotationEditorUIManager { lastActiveElement.addEventListener("focusin", () => { lastEditor._focusEventsAllowed = true; }, { - once: true + once: true, + signal: this._signal }); lastActiveElement.focus(); } #addKeyboardManager() { - window.addEventListener("keydown", this.#boundKeydown); - window.addEventListener("keyup", this.#boundKeyup); + const signal = this._signal; + window.addEventListener("keydown", this.#boundKeydown, { + signal + }); + window.addEventListener("keyup", this.#boundKeyup, { + signal + }); } #removeKeyboardManager() { window.removeEventListener("keydown", this.#boundKeydown); window.removeEventListener("keyup", this.#boundKeyup); } #addCopyPasteListeners() { - document.addEventListener("copy", this.#boundCopy); - document.addEventListener("cut", this.#boundCut); - document.addEventListener("paste", this.#boundPaste); + const signal = this._signal; + document.addEventListener("copy", this.#boundCopy, { + signal + }); + document.addEventListener("cut", this.#boundCut, { + signal + }); + document.addEventListener("paste", this.#boundPaste, { + signal + }); } #removeCopyPasteListeners() { document.removeEventListener("copy", this.#boundCopy); document.removeEventListener("cut", this.#boundCut); document.removeEventListener("paste", this.#boundPaste); } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } addEditListeners() { this.#addKeyboardManager(); this.#addCopyPasteListeners(); @@ -2630,6 +7546,30 @@ class AnnotationEditorUIManager { this.#removeKeyboardManager(); this.#removeCopyPasteListeners(); } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } copy(event) { event.preventDefault(); this.#activeEditor?.commitOrRemove(); @@ -3434,20 +8374,28 @@ class AltText { altText.textContent = msg; altText.setAttribute("aria-label", msg); altText.tabIndex = "0"; - altText.addEventListener("contextmenu", noContextMenu); - altText.addEventListener("pointerdown", event => event.stopPropagation()); + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); const onClick = event => { event.preventDefault(); this.#editor._uiManager.editAltText(this.#editor); }; altText.addEventListener("click", onClick, { - capture: true + capture: true, + signal }); altText.addEventListener("keydown", event => { if (event.target === altText && event.key === "Enter") { this.#altTextWasFromKeyBoard = true; onClick(event); } + }, { + signal }); await this.#setState(); return altText; @@ -3518,6 +8466,13 @@ class AltText { const id = tooltip.id = `alt-text-tooltip-${this.#editor.id}`; button.setAttribute("aria-describedby", id); const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); button.addEventListener("mouseenter", () => { this.#altTextTooltipTimeout = setTimeout(() => { this.#altTextTooltipTimeout = null; @@ -3526,6 +8481,8 @@ class AltText { action: "alt_text_tooltip" }); }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal }); button.addEventListener("mouseleave", () => { if (this.#altTextTooltipTimeout) { @@ -3533,6 +8490,8 @@ class AltText { this.#altTextTooltipTimeout = null; } this.#altTextTooltip?.classList.remove("show"); + }, { + signal }); } tooltip.innerText = this.#altTextDecorative ? await AltText._l10nPromise.get("pdfjs-editor-alt-text-decorative-tooltip") : this.#altText; @@ -3551,6 +8510,7 @@ class AltText { class AnnotationEditor { + #accessibilityData = null; #allResizerDivs = null; #altText = null; #disabled = false; @@ -3979,13 +8939,18 @@ class AnnotationEditor { this.#resizersDiv = document.createElement("div"); this.#resizersDiv.classList.add("resizers"); const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; for (const name of classes) { const div = document.createElement("div"); this.#resizersDiv.append(div); div.classList.add("resizer", name); div.setAttribute("data-resizer-name", name); - div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name)); - div.addEventListener("contextmenu", noContextMenu); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); div.tabIndex = -1; } this.div.prepend(this.#resizersDiv); @@ -4002,13 +8967,17 @@ class AnnotationEditor { const boundResizerPointermove = this.#resizerPointermove.bind(this, name); const savedDraggable = this._isDraggable; this._isDraggable = false; + const signal = this._uiManager._signal; const pointerMoveOptions = { passive: true, - capture: true + capture: true, + signal }; this.parent.togglePointerEvents(false); window.addEventListener("pointermove", boundResizerPointermove, pointerMoveOptions); - window.addEventListener("contextmenu", noContextMenu); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); const savedX = this.x; const savedY = this.y; const savedWidth = this.width; @@ -4028,8 +8997,12 @@ class AnnotationEditor { this.div.style.cursor = savedCursor; this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight); }; - window.addEventListener("pointerup", pointerUpCallback); - window.addEventListener("blur", pointerUpCallback); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); } #addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight) { const newX = this.x; @@ -4178,6 +9151,10 @@ class AnnotationEditor { } AltText.initialize(AnnotationEditor._l10nPromise); this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } await this.addEditToolbar(); } get altTextData() { @@ -4202,8 +9179,13 @@ class AnnotationEditor { this.div.classList.add("hidden"); } this.setInForeground(); - this.div.addEventListener("focusin", this.#boundFocusin); - this.div.addEventListener("focusout", this.#boundFocusout); + const signal = this._uiManager._signal; + this.div.addEventListener("focusin", this.#boundFocusin, { + signal + }); + this.div.addEventListener("focusout", this.#boundFocusout, { + signal + }); const [parentWidth, parentHeight] = this.parentDimensions; if (this.parentRotation % 180 !== 0) { this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; @@ -4243,11 +9225,13 @@ class AnnotationEditor { const isSelected = this._uiManager.isSelected(this); this._uiManager.setUpDragSession(); let pointerMoveOptions, pointerMoveCallback; + const signal = this._uiManager._signal; if (isSelected) { this.div.classList.add("moving"); pointerMoveOptions = { passive: true, - capture: true + capture: true, + signal }; this.#prevDragX = event.clientX; this.#prevDragY = event.clientY; @@ -4275,8 +9259,12 @@ class AnnotationEditor { this.#selectOnPointerEvent(event); } }; - window.addEventListener("pointerup", pointerUpCallback); - window.addEventListener("blur", pointerUpCallback); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); } moveInDOM() { if (this.#moveInDOMTimeout) { @@ -4353,8 +9341,13 @@ class AnnotationEditor { return this.div && !this.isAttachedToDOM; } rebuild() { - this.div?.addEventListener("focusin", this.#boundFocusin); - this.div?.addEventListener("focusout", this.#boundFocusout); + const signal = this._uiManager._signal; + this.div?.addEventListener("focusin", this.#boundFocusin, { + signal + }); + this.div?.addEventListener("focusout", this.#boundFocusout, { + signal + }); } rotate(_angle) {} serialize(isForCopying = false, context = null) { @@ -4367,6 +9360,7 @@ class AnnotationEditor { uiManager }); editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; const [pageWidth, pageHeight] = editor.pageDimensions; const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); editor.x = x / pageWidth; @@ -4432,12 +9426,19 @@ class AnnotationEditor { this.#allResizerDivs = Array.from(children); const boundResizerKeydown = this.#resizerKeydown.bind(this); const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; for (const div of this.#allResizerDivs) { const name = div.getAttribute("data-resizer-name"); div.setAttribute("role", "spinbutton"); - div.addEventListener("keydown", boundResizerKeydown); - div.addEventListener("blur", boundResizerBlur); - div.addEventListener("focus", this.#resizerFocus.bind(this, name)); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => div.setAttribute("aria-label", msg)); } } @@ -4676,6 +9677,12 @@ class FakeEditor extends AnnotationEditor { } ;// CONCATENATED MODULE: ./src/shared/murmurhash3.js + + + + + + const SEED = 0xc3d2e1f0; const MASK_HIGH = 0xffff0000; const MASK_LOW = 0xffff; @@ -4772,6 +9779,16 @@ class MurmurHash3_64 { + + + + + + + + + + const SerializableEmpty = Object.freeze({ map: null, hash: "", @@ -4779,6 +9796,7 @@ const SerializableEmpty = Object.freeze({ }); class AnnotationStorage { #modified = false; + #modifiedIds = null; #storage = new Map(); constructor() { this.onSetModified = null; @@ -4930,6 +9948,25 @@ class AnnotationStorage { } return stats; } + resetModifiedIds() { + this.#modifiedIds = null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor) || !value.annotationElementId || !value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash: ids.join(",") + }; + } } class PrintAnnotationStorage extends AnnotationStorage { #serializable; @@ -4955,10 +9992,25 @@ class PrintAnnotationStorage extends AnnotationStorage { get serializable() { return this.#serializable; } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } } ;// CONCATENATED MODULE: ./src/display/font_loader.js + + + + + + + + + class FontLoader { #systemFonts = new Set(); constructor({ @@ -5296,6 +10348,13 @@ class FontFaceObject { ;// CONCATENATED MODULE: ./src/display/node_utils.js + + + + + + + if (isNodeJS) { var packageCapability = Promise.withResolvers(); var packageMap = null; @@ -5305,6 +10364,12 @@ if (isNodeJS) { https = await import( /*webpackIgnore: true*/"https"), url = await import( /*webpackIgnore: true*/"url"); let canvas, path2d; + try { + canvas = await import( /*webpackIgnore: true*/"canvas"); + } catch {} + try { + path2d = await import( /*webpackIgnore: true*/"path2d"); + } catch {} return new Map(Object.entries({ fs, http, @@ -5317,6 +10382,25 @@ if (isNodeJS) { loadPackages().then(map => { packageMap = map; packageCapability.resolve(); + if (!globalThis.DOMMatrix) { + const DOMMatrix = map.get("canvas")?.DOMMatrix; + if (DOMMatrix) { + globalThis.DOMMatrix = DOMMatrix; + } else { + warn("Cannot polyfill `DOMMatrix`, rendering may be broken."); + } + } + if (!globalThis.Path2D) { + const CanvasRenderingContext2D = map.get("canvas")?.CanvasRenderingContext2D; + const applyPath2DToCanvasRenderingContext = map.get("path2d")?.applyPath2DToCanvasRenderingContext; + const Path2D = map.get("path2d")?.Path2D; + if (CanvasRenderingContext2D && applyPath2DToCanvasRenderingContext && Path2D) { + applyPath2DToCanvasRenderingContext(CanvasRenderingContext2D); + globalThis.Path2D = Path2D; + } else { + warn("Cannot polyfill `Path2D`, rendering may be broken."); + } + } }, reason => { warn(`loadPackages: ${reason}`); packageMap = new Map(); @@ -5798,6 +10882,12 @@ class TilingPattern { ;// CONCATENATED MODULE: ./src/shared/image_utils.js + + + + + + function convertToRGBA(params) { switch (params.kind) { case ImageKind.GRAYSCALE_1BPP: @@ -5908,6 +10998,17 @@ function grayToRGBA(src, dest) { + + + + + + + + + + + const MIN_FONT_SIZE = 16; const MAX_FONT_SIZE = 100; const EXECUTION_TIME = 15; @@ -6601,6 +11702,7 @@ class CanvasGraphics { while (this.stateStack.length || this.inSMaskMode) { this.restore(); } + this.current.activeSMask = null; this.ctx.restore(); if (this.transparentCanvas) { this.ctx = this.compositeCtx; @@ -7507,14 +12609,17 @@ class CanvasGraphics { this.current.patternFill = true; } setStrokeRGBColor(r, g, b) { - const color = Util.makeHexColor(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; + this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(r, g, b); + } + setStrokeTransparent() { + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; } setFillRGBColor(r, g, b) { - const color = Util.makeHexColor(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; + this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b); + this.current.patternFill = false; + } + setFillTransparent() { + this.ctx.fillStyle = this.current.fillColor = "transparent"; this.current.patternFill = false; } _getPattern(objId, matrix = null) { @@ -8104,6 +13209,7 @@ class GlobalWorkerOptions { ;// CONCATENATED MODULE: ./src/shared/message_handler.js + const CallbackKind = { UNKNOWN: 0, DATA: 1, @@ -8786,6 +13892,16 @@ class OptionalContentConfig { ;// CONCATENATED MODULE: ./src/display/transport_stream.js + + + + + + + + + + class PDFDataTransportStream { constructor(pdfDataRangeTransport, { disableRange = false, @@ -9053,6 +14169,8 @@ class PDFDataTransportStreamRangeReader { ;// CONCATENATED MODULE: ./src/display/content_disposition.js + + function getFilenameFromContentDispositionHeader(contentDisposition) { let needsEncodingFixup = true; let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); @@ -9245,6 +14363,14 @@ function validateResponseStatus(status) { ;// CONCATENATED MODULE: ./src/display/fetch_stream.js + + + + + + + + function createFetchOptions(headers, withCredentials, abortController) { return { method: "GET", @@ -9449,6 +14575,8 @@ class PDFFetchStreamRangeReader { ;// CONCATENATED MODULE: ./src/display/network.js + + const OK_RESPONSE = 200; const PARTIAL_CONTENT_RESPONSE = 206; function network_getArrayBuffer(xhr) { @@ -9856,6 +14984,14 @@ class PDFNetworkStreamRangeRequestReader { + + + + + + + + const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; function parseUrl(sourceUrl) { const url = NodePackages.get("url"); @@ -10194,6 +15330,15 @@ class PDFNodeStreamFsRangeReader extends BaseRangeReader { ;// CONCATENATED MODULE: ./src/display/text_layer.js + + + + + + + + + const MAX_TEXT_DIVS_TO_RENDER = 100000; const DEFAULT_FONT_SIZE = 30; const DEFAULT_FONT_ASCENT = 0.8; @@ -10218,6 +15363,7 @@ class TextLayer { #transform = null; static #ascentCache = new Map(); static #canvasContexts = new Map(); + static #minFontSize = null; static #pendingTextLayers = new Set(); constructor({ textContentSource, @@ -10255,6 +15401,7 @@ class TextLayer { this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; this.#pageWidth = pageWidth; this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); setLayerDimensions(container, viewport); this.#capability.promise.catch(() => {}).then(() => { TextLayer.#pendingTextLayers.delete(this); @@ -10329,7 +15476,7 @@ class TextLayer { if (this.#disableProcessItems) { return; } - this.#layoutTextParams.ctx ||= TextLayer.#getCtx(this.#lang); + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); const textDivs = this.#textDivs, textContentItemsStr = this.#textContentItemsStr; for (const item of items) { @@ -10392,7 +15539,7 @@ class TextLayer { divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; } - divStyle.fontSize = `${scaleFactorStr}${fontHeight.toFixed(2)}px)`; + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; divStyle.fontFamily = fontFamily; textDivProperties.fontSize = fontHeight; textDiv.setAttribute("role", "presentation"); @@ -10442,6 +15589,9 @@ class TextLayer { style } = div; let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } if (properties.canvasWidth !== 0 && properties.hasText) { const { fontFamily @@ -10459,7 +15609,7 @@ class TextLayer { width } = ctx.measureText(div.textContent); if (width > 0) { - transform = `scaleX(${canvasWidth * this.#scale / width})`; + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; } } if (properties.angle !== 0) { @@ -10489,12 +15639,27 @@ class TextLayer { canvas.lang = lang; document.body.append(canvas); canvasContext = canvas.getContext("2d", { - alpha: false + alpha: false, + willReadFrequently: true }); this.#canvasContexts.set(lang, canvasContext); } return canvasContext; } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } static #getAscent(fontFamily, lang) { const cachedAscent = this.#ascentCache.get(fontFamily); if (cachedAscent) { @@ -10542,39 +15707,9 @@ class TextLayer { return ratio; } } -function renderTextLayer() { - deprecated("`renderTextLayer`, please use `TextLayer` instead."); - const { - textContentSource, - container, - viewport, - ...rest - } = arguments[0]; - const restKeys = Object.keys(rest); - if (restKeys.length > 0) { - warn("Ignoring `renderTextLayer` parameters: " + restKeys.join(", ")); - } - const textLayer = new TextLayer({ - textContentSource, - container, - viewport - }); - const { - textDivs, - textContentItemsStr - } = textLayer; - const promise = textLayer.render(); - return { - promise, - textDivs, - textContentItemsStr - }; -} -function updateTextLayer() { - deprecated("`updateTextLayer`, please use `TextLayer` instead."); -} ;// CONCATENATED MODULE: ./src/display/xfa_text.js + class XfaText { static textContent(xfa) { const items = []; @@ -10633,6 +15768,26 @@ class XfaText { + + + + + + + + + + + + + + + + + + + + const DEFAULT_RANGE_CHUNK_SIZE = 65536; const RENDERING_CANCELLED_TIMEOUT = 100; @@ -10641,7 +15796,7 @@ const DefaultCanvasFactory = isNodeJS ? NodeCanvasFactory : DOMCanvasFactory; const DefaultCMapReaderFactory = isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory; const DefaultFilterFactory = isNodeJS ? NodeFilterFactory : DOMFilterFactory; const DefaultStandardFontDataFactory = isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory; -function getDocument(src) { +function getDocument(src = {}) { if (typeof src === "string" || src instanceof URL) { src = { url: src @@ -10651,12 +15806,6 @@ function getDocument(src) { data: src }; } - if (typeof src !== "object") { - throw new Error("Invalid parameter in getDocument, need parameter object."); - } - if (!src.url && !src.data && !src.range) { - throw new Error("Invalid parameter object: need either .data, .range or .url"); - } const task = new PDFDocumentLoadingTask(); const { docId @@ -10689,11 +15838,13 @@ function getDocument(src) { const disableStream = src.disableStream === true; const disableAutoFetch = src.disableAutoFetch === true; const pdfBug = src.pdfBug === true; + const enableHWA = src.enableHWA === true; const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI); const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({ - ownerDocument + ownerDocument, + enableHWA }); const filterFactory = src.filterFactory || new DefaultFilterFactory({ docId, @@ -10724,7 +15875,7 @@ function getDocument(src) { } const docParams = { docId, - apiVersion: "4.3.136", + apiVersion: "4.5.136", data, password, disableAutoFetch, @@ -10771,6 +15922,9 @@ function getDocument(src) { disableStream }); } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } const createPDFNetworkStream = params => { if (isNodeJS) { const isFetchSupported = function () { @@ -11114,10 +16268,11 @@ class PDFPageProxy { optionalContentConfigPromise = null, annotationCanvasMap = null, pageColors = null, - printAnnotationStorage = null + printAnnotationStorage = null, + isEditing = false }) { this._stats?.time("Overall"); - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); const { renderingIntent, cacheKey @@ -11210,7 +16365,8 @@ class PDFPageProxy { getOperatorList({ intent = "display", annotationMode = AnnotationMode.ENABLE, - printAnnotationStorage = null + printAnnotationStorage = null, + isEditing = false } = {}) { function operatorListChanged() { if (intentState.operatorList.lastChunk) { @@ -11218,7 +16374,7 @@ class PDFPageProxy { intentState.renderTasks.delete(opListTask); } } - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); let intentState = this._intentStates.get(intentArgs.cacheKey); if (!intentState) { intentState = Object.create(null); @@ -11376,7 +16532,8 @@ class PDFPageProxy { _pumpOperatorList({ renderingIntent, cacheKey, - annotationStorageSerializable + annotationStorageSerializable, + modifiedIds }) { const { map, @@ -11386,7 +16543,8 @@ class PDFPageProxy { pageIndex: this._pageIndex, intent: renderingIntent, cacheKey, - annotationStorage: map + annotationStorage: map, + modifiedIds }, transfer); const reader = readableStream.getReader(); const intentState = this._intentStates.get(cacheKey); @@ -11561,6 +16719,12 @@ class PDFWorker { } return this._readyCapability.promise; } + #resolve() { + this._readyCapability.resolve(); + this._messageHandler.send("configure", { + verbosity: this.verbosity + }); + } get port() { return this._port; } @@ -11571,81 +16735,73 @@ class PDFWorker { this._port = port; this._messageHandler = new MessageHandler("main", "worker", port); this._messageHandler.on("ready", function () {}); - this._readyCapability.resolve(); - this._messageHandler.send("configure", { - verbosity: this.verbosity - }); + this.#resolve(); } _initialize() { - if (!PDFWorkerUtil.isWorkerDisabled && !PDFWorker.#mainThreadWorkerMessageHandler) { - let { - workerSrc - } = PDFWorker; - try { - if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { - workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); - } - const worker = new Worker(workerSrc, { - type: "module" - }); - const messageHandler = new MessageHandler("main", "worker", worker); - const terminateEarly = () => { - worker.removeEventListener("error", onWorkerError); - messageHandler.destroy(); - worker.terminate(); - if (this.destroyed) { - this._readyCapability.reject(new Error("Worker was destroyed")); - } else { - this._setupFakeWorker(); - } - }; - const onWorkerError = () => { - if (!this._webWorker) { - terminateEarly(); - } - }; - worker.addEventListener("error", onWorkerError); - messageHandler.on("test", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - if (data) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }); - messageHandler.on("ready", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - try { - sendTest(); - } catch { - this._setupFakeWorker(); - } - }); - const sendTest = () => { - const testObj = new Uint8Array(); - messageHandler.send("test", testObj, [testObj.buffer]); - }; - sendTest(); - return; - } catch { - info("The worker has been disabled."); + if (PDFWorkerUtil.isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this._setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { + workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error("Worker was destroyed")); + } else { + this._setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this._webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this._setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); } this._setupFakeWorker(); } @@ -11664,12 +16820,8 @@ class PDFWorker { const id = `fake${PDFWorkerUtil.fakeWorkerId++}`; const workerHandler = new MessageHandler(id + "_worker", id, port); WorkerMessageHandler.setup(workerHandler, port); - const messageHandler = new MessageHandler(id, id + "_worker", port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); + this._messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); }).catch(reason => { this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); }); @@ -11764,7 +16916,7 @@ class WorkerTransport { get annotationStorage() { return shadow(this, "annotationStorage", new AnnotationStorage()); } - getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isOpList = false) { + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { let renderingIntent = RenderingIntentFlag.DISPLAY; let annotationStorageSerializable = SerializableEmpty; switch (intent) { @@ -11779,6 +16931,7 @@ class WorkerTransport { default: warn(`getRenderingIntent - invalid intent: ${intent}`); } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; switch (annotationMode) { case AnnotationMode.DISABLE: renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; @@ -11790,19 +16943,27 @@ class WorkerTransport { break; case AnnotationMode.ENABLE_STORAGE: renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; - const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; annotationStorageSerializable = annotationStorage.serializable; break; default: warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } if (isOpList) { renderingIntent += RenderingIntentFlag.OPLIST; } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; return { renderingIntent, - cacheKey: `${renderingIntent}_${annotationStorageSerializable.hash}`, - annotationStorageSerializable + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds }; } destroy() { @@ -12358,6 +17519,7 @@ class RenderTask { } } class InternalRenderTask { + #rAF = null; static #canvasInUse = new WeakSet(); constructor({ callback, @@ -12442,6 +17604,10 @@ class InternalRenderTask { this.running = false; this.cancelled = true; this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } InternalRenderTask.#canvasInUse.delete(this._canvas); this.callback(error || new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay)); } @@ -12469,7 +17635,8 @@ class InternalRenderTask { } _scheduleNext() { if (this._useRequestAnimationFrame) { - window.requestAnimationFrame(() => { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; this._nextBound().catch(this._cancelBound); }); } else { @@ -12491,10 +17658,13 @@ class InternalRenderTask { } } } -const version = "4.3.136"; -const build = "0cec64437"; +const version = "4.5.136"; +const build = "3a21f03b0"; +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.flat-map.js +var esnext_iterator_flat_map = __webpack_require__(670); ;// CONCATENATED MODULE: ./src/shared/scripting_utils.js + function makeColorComp(n) { return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); } @@ -12555,6 +17725,7 @@ class ColorConverters { ;// CONCATENATED MODULE: ./src/display/xfa_layer.js + class XfaLayer { static setupStorage(html, id, element, storage, intent) { const storedData = storage.getValue(id, { @@ -12770,6 +17941,17 @@ class XfaLayer { + + + + + + + + + + + const DEFAULT_TAB_INDEX = 1000; const annotation_layer_DEFAULT_FONT_SIZE = 9; const GetElementsByNameSet = new WeakSet(); @@ -12876,6 +18058,9 @@ class AnnotationElement { }) { return !!(titleObj?.str || contentsObj?.str || richText?.str); } + get _isEditable() { + return this.data.isEditable; + } get hasPopupData() { return AnnotationElement._hasPopupData(this.data); } @@ -13175,15 +18360,9 @@ class AnnotationElement { if (!quadPoints) { return; } - const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect; - if (quadPoints.length === 1) { - const [, { - x: trX, - y: trY - }, { - x: blX, - y: blY - }] = quadPoints[0]; + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { return; } @@ -13217,13 +18396,11 @@ class AnnotationElement { clipPath.setAttribute("id", id); clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); defs.append(clipPath); - for (const [, { - x: trX, - y: trY - }, { - x: blX, - y: blY - }] of quadPoints) { + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; const rect = svgFactory.createElement("rect"); const x = (blX - rectBlX) / width; const y = (rectTrY - trY) / height; @@ -13344,9 +18521,6 @@ class AnnotationElement { triggers.classList.add("highlightArea"); } } - get _isEditable() { - return false; - } _editOnDoubleClick() { if (!this._isEditable) { return; @@ -14804,9 +19978,6 @@ class FreeTextAnnotationElement extends AnnotationElement { this._editOnDoubleClick(); return this.container; } - get _isEditable() { - return this.data.hasOwnCanvas; - } } class LineAnnotationElement extends AnnotationElement { #line = null; @@ -14936,27 +20107,37 @@ class PolylineAnnotationElement extends AnnotationElement { } render() { this.container.classList.add(this.containerClassName); - const data = this.data; + const { + data: { + rect, + vertices, + borderStyle, + popupRef + } + } = this; + if (!vertices) { + return this.container; + } const { width, height - } = getRectDims(data.rect); + } = getRectDims(rect); const svg = this.svgFactory.create(width, height, true); let points = []; - for (const coordinate of data.vertices) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; - points.push(x + "," + y); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); } points = points.join(" "); const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); + polyline.setAttribute("stroke-width", borderStyle.width || 1); polyline.setAttribute("stroke", "transparent"); polyline.setAttribute("fill", "transparent"); svg.append(polyline); this.container.append(svg); - if (!data.popupRef && this.hasPopupData) { + if (!popupRef && this.hasPopupData) { this._createPopup(); } return this.container; @@ -15003,27 +20184,34 @@ class InkAnnotationElement extends AnnotationElement { } render() { this.container.classList.add(this.containerClassName); - const data = this.data; + const { + data: { + rect, + inkLists, + borderStyle, + popupRef + } + } = this; const { width, height - } = getRectDims(data.rect); + } = getRectDims(rect); const svg = this.svgFactory.create(width, height, true); - for (const inkList of data.inkLists) { + for (const inkList of inkLists) { let points = []; - for (const coordinate of inkList) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + const x = inkList[i] - rect[0]; + const y = rect[3] - inkList[i + 1]; points.push(`${x},${y}`); } points = points.join(" "); const polyline = this.svgFactory.createElement(this.svgElementName); this.#polylines.push(polyline); polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); + polyline.setAttribute("stroke-width", borderStyle.width || 1); polyline.setAttribute("stroke", "transparent"); polyline.setAttribute("fill", "transparent"); - if (!data.popupRef && this.hasPopupData) { + if (!popupRef && this.hasPopupData) { this._createPopup(); } svg.append(polyline); @@ -15197,6 +20385,9 @@ class AnnotationLayer { this.zIndex = 0; this._annotationEditorUIManager = annotationEditorUIManager; } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } #appendElement(element, id) { const contentElement = element.firstChild || element; contentElement.id = `${AnnotationPrefix}${id}`; @@ -15263,7 +20454,7 @@ class AnnotationLayer { rendered.style.visibility = "hidden"; } this.#appendElement(rendered, data.id); - if (element.annotationEditorType > 0) { + if (element._isEditable) { this.#editableAnnotations.set(element.data.id, element); this._annotationEditorUIManager?.renderAnnotationElement(element); } @@ -15320,6 +20511,9 @@ class AnnotationLayer { + + + const EOL_PATTERN = /\r\n?|\n/g; class FreeTextEditor extends AnnotationEditor { #boundEditorDivBlur = this.editorDivBlur.bind(this); @@ -15475,11 +20669,22 @@ class FreeTextEditor extends AnnotationEditor { this.editorDiv.contentEditable = true; this._isDraggable = false; this.div.removeAttribute("aria-activedescendant"); - this.editorDiv.addEventListener("keydown", this.#boundEditorDivKeydown); - this.editorDiv.addEventListener("focus", this.#boundEditorDivFocus); - this.editorDiv.addEventListener("blur", this.#boundEditorDivBlur); - this.editorDiv.addEventListener("input", this.#boundEditorDivInput); - this.editorDiv.addEventListener("paste", this.#boundEditorDivPaste); + const signal = this._uiManager._signal; + this.editorDiv.addEventListener("keydown", this.#boundEditorDivKeydown, { + signal + }); + this.editorDiv.addEventListener("focus", this.#boundEditorDivFocus, { + signal + }); + this.editorDiv.addEventListener("blur", this.#boundEditorDivBlur, { + signal + }); + this.editorDiv.addEventListener("input", this.#boundEditorDivInput, { + signal + }); + this.editorDiv.addEventListener("paste", this.#boundEditorDivPaste, { + signal + }); } disableEditMode() { if (!this.isInEditMode()) { @@ -15927,6 +21132,20 @@ class FreeTextEditor extends AnnotationEditor { ;// CONCATENATED MODULE: ./src/display/editor/outliner.js + + + + + + + + + + + + + + class Outliner { #box; #verticalEdges = []; @@ -16567,8 +21786,13 @@ class ColorPicker { button.tabIndex = "0"; button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); button.setAttribute("aria-haspopup", true); - button.addEventListener("click", this.#openDropdown.bind(this)); - button.addEventListener("keydown", this.#boundKeyDown); + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#boundKeyDown, { + signal + }); const swatch = this.#buttonSwatch = document.createElement("span"); swatch.className = "swatch"; swatch.setAttribute("aria-hidden", true); @@ -16584,7 +21808,10 @@ class ColorPicker { } #getDropdownRoot() { const div = document.createElement("div"); - div.addEventListener("contextmenu", noContextMenu); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); div.className = "dropdown"; div.role = "listbox"; div.setAttribute("aria-multiselectable", false); @@ -16602,10 +21829,14 @@ class ColorPicker { swatch.className = "swatch"; swatch.style.backgroundColor = color; button.setAttribute("aria-selected", color === this.#defaultColor); - button.addEventListener("click", this.#colorSelect.bind(this, color)); + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); div.append(button); } - div.addEventListener("keydown", this.#boundKeyDown); + div.addEventListener("keydown", this.#boundKeyDown, { + signal + }); return div; } #colorSelect(color, event) { @@ -16673,7 +21904,9 @@ class ColorPicker { return; } this.#dropdownWasFromKeyboard = event.detail === 0; - window.addEventListener("pointerdown", this.#boundPointerDown); + window.addEventListener("pointerdown", this.#boundPointerDown, { + signal: this.#uiManager._signal + }); if (this.#dropdown) { this.#dropdown.classList.remove("hidden"); return; @@ -16736,6 +21969,13 @@ class ColorPicker { + + + + + + + class HighlightEditor extends AnnotationEditor { #anchorNode = null; #anchorOffset = 0; @@ -17142,7 +22382,9 @@ class HighlightEditor extends AnnotationEditor { if (this.#isFreeHighlight) { div.classList.add("free"); } else { - this.div.addEventListener("keydown", this.#boundKeydown); + this.div.addEventListener("keydown", this.#boundKeydown, { + signal: this._uiManager._signal + }); } const highlightDiv = this.#highlightDiv = document.createElement("div"); div.append(highlightDiv); @@ -17224,8 +22466,9 @@ class HighlightEditor extends AnnotationEditor { return null; } const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; const boxes = this.#boxes; - const quadPoints = new Array(boxes.length * 8); + const quadPoints = new Float32Array(boxes.length * 8); let i = 0; for (const { x, @@ -17233,8 +22476,8 @@ class HighlightEditor extends AnnotationEditor { width, height } of boxes) { - const sx = x * pageWidth; - const sy = (1 - y - height) * pageHeight; + const sx = x * pageWidth + pageX; + const sy = (1 - y - height) * pageHeight + pageY; quadPoints[i] = quadPoints[i + 4] = sx; quadPoints[i + 1] = quadPoints[i + 3] = sy; quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; @@ -17260,9 +22503,11 @@ class HighlightEditor extends AnnotationEditor { const pointerMove = e => { this.#highlightMove(parent, e); }; + const signal = parent._signal; const pointerDownOptions = { capture: true, - passive: false + passive: false, + signal }; const pointerDown = e => { e.preventDefault(); @@ -17276,11 +22521,19 @@ class HighlightEditor extends AnnotationEditor { window.removeEventListener("contextmenu", noContextMenu); this.#endHighlight(parent, e); }; - window.addEventListener("blur", pointerUpCallback); - window.addEventListener("pointerup", pointerUpCallback); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); window.addEventListener("pointerdown", pointerDown, pointerDownOptions); - window.addEventListener("contextmenu", noContextMenu); - textLayer.addEventListener("pointermove", pointerMove); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", pointerMove, { + signal + }); this._freeHighlight = new FreeOutliner({ x, y @@ -17364,6 +22617,8 @@ class HighlightEditor extends AnnotationEditor { + + class InkEditor extends AnnotationEditor { #baseHeight = 0; #baseWidth = 0; @@ -17519,7 +22774,7 @@ class InkEditor extends AnnotationEditor { clearTimeout(this.#canvasContextMenuTimeoutId); this.#canvasContextMenuTimeoutId = null; } - this.#observer.disconnect(); + this.#observer?.disconnect(); this.#observer = null; super.remove(); } @@ -17543,7 +22798,9 @@ class InkEditor extends AnnotationEditor { } super.enableEditMode(); this._isDraggable = false; - this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown); + this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown, { + signal: this._uiManager._signal + }); } disableEditMode() { if (!this.isInEditMode() || this.canvas === null) { @@ -17592,10 +22849,19 @@ class InkEditor extends AnnotationEditor { ctx.strokeStyle = `${color}${opacityToHex(opacity)}`; } #startDrawing(x, y) { - this.canvas.addEventListener("contextmenu", noContextMenu); - this.canvas.addEventListener("pointerleave", this.#boundCanvasPointerleave); - this.canvas.addEventListener("pointermove", this.#boundCanvasPointermove); - this.canvas.addEventListener("pointerup", this.#boundCanvasPointerup); + const signal = this._uiManager._signal; + this.canvas.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.canvas.addEventListener("pointerleave", this.#boundCanvasPointerleave, { + signal + }); + this.canvas.addEventListener("pointermove", this.#boundCanvasPointermove, { + signal + }); + this.canvas.addEventListener("pointerup", this.#boundCanvasPointerup, { + signal + }); this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); this.isEditing = true; if (!this.#isCanvasInitialized) { @@ -17812,7 +23078,9 @@ class InkEditor extends AnnotationEditor { this.canvas.removeEventListener("pointerleave", this.#boundCanvasPointerleave); this.canvas.removeEventListener("pointermove", this.#boundCanvasPointermove); this.canvas.removeEventListener("pointerup", this.#boundCanvasPointerup); - this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown); + this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown, { + signal: this._uiManager._signal + }); if (this.#canvasContextMenuTimeoutId) { clearTimeout(this.#canvasContextMenuTimeoutId); } @@ -17840,6 +23108,12 @@ class InkEditor extends AnnotationEditor { } }); this.#observer.observe(this.div); + this._uiManager._signal.addEventListener("abort", () => { + this.#observer?.disconnect(); + this.#observer = null; + }, { + once: true + }); } get isResizable() { return !this.isEmpty() && this.#disableEditing; @@ -18159,6 +23433,9 @@ class InkEditor extends AnnotationEditor { + + + class StampEditor extends AnnotationEditor { #bitmap = null; #bitmapId = null; @@ -18167,6 +23444,7 @@ class StampEditor extends AnnotationEditor { #bitmapFile = null; #bitmapFileName = ""; #canvas = null; + #hasMLBeenQueried = false; #observer = null; #resizeTimeoutId = null; #isSvg = false; @@ -18244,6 +23522,7 @@ class StampEditor extends AnnotationEditor { const input = document.createElement("input"); input.type = "file"; input.accept = StampEditor.supportedTypesStr; + const signal = this._uiManager._signal; this.#bitmapPromise = new Promise(resolve => { input.addEventListener("change", async () => { if (!input.files || input.files.length === 0) { @@ -18254,10 +23533,14 @@ class StampEditor extends AnnotationEditor { this.#getBitmapFetched(data); } resolve(); + }, { + signal }); input.addEventListener("cancel", () => { this.remove(); resolve(); + }, { + signal }); }).finally(() => this.#getBitmapDone()); input.click(); @@ -18409,6 +23692,37 @@ class StampEditor extends AnnotationEditor { } return bitmap; } + async #mlGuessAltText(bitmap, width, height) { + if (this.#hasMLBeenQueried) { + return; + } + this.#hasMLBeenQueried = true; + const isMLEnabled = await this._uiManager.isMLEnabledFor("altText"); + if (!isMLEnabled || this.hasAltText()) { + return; + } + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d", { + willReadFrequently: true + }); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); + const response = await this._uiManager.mlGuess({ + service: "moz-image-to-text", + request: { + data: ctx.getImageData(0, 0, width, height).data, + width, + height, + channels: 4 + } + }); + const altText = response?.output || ""; + if (this.parent && altText && !this.hasAltText()) { + this.altTextData = { + altText, + decorative: false + }; + } + } #drawBitmap(width, height) { width = Math.ceil(width); height = Math.ceil(height); @@ -18419,28 +23733,7 @@ class StampEditor extends AnnotationEditor { canvas.width = width; canvas.height = height; const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(width, height); - if (this._uiManager.hasMLManager && !this.hasAltText()) { - const offscreen = new OffscreenCanvas(width, height); - const ctx = offscreen.getContext("2d"); - ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); - this._uiManager.mlGuess({ - service: "image-to-text", - request: { - data: ctx.getImageData(0, 0, width, height).data, - width, - height, - channels: 4 - } - }).then(response => { - const altText = response?.output || ""; - if (this.parent && altText && !this.hasAltText()) { - this.altTextData = { - altText, - decorative: false - }; - } - }); - } + this.#mlGuessAltText(bitmap, width, height); const ctx = canvas.getContext("2d"); ctx.filter = this._uiManager.hcmFilter; ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); @@ -18477,6 +23770,9 @@ class StampEditor extends AnnotationEditor { return structuredClone(this.#bitmap); } #createObserver() { + if (!this._uiManager._signal) { + return; + } this.#observer = new ResizeObserver(entries => { const rect = entries[0].contentRect; if (rect.width && rect.height) { @@ -18484,6 +23780,12 @@ class StampEditor extends AnnotationEditor { } }); this.#observer.observe(this.div); + this._uiManager._signal.addEventListener("abort", () => { + this.#observer?.disconnect(); + this.#observer = null; + }, { + once: true + }); } static deserialize(data, parent, uiManager) { if (data instanceof StampAnnotationElement) { @@ -18570,6 +23872,14 @@ class StampEditor extends AnnotationEditor { + + + + + + + + class AnnotationEditorLayer { #accessibilityManager; #allowClick = false; @@ -18685,6 +23995,9 @@ class AnnotationEditorLayer { addCommands(params) { this.#uiManager.addCommands(params); } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } togglePointerEvents(enabled = false) { this.div.classList.toggle("disabled", !enabled); } @@ -18796,7 +24109,9 @@ class AnnotationEditorLayer { this.div.tabIndex = -1; if (this.#textLayer?.div && !this.#boundTextLayerPointerDown) { this.#boundTextLayerPointerDown = this.#textLayerPointerDown.bind(this); - this.#textLayer.div.addEventListener("pointerdown", this.#boundTextLayerPointerDown); + this.#textLayer.div.addEventListener("pointerdown", this.#boundTextLayerPointerDown, { + signal: this.#uiManager._signal + }); this.#textLayer.div.classList.add("highlighting"); } } @@ -18810,7 +24125,10 @@ class AnnotationEditorLayer { } #textLayerPointerDown(event) { this.#uiManager.unselectAll(); - if (event.target === this.#textLayer.div) { + const { + target + } = event; + if (target === this.#textLayer.div || target.classList.contains("endOfContent") && this.#textLayer.div.contains(target)) { const { isMac } = util_FeatureTest.platform; @@ -18819,11 +24137,14 @@ class AnnotationEditorLayer { } this.#uiManager.showAllEditors("highlight", true, true); this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", event); this.#textLayer.div.addEventListener("pointerup", () => { this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); }, { - once: true + once: true, + signal: this.#uiManager._signal }); event.preventDefault(); } @@ -18832,10 +24153,15 @@ class AnnotationEditorLayer { if (this.#boundPointerdown) { return; } + const signal = this.#uiManager._signal; this.#boundPointerdown = this.pointerdown.bind(this); this.#boundPointerup = this.pointerup.bind(this); - this.div.addEventListener("pointerdown", this.#boundPointerdown); - this.div.addEventListener("pointerup", this.#boundPointerup); + this.div.addEventListener("pointerdown", this.#boundPointerdown, { + signal + }); + this.div.addEventListener("pointerup", this.#boundPointerup, { + signal + }); } disableClick() { if (!this.#boundPointerdown) { @@ -18920,7 +24246,8 @@ class AnnotationEditorLayer { editor.div.addEventListener("focusin", () => { editor._focusEventsAllowed = true; }, { - once: true + once: true, + signal: this.#uiManager._signal }); activeElement.focus(); } else { @@ -18956,6 +24283,9 @@ class AnnotationEditorLayer { get #currentEditorType() { return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); } + get _signal() { + return this.#uiManager._signal; + } #createNewEditor(params) { const editorType = this.#currentEditorType; return editorType ? new editorType.prototype.constructor(params) : null; @@ -19367,8 +24697,8 @@ class DrawLayer { -const pdfjsVersion = "4.3.136"; -const pdfjsBuild = "0cec64437"; +const pdfjsVersion = "4.5.136"; +const pdfjsBuild = "3a21f03b0"; var __webpack_exports__AbortException = __webpack_exports__.AbortException; var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer; @@ -19387,7 +24717,6 @@ var __webpack_exports__ImageKind = __webpack_exports__.ImageKind; var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException; var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException; var __webpack_exports__OPS = __webpack_exports__.OPS; -var __webpack_exports__Outliner = __webpack_exports__.Outliner; var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport; var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString; var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker; @@ -19411,11 +24740,9 @@ var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme; var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile; var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu; var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode; -var __webpack_exports__renderTextLayer = __webpack_exports__.renderTextLayer; var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions; var __webpack_exports__shadow = __webpack_exports__.shadow; -var __webpack_exports__updateTextLayer = __webpack_exports__.updateTextLayer; var __webpack_exports__version = __webpack_exports__.version; -export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__CMapCompressionType as CMapCompressionType, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__Outliner as Outliner, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__TextLayer as TextLayer, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__renderTextLayer as renderTextLayer, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__updateTextLayer as updateTextLayer, __webpack_exports__version as version }; +export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__CMapCompressionType as CMapCompressionType, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__TextLayer as TextLayer, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__version as version }; //# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/cps/static/js/libs/pdf.worker.mjs b/cps/static/js/libs/pdf.worker.mjs index 96e23935..7bac155f 100644 --- a/cps/static/js/libs/pdf.worker.mjs +++ b/cps/static/js/libs/pdf.worker.mjs @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,4499 @@ * JavaScript code in this page */ -/******/ // The require scope -/******/ var __webpack_require__ = {}; +/******/ var __webpack_modules__ = ({ + +/***/ 9306: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var tryToString = __webpack_require__(6823); + +var $TypeError = TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw new $TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }), + +/***/ 3506: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isPossiblePrototype = __webpack_require__(3925); + +var $String = String; +var $TypeError = TypeError; + +module.exports = function (argument) { + if (isPossiblePrototype(argument)) return argument; + throw new $TypeError("Can't set " + $String(argument) + ' as a prototype'); +}; + + +/***/ }), + +/***/ 7080: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var has = (__webpack_require__(4402).has); + +// Perform ? RequireInternalSlot(M, [[SetData]]) +module.exports = function (it) { + has(it); + return it; +}; + + +/***/ }), + +/***/ 679: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isPrototypeOf = __webpack_require__(1625); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + + +/***/ }), + +/***/ 8551: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isObject = __webpack_require__(34); + +var $String = String; +var $TypeError = TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw new $TypeError($String(argument) + ' is not an object'); +}; + + +/***/ }), + +/***/ 7811: +/***/ ((module) => { + + +// eslint-disable-next-line es/no-typed-arrays -- safe +module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined'; + + +/***/ }), + +/***/ 7394: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThisAccessor = __webpack_require__(6706); +var classof = __webpack_require__(4576); + +var $TypeError = TypeError; + +// Includes +// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). +// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception. +module.exports = uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) { + if (classof(O) !== 'ArrayBuffer') throw new $TypeError('ArrayBuffer expected'); + return O.byteLength; +}; + + +/***/ }), + +/***/ 3238: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var arrayBufferByteLength = __webpack_require__(7394); + +var slice = uncurryThis(ArrayBuffer.prototype.slice); + +module.exports = function (O) { + if (arrayBufferByteLength(O) !== 0) return false; + try { + slice(O, 0, 0); + return false; + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ 5636: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var uncurryThis = __webpack_require__(9504); +var uncurryThisAccessor = __webpack_require__(6706); +var toIndex = __webpack_require__(7696); +var isDetached = __webpack_require__(3238); +var arrayBufferByteLength = __webpack_require__(7394); +var detachTransferable = __webpack_require__(4483); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); + +var structuredClone = global.structuredClone; +var ArrayBuffer = global.ArrayBuffer; +var DataView = global.DataView; +var TypeError = global.TypeError; +var min = Math.min; +var ArrayBufferPrototype = ArrayBuffer.prototype; +var DataViewPrototype = DataView.prototype; +var slice = uncurryThis(ArrayBufferPrototype.slice); +var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get'); +var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get'); +var getInt8 = uncurryThis(DataViewPrototype.getInt8); +var setInt8 = uncurryThis(DataViewPrototype.setInt8); + +module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) { + var byteLength = arrayBufferByteLength(arrayBuffer); + var newByteLength = newLength === undefined ? byteLength : toIndex(newLength); + var fixedLength = !isResizable || !isResizable(arrayBuffer); + var newBuffer; + if (isDetached(arrayBuffer)) throw new TypeError('ArrayBuffer is detached'); + if (PROPER_STRUCTURED_CLONE_TRANSFER) { + arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] }); + if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer; + } + if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) { + newBuffer = slice(arrayBuffer, 0, newByteLength); + } else { + var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : undefined; + newBuffer = new ArrayBuffer(newByteLength, options); + var a = new DataView(arrayBuffer); + var b = new DataView(newBuffer); + var copyLength = min(newByteLength, byteLength); + for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i)); + } + if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer); + return newBuffer; +}; + + +/***/ }), + +/***/ 4644: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_ARRAY_BUFFER = __webpack_require__(7811); +var DESCRIPTORS = __webpack_require__(3724); +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var hasOwn = __webpack_require__(9297); +var classof = __webpack_require__(6955); +var tryToString = __webpack_require__(6823); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIn = __webpack_require__(6840); +var defineBuiltInAccessor = __webpack_require__(2106); +var isPrototypeOf = __webpack_require__(1625); +var getPrototypeOf = __webpack_require__(2787); +var setPrototypeOf = __webpack_require__(2967); +var wellKnownSymbol = __webpack_require__(8227); +var uid = __webpack_require__(3392); +var InternalStateModule = __webpack_require__(1181); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var Int8Array = global.Int8Array; +var Int8ArrayPrototype = Int8Array && Int8Array.prototype; +var Uint8ClampedArray = global.Uint8ClampedArray; +var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype; +var TypedArray = Int8Array && getPrototypeOf(Int8Array); +var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype); +var ObjectPrototype = Object.prototype; +var TypeError = global.TypeError; + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG'); +var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor'; +// Fixing native typed arrays in Opera Presto crashes the browser, see #595 +var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera'; +var TYPED_ARRAY_TAG_REQUIRED = false; +var NAME, Constructor, Prototype; + +var TypedArrayConstructorsList = { + Int8Array: 1, + Uint8Array: 1, + Uint8ClampedArray: 1, + Int16Array: 2, + Uint16Array: 2, + Int32Array: 4, + Uint32Array: 4, + Float32Array: 4, + Float64Array: 8 +}; + +var BigIntArrayConstructorsList = { + BigInt64Array: 8, + BigUint64Array: 8 +}; + +var isView = function isView(it) { + if (!isObject(it)) return false; + var klass = classof(it); + return klass === 'DataView' + || hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var getTypedArrayConstructor = function (it) { + var proto = getPrototypeOf(it); + if (!isObject(proto)) return; + var state = getInternalState(proto); + return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto); +}; + +var isTypedArray = function (it) { + if (!isObject(it)) return false; + var klass = classof(it); + return hasOwn(TypedArrayConstructorsList, klass) + || hasOwn(BigIntArrayConstructorsList, klass); +}; + +var aTypedArray = function (it) { + if (isTypedArray(it)) return it; + throw new TypeError('Target is not a typed array'); +}; + +var aTypedArrayConstructor = function (C) { + if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C; + throw new TypeError(tryToString(C) + ' is not a typed array constructor'); +}; + +var exportTypedArrayMethod = function (KEY, property, forced, options) { + if (!DESCRIPTORS) return; + if (forced) for (var ARRAY in TypedArrayConstructorsList) { + var TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try { + delete TypedArrayConstructor.prototype[KEY]; + } catch (error) { + // old WebKit bug - some methods are non-configurable + try { + TypedArrayConstructor.prototype[KEY] = property; + } catch (error2) { /* empty */ } + } + } + if (!TypedArrayPrototype[KEY] || forced) { + defineBuiltIn(TypedArrayPrototype, KEY, forced ? property + : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options); + } +}; + +var exportTypedArrayStaticMethod = function (KEY, property, forced) { + var ARRAY, TypedArrayConstructor; + if (!DESCRIPTORS) return; + if (setPrototypeOf) { + if (forced) for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try { + delete TypedArrayConstructor[KEY]; + } catch (error) { /* empty */ } + } + if (!TypedArray[KEY] || forced) { + // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable + try { + return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property); + } catch (error) { /* empty */ } + } else return; + } + for (ARRAY in TypedArrayConstructorsList) { + TypedArrayConstructor = global[ARRAY]; + if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) { + defineBuiltIn(TypedArrayConstructor, KEY, property); + } + } +}; + +for (NAME in TypedArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; + else NATIVE_ARRAY_BUFFER_VIEWS = false; +} + +for (NAME in BigIntArrayConstructorsList) { + Constructor = global[NAME]; + Prototype = Constructor && Constructor.prototype; + if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor; +} + +// WebKit bug - typed arrays constructors prototype is Object.prototype +if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) { + // eslint-disable-next-line no-shadow -- safe + TypedArray = function TypedArray() { + throw new TypeError('Incorrect invocation'); + }; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) setPrototypeOf(global[NAME], TypedArray); + } +} + +if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) { + TypedArrayPrototype = TypedArray.prototype; + if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) { + if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype); + } +} + +// WebKit bug - one more object in Uint8ClampedArray prototype chain +if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) { + setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype); +} + +if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) { + TYPED_ARRAY_TAG_REQUIRED = true; + defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, { + configurable: true, + get: function () { + return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined; + } + }); + for (NAME in TypedArrayConstructorsList) if (global[NAME]) { + createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME); + } +} + +module.exports = { + NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS, + TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG, + aTypedArray: aTypedArray, + aTypedArrayConstructor: aTypedArrayConstructor, + exportTypedArrayMethod: exportTypedArrayMethod, + exportTypedArrayStaticMethod: exportTypedArrayStaticMethod, + getTypedArrayConstructor: getTypedArrayConstructor, + isView: isView, + isTypedArray: isTypedArray, + TypedArray: TypedArray, + TypedArrayPrototype: TypedArrayPrototype +}; + + +/***/ }), + +/***/ 5370: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); + +module.exports = function (Constructor, list, $length) { + var index = 0; + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; +}; + + +/***/ }), + +/***/ 9617: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIndexedObject = __webpack_require__(5397); +var toAbsoluteIndex = __webpack_require__(5610); +var lengthOfArrayLike = __webpack_require__(6198); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + if (length === 0) return !IS_INCLUDES && -1; + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el !== el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value !== value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ 4527: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var isArray = __webpack_require__(4376); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Safari < 13 does not throw an error in this case +var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () { + // makes no sense without proper strict mode support + if (this !== undefined) return true; + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).length = 1; + } catch (error) { + return error instanceof TypeError; + } +}(); + +module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) { + if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) { + throw new $TypeError('Cannot set read only .length'); + } return O.length = length; +} : function (O, length) { + return O.length = length; +}; + + +/***/ }), + +/***/ 7628: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); + +// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toReversed +// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toReversed +module.exports = function (O, C) { + var len = lengthOfArrayLike(O); + var A = new C(len); + var k = 0; + for (; k < len; k++) A[k] = O[len - k - 1]; + return A; +}; + + +/***/ }), + +/***/ 9928: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var lengthOfArrayLike = __webpack_require__(6198); +var toIntegerOrInfinity = __webpack_require__(1291); + +var $RangeError = RangeError; + +// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.with +// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with +module.exports = function (O, C, index, value) { + var len = lengthOfArrayLike(O); + var relativeIndex = toIntegerOrInfinity(index); + var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex; + if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index'); + var A = new C(len); + var k = 0; + for (; k < len; k++) A[k] = k === actualIndex ? value : O[k]; + return A; +}; + + +/***/ }), + +/***/ 6319: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var anObject = __webpack_require__(8551); +var iteratorClose = __webpack_require__(9539); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + + +/***/ }), + +/***/ 4576: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ 6955: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var TO_STRING_TAG_SUPPORT = __webpack_require__(2140); +var isCallable = __webpack_require__(4901); +var classofRaw = __webpack_require__(4576); +var wellKnownSymbol = __webpack_require__(8227); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var $Object = Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ 7740: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var hasOwn = __webpack_require__(9297); +var ownKeys = __webpack_require__(5031); +var getOwnPropertyDescriptorModule = __webpack_require__(7347); +var definePropertyModule = __webpack_require__(4913); + +module.exports = function (target, source, exceptions) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { + defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } + } +}; + + +/***/ }), + +/***/ 2211: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ 2529: +/***/ ((module) => { + + +// `CreateIterResultObject` abstract operation +// https://tc39.es/ecma262/#sec-createiterresultobject +module.exports = function (value, done) { + return { value: value, done: done }; +}; + + +/***/ }), + +/***/ 6699: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var definePropertyModule = __webpack_require__(4913); +var createPropertyDescriptor = __webpack_require__(6980); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ 6980: +/***/ ((module) => { + + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ 4659: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var definePropertyModule = __webpack_require__(4913); +var createPropertyDescriptor = __webpack_require__(6980); + +module.exports = function (object, key, value) { + if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value)); + else object[key] = value; +}; + + +/***/ }), + +/***/ 2106: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var makeBuiltIn = __webpack_require__(283); +var defineProperty = __webpack_require__(4913); + +module.exports = function (target, name, descriptor) { + if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true }); + if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true }); + return defineProperty.f(target, name, descriptor); +}; + + +/***/ }), + +/***/ 6840: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var definePropertyModule = __webpack_require__(4913); +var makeBuiltIn = __webpack_require__(283); +var defineGlobalProperty = __webpack_require__(9433); + +module.exports = function (O, key, value, options) { + if (!options) options = {}; + var simple = options.enumerable; + var name = options.name !== undefined ? options.name : key; + if (isCallable(value)) makeBuiltIn(value, name, options); + if (options.global) { + if (simple) O[key] = value; + else defineGlobalProperty(key, value); + } else { + try { + if (!options.unsafe) delete O[key]; + else if (O[key]) simple = true; + } catch (error) { /* empty */ } + if (simple) O[key] = value; + else definePropertyModule.f(O, key, { + value: value, + enumerable: false, + configurable: !options.nonConfigurable, + writable: !options.nonWritable + }); + } return O; +}; + + +/***/ }), + +/***/ 6279: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); + +module.exports = function (target, src, options) { + for (var key in src) defineBuiltIn(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ 9433: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ 3724: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7; +}); + + +/***/ }), + +/***/ 4483: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var tryNodeRequire = __webpack_require__(9714); +var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548); + +var structuredClone = global.structuredClone; +var $ArrayBuffer = global.ArrayBuffer; +var $MessageChannel = global.MessageChannel; +var detach = false; +var WorkerThreads, channel, buffer, $detach; + +if (PROPER_STRUCTURED_CLONE_TRANSFER) { + detach = function (transferable) { + structuredClone(transferable, { transfer: [transferable] }); + }; +} else if ($ArrayBuffer) try { + if (!$MessageChannel) { + WorkerThreads = tryNodeRequire('worker_threads'); + if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel; + } + + if ($MessageChannel) { + channel = new $MessageChannel(); + buffer = new $ArrayBuffer(2); + + $detach = function (transferable) { + channel.port1.postMessage(null, [transferable]); + }; + + if (buffer.byteLength === 2) { + $detach(buffer); + if (buffer.byteLength === 0) detach = $detach; + } + } +} catch (error) { /* empty */ } + +module.exports = detach; + + +/***/ }), + +/***/ 4055: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isObject = __webpack_require__(34); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ 6837: +/***/ ((module) => { + + +var $TypeError = TypeError; +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991 + +module.exports = function (it) { + if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded'); + return it; +}; + + +/***/ }), + +/***/ 5002: +/***/ ((module) => { + + +module.exports = { + IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 }, + DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 }, + HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 }, + WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 }, + InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 }, + NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 }, + NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 }, + NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 }, + NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 }, + InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 }, + InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 }, + SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 }, + InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 }, + NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 }, + InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 }, + ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 }, + TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 }, + SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 }, + NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 }, + AbortError: { s: 'ABORT_ERR', c: 20, m: 1 }, + URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 }, + QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 }, + TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 }, + InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 }, + DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 } +}; + + +/***/ }), + +/***/ 7290: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_DENO = __webpack_require__(516); +var IS_NODE = __webpack_require__(9088); + +module.exports = !IS_DENO && !IS_NODE + && typeof window == 'object' + && typeof document == 'object'; + + +/***/ }), + +/***/ 516: +/***/ ((module) => { + + +/* global Deno -- Deno case */ +module.exports = typeof Deno == 'object' && Deno && typeof Deno.version == 'object'; + + +/***/ }), + +/***/ 9088: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var classof = __webpack_require__(4576); + +module.exports = classof(global.process) === 'process'; + + +/***/ }), + +/***/ 9392: +/***/ ((module) => { + + +module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || ''; + + +/***/ }), + +/***/ 7388: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var userAgent = __webpack_require__(9392); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ 8727: +/***/ ((module) => { + + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ 6193: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var $Error = Error; +var replace = uncurryThis(''.replace); + +var TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd'); +// eslint-disable-next-line redos/no-vulnerable -- safe +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); + +module.exports = function (stack, dropEntries) { + if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } return stack; +}; + + +/***/ }), + +/***/ 6518: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var getOwnPropertyDescriptor = (__webpack_require__(7347).f); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIn = __webpack_require__(6840); +var defineGlobalProperty = __webpack_require__(9433); +var copyConstructorProperties = __webpack_require__(7740); +var isForced = __webpack_require__(2796); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.dontCallGetSet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || defineGlobalProperty(TARGET, {}); + } else { + target = global[TARGET] && global[TARGET].prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.dontCallGetSet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + defineBuiltIn(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ 9039: +/***/ ((module) => { + + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ 6080: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(7476); +var aCallable = __webpack_require__(9306); +var NATIVE_BIND = __webpack_require__(616); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ 616: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-function-prototype-bind -- safe + var test = (function () { /* empty */ }).bind(); + // eslint-disable-next-line no-prototype-builtins -- safe + return typeof test != 'function' || test.hasOwnProperty('prototype'); +}); + + +/***/ }), + +/***/ 9565: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_BIND = __webpack_require__(616); + +var call = Function.prototype.call; + +module.exports = NATIVE_BIND ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + + +/***/ }), + +/***/ 350: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var hasOwn = __webpack_require__(9297); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + + +/***/ }), + +/***/ 6706: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var aCallable = __webpack_require__(9306); + +module.exports = function (object, key, method) { + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method])); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ 7476: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classofRaw = __webpack_require__(4576); +var uncurryThis = __webpack_require__(9504); + +module.exports = function (fn) { + // Nashorn bug: + // https://github.com/zloirock/core-js/issues/1128 + // https://github.com/zloirock/core-js/issues/1130 + if (classofRaw(fn) === 'Function') return uncurryThis(fn); +}; + + +/***/ }), + +/***/ 9504: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_BIND = __webpack_require__(616); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ 7751: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ 1767: +/***/ ((module) => { + + +// `GetIteratorDirect(obj)` abstract operation +// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect +module.exports = function (obj) { + return { + iterator: obj, + next: obj.next, + done: false + }; +}; + + +/***/ }), + +/***/ 851: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); +var getMethod = __webpack_require__(5966); +var isNullOrUndefined = __webpack_require__(4117); +var Iterators = __webpack_require__(6269); +var wellKnownSymbol = __webpack_require__(8227); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ 81: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var tryToString = __webpack_require__(6823); +var getIteratorMethod = __webpack_require__(851); + +var $TypeError = TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw new $TypeError(tryToString(argument) + ' is not iterable'); +}; + + +/***/ }), + +/***/ 5966: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); +var isNullOrUndefined = __webpack_require__(4117); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return isNullOrUndefined(func) ? undefined : aCallable(func); +}; + + +/***/ }), + +/***/ 3789: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var call = __webpack_require__(9565); +var toIntegerOrInfinity = __webpack_require__(1291); +var getIteratorDirect = __webpack_require__(1767); + +var INVALID_SIZE = 'Invalid size'; +var $RangeError = RangeError; +var $TypeError = TypeError; +var max = Math.max; + +var SetRecord = function (set, intSize) { + this.set = set; + this.size = max(intSize, 0); + this.has = aCallable(set.has); + this.keys = aCallable(set.keys); +}; + +SetRecord.prototype = { + getIterator: function () { + return getIteratorDirect(anObject(call(this.keys, this.set))); + }, + includes: function (it) { + return call(this.has, this.set, it); + } +}; + +// `GetSetRecord` abstract operation +// https://tc39.es/proposal-set-methods/#sec-getsetrecord +module.exports = function (obj) { + anObject(obj); + var numSize = +obj.size; + // NOTE: If size is undefined, then numSize will be NaN + // eslint-disable-next-line no-self-compare -- NaN check + if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); + var intSize = toIntegerOrInfinity(numSize); + if (intSize < 0) throw new $RangeError(INVALID_SIZE); + return new SetRecord(obj, intSize); +}; + + +/***/ }), + +/***/ 4475: +/***/ (function(module) { + + +var check = function (it) { + return it && it.Math === Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + check(typeof this == 'object' && this) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + + +/***/ }), + +/***/ 9297: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var toObject = __webpack_require__(8981); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ 421: +/***/ ((module) => { + + +module.exports = {}; + + +/***/ }), + +/***/ 397: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ 5917: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var fails = __webpack_require__(9039); +var createElement = __webpack_require__(4055); + +// Thanks to IE8 for its funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a !== 7; +}); + + +/***/ }), + +/***/ 7055: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var fails = __webpack_require__(9039); +var classof = __webpack_require__(4576); + +var $Object = Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !$Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) === 'String' ? split(it, '') : $Object(it); +} : $Object; + + +/***/ }), + +/***/ 3167: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var setPrototypeOf = __webpack_require__(2967); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ 3706: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var isCallable = __webpack_require__(4901); +var store = __webpack_require__(7629); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ 1181: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var NATIVE_WEAK_MAP = __webpack_require__(8622); +var global = __webpack_require__(4475); +var isObject = __webpack_require__(34); +var createNonEnumerableProperty = __webpack_require__(6699); +var hasOwn = __webpack_require__(9297); +var shared = __webpack_require__(7629); +var sharedKey = __webpack_require__(6119); +var hiddenKeys = __webpack_require__(421); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + /* eslint-disable no-self-assign -- prototype methods protection */ + store.get = store.get; + store.has = store.has; + store.set = store.set; + /* eslint-enable no-self-assign -- prototype methods protection */ + set = function (it, metadata) { + if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + store.set(it, metadata); + return metadata; + }; + get = function (it) { + return store.get(it) || {}; + }; + has = function (it) { + return store.has(it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ 4209: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var wellKnownSymbol = __webpack_require__(8227); +var Iterators = __webpack_require__(6269); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ 4376: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(4576); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) === 'Array'; +}; + + +/***/ }), + +/***/ 1108: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); + +module.exports = function (it) { + var klass = classof(it); + return klass === 'BigInt64Array' || klass === 'BigUint64Array'; +}; + + +/***/ }), + +/***/ 4901: +/***/ ((module) => { + + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +var documentAll = typeof document == 'object' && document.all; + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing +module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) { + return typeof argument == 'function' || argument === documentAll; +} : function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }), + +/***/ 2796: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value === POLYFILL ? true + : value === NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ 4117: +/***/ ((module) => { + + +// we can't use just `it == null` since of `document.all` special case +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec +module.exports = function (it) { + return it === null || it === undefined; +}; + + +/***/ }), + +/***/ 34: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isCallable = __webpack_require__(4901); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + + +/***/ }), + +/***/ 3925: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isObject = __webpack_require__(34); + +module.exports = function (argument) { + return isObject(argument) || argument === null; +}; + + +/***/ }), + +/***/ 6395: +/***/ ((module) => { + + +module.exports = false; + + +/***/ }), + +/***/ 757: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); +var isCallable = __webpack_require__(4901); +var isPrototypeOf = __webpack_require__(1625); +var USE_SYMBOL_AS_UID = __webpack_require__(7040); + +var $Object = Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); +}; + + +/***/ }), + +/***/ 507: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); + +module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) { + var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator; + var next = record.next; + var step, result; + while (!(step = call(next, iterator)).done) { + result = fn(step.value); + if (result !== undefined) return result; + } +}; + + +/***/ }), + +/***/ 2652: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var bind = __webpack_require__(6080); +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var tryToString = __webpack_require__(6823); +var isArrayIteratorMethod = __webpack_require__(4209); +var lengthOfArrayLike = __webpack_require__(6198); +var isPrototypeOf = __webpack_require__(1625); +var getIterator = __webpack_require__(81); +var getIteratorMethod = __webpack_require__(851); +var iteratorClose = __webpack_require__(9539); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ 9539: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var anObject = __webpack_require__(8551); +var getMethod = __webpack_require__(5966); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + + +/***/ }), + +/***/ 9462: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var create = __webpack_require__(2360); +var createNonEnumerableProperty = __webpack_require__(6699); +var defineBuiltIns = __webpack_require__(6279); +var wellKnownSymbol = __webpack_require__(8227); +var InternalStateModule = __webpack_require__(1181); +var getMethod = __webpack_require__(5966); +var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); +var createIterResultObject = __webpack_require__(2529); +var iteratorClose = __webpack_require__(9539); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ITERATOR_HELPER = 'IteratorHelper'; +var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; +var setInternalState = InternalStateModule.set; + +var createIteratorProxyPrototype = function (IS_ITERATOR) { + var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); + + return defineBuiltIns(create(IteratorPrototype), { + next: function next() { + var state = getInternalState(this); + // for simplification: + // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject` + // for `%IteratorHelperPrototype%.next` - just a value + if (IS_ITERATOR) return state.nextHandler(); + try { + var result = state.done ? undefined : state.nextHandler(); + return createIterResultObject(result, state.done); + } catch (error) { + state.done = true; + throw error; + } + }, + 'return': function () { + var state = getInternalState(this); + var iterator = state.iterator; + state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); + } + if (state.inner) try { + iteratorClose(state.inner.iterator, 'normal'); + } catch (error) { + return iteratorClose(iterator, 'throw', error); + } + iteratorClose(iterator, 'normal'); + return createIterResultObject(undefined, true); + } + }); +}; + +var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); +var IteratorHelperPrototype = createIteratorProxyPrototype(false); + +createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); + +module.exports = function (nextHandler, IS_ITERATOR) { + var IteratorProxy = function Iterator(record, state) { + if (state) { + state.iterator = record.iterator; + state.next = record.next; + } else state = record; + state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; + state.nextHandler = nextHandler; + state.counter = 0; + state.done = false; + setInternalState(this, state); + }; + + IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; + + return IteratorProxy; +}; + + +/***/ }), + +/***/ 713: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var createIteratorProxy = __webpack_require__(9462); +var callWithSafeIterationClosing = __webpack_require__(6319); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +// `Iterator.prototype.map` method +// https://github.com/tc39/proposal-iterator-helpers +module.exports = function map(mapper) { + anObject(this); + aCallable(mapper); + return new IteratorProxy(getIteratorDirect(this), { + mapper: mapper + }); +}; + + +/***/ }), + +/***/ 7657: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); +var create = __webpack_require__(2360); +var getPrototypeOf = __webpack_require__(2787); +var defineBuiltIn = __webpack_require__(6840); +var wellKnownSymbol = __webpack_require__(8227); +var IS_PURE = __webpack_require__(6395); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ 6269: +/***/ ((module) => { + + +module.exports = {}; + + +/***/ }), + +/***/ 6198: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toLength = __webpack_require__(8014); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + + +/***/ }), + +/***/ 283: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var fails = __webpack_require__(9039); +var isCallable = __webpack_require__(4901); +var hasOwn = __webpack_require__(9297); +var DESCRIPTORS = __webpack_require__(3724); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(350).CONFIGURABLE); +var inspectSource = __webpack_require__(3706); +var InternalStateModule = __webpack_require__(1181); + +var enforceInternalState = InternalStateModule.enforce; +var getInternalState = InternalStateModule.get; +var $String = String; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var stringSlice = uncurryThis(''.slice); +var replace = uncurryThis(''.replace); +var join = uncurryThis([].join); + +var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () { + return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8; +}); + +var TEMPLATE = String(String).split('String'); + +var makeBuiltIn = module.exports = function (value, name, options) { + if (stringSlice($String(name), 0, 7) === 'Symbol(') { + name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']'; + } + if (options && options.getter) name = 'get ' + name; + if (options && options.setter) name = 'set ' + name; + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true }); + else value.name = name; + } + if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) { + defineProperty(value, 'length', { value: options.arity }); + } + try { + if (options && hasOwn(options, 'constructor') && options.constructor) { + if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false }); + // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable + } else if (value.prototype) value.prototype = undefined; + } catch (error) { /* empty */ } + var state = enforceInternalState(value); + if (!hasOwn(state, 'source')) { + state.source = join(TEMPLATE, typeof name == 'string' ? name : ''); + } return value; +}; + +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +// eslint-disable-next-line no-extend-native -- required +Function.prototype.toString = makeBuiltIn(function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}, 'toString'); + + +/***/ }), + +/***/ 741: +/***/ ((module) => { + + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.es/ecma262/#sec-math.trunc +// eslint-disable-next-line es/no-math-trunc -- safe +module.exports = Math.trunc || function trunc(x) { + var n = +x; + return (n > 0 ? floor : ceil)(n); +}; + + +/***/ }), + +/***/ 6043: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aCallable = __webpack_require__(9306); + +var $TypeError = TypeError; + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ 2603: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toString = __webpack_require__(655); + +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; + + +/***/ }), + +/***/ 2360: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(8551); +var definePropertiesModule = __webpack_require__(6801); +var enumBugKeys = __webpack_require__(8727); +var hiddenKeys = __webpack_require__(421); +var html = __webpack_require__(397); +var documentCreateElement = __webpack_require__(4055); +var sharedKey = __webpack_require__(6119); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +// eslint-disable-next-line es/no-object-create -- safe +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : definePropertiesModule.f(result, Properties); +}; + + +/***/ }), + +/***/ 6801: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); +var definePropertyModule = __webpack_require__(4913); +var anObject = __webpack_require__(8551); +var toIndexedObject = __webpack_require__(5397); +var objectKeys = __webpack_require__(1072); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ 4913: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var IE8_DOM_DEFINE = __webpack_require__(5917); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686); +var anObject = __webpack_require__(8551); +var toPropertyKey = __webpack_require__(6969); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +var ENUMERABLE = 'enumerable'; +var CONFIGURABLE = 'configurable'; +var WRITABLE = 'writable'; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { + var current = $getOwnPropertyDescriptor(O, P); + if (current && current[WRITABLE]) { + O[P] = Attributes.value; + Attributes = { + configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], + enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], + writable: false + }; + } + } return $defineProperty(O, P, Attributes); +} : $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ 7347: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var call = __webpack_require__(9565); +var propertyIsEnumerableModule = __webpack_require__(8773); +var createPropertyDescriptor = __webpack_require__(6980); +var toIndexedObject = __webpack_require__(5397); +var toPropertyKey = __webpack_require__(6969); +var hasOwn = __webpack_require__(9297); +var IE8_DOM_DEFINE = __webpack_require__(5917); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + + +/***/ }), + +/***/ 8480: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +var internalObjectKeys = __webpack_require__(1828); +var enumBugKeys = __webpack_require__(8727); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ 3717: +/***/ ((__unused_webpack_module, exports) => { + + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ 2787: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var hasOwn = __webpack_require__(9297); +var isCallable = __webpack_require__(4901); +var toObject = __webpack_require__(8981); +var sharedKey = __webpack_require__(6119); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(2211); + +var IE_PROTO = sharedKey('IE_PROTO'); +var $Object = Object; +var ObjectPrototype = $Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +// eslint-disable-next-line es/no-object-getprototypeof -- safe +module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof $Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ 1625: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ 1828: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var hasOwn = __webpack_require__(9297); +var toIndexedObject = __webpack_require__(5397); +var indexOf = (__webpack_require__(9617).indexOf); +var hiddenKeys = __webpack_require__(421); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + + +/***/ }), + +/***/ 1072: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var internalObjectKeys = __webpack_require__(1828); +var enumBugKeys = __webpack_require__(8727); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ 8773: +/***/ ((__unused_webpack_module, exports) => { + + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ 2967: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = __webpack_require__(6706); +var isObject = __webpack_require__(34); +var requireObjectCoercible = __webpack_require__(7750); +var aPossiblePrototype = __webpack_require__(3506); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + requireObjectCoercible(O); + aPossiblePrototype(proto); + if (!isObject(O)) return O; + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ 4270: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var isCallable = __webpack_require__(4901); +var isObject = __webpack_require__(34); + +var $TypeError = TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw new $TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ 5031: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); +var uncurryThis = __webpack_require__(9504); +var getOwnPropertyNamesModule = __webpack_require__(8480); +var getOwnPropertySymbolsModule = __webpack_require__(3717); +var anObject = __webpack_require__(8551); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ 7979: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var anObject = __webpack_require__(8551); + +// `RegExp.prototype.flags` getter implementation +// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.hasIndices) result += 'd'; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.dotAll) result += 's'; + if (that.unicode) result += 'u'; + if (that.unicodeSets) result += 'v'; + if (that.sticky) result += 'y'; + return result; +}; + + +/***/ }), + +/***/ 7750: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var isNullOrUndefined = __webpack_require__(4117); + +var $TypeError = TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ 9286: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var SetHelpers = __webpack_require__(4402); +var iterate = __webpack_require__(8469); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; + +module.exports = function (set) { + var result = new Set(); + iterate(set, function (it) { + add(result, it); + }); + return result; +}; + + +/***/ }), + +/***/ 3440: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var clone = __webpack_require__(9286); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); + +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function difference(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = clone(O); + if (size(O) <= otherRec.size) iterateSet(O, function (e) { + if (otherRec.includes(e)) remove(result, e); + }); + else iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) remove(result, e); + }); + return result; +}; + + +/***/ }), + +/***/ 4402: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +// eslint-disable-next-line es/no-set -- safe +var SetPrototype = Set.prototype; + +module.exports = { + // eslint-disable-next-line es/no-set -- safe + Set: Set, + add: uncurryThis(SetPrototype.add), + has: uncurryThis(SetPrototype.has), + remove: uncurryThis(SetPrototype['delete']), + proto: SetPrototype +}; + + +/***/ }), + +/***/ 8750: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + + +/***/ }), + +/***/ 4449: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var has = (__webpack_require__(4402).has); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSet = __webpack_require__(8469); +var iterateSimple = __webpack_require__(507); +var iteratorClose = __webpack_require__(9539); + +// `Set.prototype.isDisjointFrom` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom +module.exports = function isDisjointFrom(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) <= otherRec.size) return iterateSet(O, function (e) { + if (otherRec.includes(e)) return false; + }, true) !== false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (has(O, e)) return iteratorClose(iterator, 'normal', false); + }) !== false; +}; + + +/***/ }), + +/***/ 3838: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var size = __webpack_require__(5170); +var iterate = __webpack_require__(8469); +var getSetRecord = __webpack_require__(3789); + +// `Set.prototype.isSubsetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf +module.exports = function isSubsetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) > otherRec.size) return false; + return iterate(O, function (e) { + if (!otherRec.includes(e)) return false; + }, true) !== false; +}; + + +/***/ }), + +/***/ 8527: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var has = (__webpack_require__(4402).has); +var size = __webpack_require__(5170); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); +var iteratorClose = __webpack_require__(9539); + +// `Set.prototype.isSupersetOf` method +// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf +module.exports = function isSupersetOf(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + if (size(O) < otherRec.size) return false; + var iterator = otherRec.getIterator(); + return iterateSimple(iterator, function (e) { + if (!has(O, e)) return iteratorClose(iterator, 'normal', false); + }) !== false; +}; + + +/***/ }), + +/***/ 8469: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); +var iterateSimple = __webpack_require__(507); +var SetHelpers = __webpack_require__(4402); + +var Set = SetHelpers.Set; +var SetPrototype = SetHelpers.proto; +var forEach = uncurryThis(SetPrototype.forEach); +var keys = uncurryThis(SetPrototype.keys); +var next = keys(new Set()).next; + +module.exports = function (set, fn, interruptible) { + return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn); +}; + + +/***/ }), + +/***/ 4916: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var getBuiltIn = __webpack_require__(7751); + +var createSetLike = function (size) { + return { + size: size, + has: function () { + return false; + }, + keys: function () { + return { + next: function () { + return { done: true }; + } + }; + } + }; +}; + +module.exports = function (name) { + var Set = getBuiltIn('Set'); + try { + new Set()[name](createSetLike(0)); + try { + // late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it + // https://github.com/tc39/proposal-set-methods/pull/88 + new Set()[name](createSetLike(-1)); + return false; + } catch (error2) { + return true; + } + } catch (error) { + return false; + } +}; + + +/***/ }), + +/***/ 5170: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThisAccessor = __webpack_require__(6706); +var SetHelpers = __webpack_require__(4402); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + + +/***/ }), + +/***/ 3650: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var SetHelpers = __webpack_require__(4402); +var clone = __webpack_require__(9286); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + + +/***/ }), + +/***/ 4204: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var aSet = __webpack_require__(7080); +var add = (__webpack_require__(4402).add); +var clone = __webpack_require__(9286); +var getSetRecord = __webpack_require__(3789); +var iterateSimple = __webpack_require__(507); + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +module.exports = function union(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (it) { + add(result, it); + }); + return result; +}; + + +/***/ }), + +/***/ 6119: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var shared = __webpack_require__(5745); +var uid = __webpack_require__(3392); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ 7629: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_PURE = __webpack_require__(6395); +var globalThis = __webpack_require__(4475); +var defineGlobalProperty = __webpack_require__(9433); + +var SHARED = '__core-js_shared__'; +var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {}); + +(store.versions || (store.versions = [])).push({ + version: '3.37.1', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', + license: 'https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE', + source: 'https://github.com/zloirock/core-js' +}); + + +/***/ }), + +/***/ 5745: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var store = __webpack_require__(7629); + +module.exports = function (key, value) { + return store[key] || (store[key] = value || {}); +}; + + +/***/ }), + +/***/ 1548: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var fails = __webpack_require__(9039); +var V8 = __webpack_require__(7388); +var IS_BROWSER = __webpack_require__(7290); +var IS_DENO = __webpack_require__(516); +var IS_NODE = __webpack_require__(9088); + +var structuredClone = global.structuredClone; + +module.exports = !!structuredClone && !fails(function () { + // prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if ((IS_DENO && V8 > 92) || (IS_NODE && V8 > 94) || (IS_BROWSER && V8 > 97)) return false; + var buffer = new ArrayBuffer(8); + var clone = structuredClone(buffer, { transfer: [buffer] }); + return buffer.byteLength !== 0 || clone.byteLength !== 8; +}); + + +/***/ }), + +/***/ 4495: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(7388); +var fails = __webpack_require__(9039); +var global = __webpack_require__(4475); + +var $String = global.String; + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol('symbol detection'); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will, + // of course, fail. + return !$String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + + +/***/ }), + +/***/ 5610: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ 5854: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toPrimitive = __webpack_require__(2777); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + + +/***/ }), + +/***/ 7696: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); +var toLength = __webpack_require__(8014); + +var $RangeError = RangeError; + +// `ToIndex` abstract operation +// https://tc39.es/ecma262/#sec-toindex +module.exports = function (it) { + if (it === undefined) return 0; + var number = toIntegerOrInfinity(it); + var length = toLength(number); + if (number !== length) throw new $RangeError('Wrong length or index'); + return length; +}; + + +/***/ }), + +/***/ 5397: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(7055); +var requireObjectCoercible = __webpack_require__(7750); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ 1291: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var trunc = __webpack_require__(741); + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- NaN check + return number !== number || number === 0 ? 0 : trunc(number); +}; + + +/***/ }), + +/***/ 8014: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toIntegerOrInfinity = __webpack_require__(1291); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + var len = toIntegerOrInfinity(argument); + return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ 8981: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var requireObjectCoercible = __webpack_require__(7750); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ 2777: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var call = __webpack_require__(9565); +var isObject = __webpack_require__(34); +var isSymbol = __webpack_require__(757); +var getMethod = __webpack_require__(5966); +var ordinaryToPrimitive = __webpack_require__(4270); +var wellKnownSymbol = __webpack_require__(8227); + +var $TypeError = TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw new $TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + + +/***/ }), + +/***/ 6969: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var toPrimitive = __webpack_require__(2777); +var isSymbol = __webpack_require__(757); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ 2140: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var wellKnownSymbol = __webpack_require__(8227); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ 655: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var classof = __webpack_require__(6955); + +var $String = String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string'); + return $String(argument); +}; + + +/***/ }), + +/***/ 9714: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var IS_NODE = __webpack_require__(9088); + +module.exports = function (name) { + try { + // eslint-disable-next-line no-new-func -- safe + if (IS_NODE) return Function('return require("' + name + '")')(); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ 6823: +/***/ ((module) => { + + +var $String = String; + +module.exports = function (argument) { + try { + return $String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }), + +/***/ 3392: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var uncurryThis = __webpack_require__(9504); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ }), + +/***/ 7040: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(4495); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ 8686: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var fails = __webpack_require__(9039); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + + +/***/ }), + +/***/ 2812: +/***/ ((module) => { + + +var $TypeError = TypeError; + +module.exports = function (passed, required) { + if (passed < required) throw new $TypeError('Not enough arguments'); + return passed; +}; + + +/***/ }), + +/***/ 8622: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var isCallable = __webpack_require__(4901); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap)); + + +/***/ }), + +/***/ 8227: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var shared = __webpack_require__(5745); +var hasOwn = __webpack_require__(9297); +var uid = __webpack_require__(3392); +var NATIVE_SYMBOL = __webpack_require__(4495); +var USE_SYMBOL_AS_UID = __webpack_require__(7040); + +var Symbol = global.Symbol; +var WellKnownSymbolsStore = shared('wks'); +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name)) { + WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name) + ? Symbol[name] + : createWellKnownSymbol('Symbol.' + name); + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ 6573: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var defineBuiltInAccessor = __webpack_require__(2106); +var isDetached = __webpack_require__(3238); + +var ArrayBufferPrototype = ArrayBuffer.prototype; + +if (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) { + defineBuiltInAccessor(ArrayBufferPrototype, 'detached', { + configurable: true, + get: function detached() { + return isDetached(this); + } + }); +} + + +/***/ }), + +/***/ 7936: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var $transfer = __webpack_require__(5636); + +// `ArrayBuffer.prototype.transferToFixedLength` method +// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfertofixedlength +if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { + transferToFixedLength: function transferToFixedLength() { + return $transfer(this, arguments.length ? arguments[0] : undefined, false); + } +}); + + +/***/ }), + +/***/ 8100: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var $transfer = __webpack_require__(5636); + +// `ArrayBuffer.prototype.transfer` method +// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfer +if ($transfer) $({ target: 'ArrayBuffer', proto: true }, { + transfer: function transfer() { + return $transfer(this, arguments.length ? arguments[0] : undefined, true); + } +}); + + +/***/ }), + +/***/ 4114: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var toObject = __webpack_require__(8981); +var lengthOfArrayLike = __webpack_require__(6198); +var setArrayLength = __webpack_require__(4527); +var doesNotExceedSafeInteger = __webpack_require__(6837); +var fails = __webpack_require__(9039); + +var INCORRECT_TO_LENGTH = fails(function () { + return [].push.call({ length: 0x100000000 }, 1) !== 4294967297; +}); + +// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError +// https://bugs.chromium.org/p/v8/issues/detail?id=12681 +var properErrorOnNonWritableLength = function () { + try { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty([], 'length', { writable: false }).push(); + } catch (error) { + return error instanceof TypeError; + } +}; + +var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength(); + +// `Array.prototype.push` method +// https://tc39.es/ecma262/#sec-array.prototype.push +$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + push: function push(item) { + var O = toObject(this); + var len = lengthOfArrayLike(O); + var argCount = arguments.length; + doesNotExceedSafeInteger(len + argCount); + for (var i = 0; i < argCount; i++) { + O[len] = arguments[i]; + len++; + } + setArrayLength(O, len); + return len; + } +}); + + +/***/ }), + +/***/ 4628: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var newPromiseCapabilityModule = __webpack_require__(6043); + +// `Promise.withResolvers` method +// https://github.com/tc39/proposal-promise-with-resolvers +$({ target: 'Promise', stat: true }, { + withResolvers: function withResolvers() { + var promiseCapability = newPromiseCapabilityModule.f(this); + return { + promise: promiseCapability.promise, + resolve: promiseCapability.resolve, + reject: promiseCapability.reject + }; + } +}); + + +/***/ }), + +/***/ 9479: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var global = __webpack_require__(4475); +var DESCRIPTORS = __webpack_require__(3724); +var defineBuiltInAccessor = __webpack_require__(2106); +var regExpFlags = __webpack_require__(7979); +var fails = __webpack_require__(9039); + +// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError +var RegExp = global.RegExp; +var RegExpPrototype = RegExp.prototype; + +var FORCED = DESCRIPTORS && fails(function () { + var INDICES_SUPPORT = true; + try { + RegExp('.', 'd'); + } catch (error) { + INDICES_SUPPORT = false; + } + + var O = {}; + // modern V8 bug + var calls = ''; + var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy'; + + var addGetter = function (key, chr) { + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty(O, key, { get: function () { + calls += chr; + return true; + } }); + }; + + var pairs = { + dotAll: 's', + global: 'g', + ignoreCase: 'i', + multiline: 'm', + sticky: 'y' + }; + + if (INDICES_SUPPORT) pairs.hasIndices = 'd'; + + for (var key in pairs) addGetter(key, pairs[key]); + + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O); + + return result !== expected || calls !== expected; +}); + +// `RegExp.prototype.flags` getter +// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags +if (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', { + configurable: true, + get: regExpFlags +}); + + +/***/ }), + +/***/ 7642: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var difference = __webpack_require__(3440); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.difference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, { + difference: difference +}); + + +/***/ }), + +/***/ 8004: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var fails = __webpack_require__(9039); +var intersection = __webpack_require__(8750); +var setMethodAcceptSetLike = __webpack_require__(4916); + +var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () { + // eslint-disable-next-line es/no-array-from, es/no-set -- testing + return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2'; +}); + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, { + intersection: intersection +}); + + +/***/ }), + +/***/ 3853: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isDisjointFrom = __webpack_require__(4449); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isDisjointFrom` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, { + isDisjointFrom: isDisjointFrom +}); + + +/***/ }), + +/***/ 5876: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isSubsetOf = __webpack_require__(3838); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isSubsetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, { + isSubsetOf: isSubsetOf +}); + + +/***/ }), + +/***/ 2475: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var isSupersetOf = __webpack_require__(8527); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.isSupersetOf` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, { + isSupersetOf: isSupersetOf +}); + + +/***/ }), + +/***/ 5024: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var symmetricDifference = __webpack_require__(3650); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, { + symmetricDifference: symmetricDifference +}); + + +/***/ }), + +/***/ 1698: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var union = __webpack_require__(4204); +var setMethodAcceptSetLike = __webpack_require__(4916); + +// `Set.prototype.union` method +// https://github.com/tc39/proposal-set-methods +$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, { + union: union +}); + + +/***/ }), + +/***/ 7467: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var arrayToReversed = __webpack_require__(7628); +var ArrayBufferViewCore = __webpack_require__(4644); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; + +// `%TypedArray%.prototype.toReversed` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed +exportTypedArrayMethod('toReversed', function toReversed() { + return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this)); +}); + + +/***/ }), + +/***/ 4732: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var ArrayBufferViewCore = __webpack_require__(4644); +var uncurryThis = __webpack_require__(9504); +var aCallable = __webpack_require__(9306); +var arrayFromConstructorAndList = __webpack_require__(5370); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +var sort = uncurryThis(ArrayBufferViewCore.TypedArrayPrototype.sort); + +// `%TypedArray%.prototype.toSorted` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tosorted +exportTypedArrayMethod('toSorted', function toSorted(compareFn) { + if (compareFn !== undefined) aCallable(compareFn); + var O = aTypedArray(this); + var A = arrayFromConstructorAndList(getTypedArrayConstructor(O), O); + return sort(A, compareFn); +}); + + +/***/ }), + +/***/ 9577: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var arrayWith = __webpack_require__(9928); +var ArrayBufferViewCore = __webpack_require__(4644); +var isBigIntArray = __webpack_require__(1108); +var toIntegerOrInfinity = __webpack_require__(1291); +var toBigInt = __webpack_require__(5854); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var PROPER_ORDER = !!function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var relativeIndex = toIntegerOrInfinity(index); + var actualValue = isBigIntArray(O) ? toBigInt(value) : +value; + return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue); +} }['with'], !PROPER_ORDER); + + +/***/ }), + +/***/ 8992: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var global = __webpack_require__(4475); +var anInstance = __webpack_require__(679); +var anObject = __webpack_require__(8551); +var isCallable = __webpack_require__(4901); +var getPrototypeOf = __webpack_require__(2787); +var defineBuiltInAccessor = __webpack_require__(2106); +var createProperty = __webpack_require__(4659); +var fails = __webpack_require__(9039); +var hasOwn = __webpack_require__(9297); +var wellKnownSymbol = __webpack_require__(8227); +var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype); +var DESCRIPTORS = __webpack_require__(3724); +var IS_PURE = __webpack_require__(6395); + +var CONSTRUCTOR = 'constructor'; +var ITERATOR = 'Iterator'; +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +var $TypeError = TypeError; +var NativeIterator = global[ITERATOR]; + +// FF56- have non-standard global helper `Iterator` +var FORCED = IS_PURE + || !isCallable(NativeIterator) + || NativeIterator.prototype !== IteratorPrototype + // FF44- non-standard `Iterator` passes previous tests + || !fails(function () { NativeIterator({}); }); + +var IteratorConstructor = function Iterator() { + anInstance(this, IteratorPrototype); + if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable'); +}; + +var defineIteratorPrototypeAccessor = function (key, value) { + if (DESCRIPTORS) { + defineBuiltInAccessor(IteratorPrototype, key, { + configurable: true, + get: function () { + return value; + }, + set: function (replacement) { + anObject(this); + if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property"); + if (hasOwn(this, key)) this[key] = replacement; + else createProperty(this, key, replacement); + } + }); + } else IteratorPrototype[key] = value; +}; + +if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR); + +if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) { + defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor); +} + +IteratorConstructor.prototype = IteratorPrototype; + +// `Iterator` constructor +// https://github.com/tc39/proposal-iterator-helpers +$({ global: true, constructor: true, forced: FORCED }, { + Iterator: IteratorConstructor +}); + + +/***/ }), + +/***/ 3215: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.every` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + every: function every(predicate) { + anObject(this); + aCallable(predicate); + var record = getIteratorDirect(this); + var counter = 0; + return !iterate(record, function (value, stop) { + if (!predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + + +/***/ }), + +/***/ 4520: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var call = __webpack_require__(9565); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); +var createIteratorProxy = __webpack_require__(9462); +var callWithSafeIterationClosing = __webpack_require__(6319); +var IS_PURE = __webpack_require__(6395); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var predicate = this.predicate; + var next = this.next; + var result, done, value; + while (true) { + result = anObject(call(next, iterator)); + done = this.done = !!result.done; + if (done) return; + value = result.value; + if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value; + } +}); + +// `Iterator.prototype.filter` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + filter: function filter(predicate) { + anObject(this); + aCallable(predicate); + return new IteratorProxy(getIteratorDirect(this), { + predicate: predicate + }); + } +}); + + +/***/ }), + +/***/ 2577: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.find` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + find: function find(predicate) { + anObject(this); + aCallable(predicate); + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(value); + }, { IS_RECORD: true, INTERRUPTED: true }).result; + } +}); + + +/***/ }), + +/***/ 3949: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.forEach` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + forEach: function forEach(fn) { + anObject(this); + aCallable(fn); + var record = getIteratorDirect(this); + var counter = 0; + iterate(record, function (value) { + fn(value, counter++); + }, { IS_RECORD: true }); + } +}); + + +/***/ }), + +/***/ 1454: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var map = __webpack_require__(713); +var IS_PURE = __webpack_require__(6395); + +// `Iterator.prototype.map` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + map: map +}); + + +/***/ }), + +/***/ 8872: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +var $TypeError = TypeError; + +// `Iterator.prototype.reduce` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + reduce: function reduce(reducer /* , initialValue */) { + anObject(this); + aCallable(reducer); + var record = getIteratorDirect(this); + var noInitial = arguments.length < 2; + var accumulator = noInitial ? undefined : arguments[1]; + var counter = 0; + iterate(record, function (value) { + if (noInitial) { + noInitial = false; + accumulator = value; + } else { + accumulator = reducer(accumulator, value, counter); + } + counter++; + }, { IS_RECORD: true }); + if (noInitial) throw new $TypeError('Reduce of empty iterator with no initial value'); + return accumulator; + } +}); + + +/***/ }), + +/***/ 7550: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var iterate = __webpack_require__(2652); +var aCallable = __webpack_require__(9306); +var anObject = __webpack_require__(8551); +var getIteratorDirect = __webpack_require__(1767); + +// `Iterator.prototype.some` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + some: function some(predicate) { + anObject(this); + aCallable(predicate); + var record = getIteratorDirect(this); + var counter = 0; + return iterate(record, function (value, stop) { + if (predicate(value, counter++)) return stop(); + }, { IS_RECORD: true, INTERRUPTED: true }).stopped; + } +}); + + +/***/ }), + +/***/ 1795: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var anObject = __webpack_require__(8551); +var iterate = __webpack_require__(2652); +var getIteratorDirect = __webpack_require__(1767); + +var push = [].push; + +// `Iterator.prototype.toArray` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + toArray: function toArray() { + var result = []; + iterate(getIteratorDirect(anObject(this)), push, { that: result, IS_RECORD: true }); + return result; + } +}); + + +/***/ }), + +/***/ 3375: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(7642); + + +/***/ }), + +/***/ 9225: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(8004); + + +/***/ }), + +/***/ 3972: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(3853); + + +/***/ }), + +/***/ 9209: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(5876); + + +/***/ }), + +/***/ 5714: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(2475); + + +/***/ }), + +/***/ 7561: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(5024); + + +/***/ }), + +/***/ 6197: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +// TODO: Remove from `core-js@4` +__webpack_require__(1698); + + +/***/ }), + +/***/ 4979: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var global = __webpack_require__(4475); +var getBuiltIn = __webpack_require__(7751); +var createPropertyDescriptor = __webpack_require__(6980); +var defineProperty = (__webpack_require__(4913).f); +var hasOwn = __webpack_require__(9297); +var anInstance = __webpack_require__(679); +var inheritIfRequired = __webpack_require__(3167); +var normalizeStringArgument = __webpack_require__(2603); +var DOMExceptionConstants = __webpack_require__(5002); +var clearErrorStack = __webpack_require__(6193); +var DESCRIPTORS = __webpack_require__(3724); +var IS_PURE = __webpack_require__(6395); + +var DOM_EXCEPTION = 'DOMException'; +var Error = getBuiltIn('Error'); +var NativeDOMException = getBuiltIn(DOM_EXCEPTION); + +var $DOMException = function DOMException() { + anInstance(this, DOMExceptionPrototype); + var argumentsLength = arguments.length; + var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]); + var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error'); + var that = new NativeDOMException(message, name); + var error = new Error(message); + error.name = DOM_EXCEPTION; + defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1))); + inheritIfRequired(that, this, $DOMException); + return that; +}; + +var DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype; + +var ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION); +var DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(global, DOM_EXCEPTION); + +// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it +// https://github.com/Jarred-Sumner/bun/issues/399 +var BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable); + +var FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK; + +// `DOMException` constructor patch for `.stack` where it's required +// https://webidl.spec.whatwg.org/#es-DOMException-specialness +$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic + DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException +}); + +var PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION); +var PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype; + +if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) { + if (!IS_PURE) { + defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException)); + } + + for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) { + var constant = DOMExceptionConstants[key]; + var constantName = constant.s; + if (!hasOwn(PolyfilledDOMException, constantName)) { + defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c)); + } + } +} + + +/***/ }), + +/***/ 3611: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var $ = __webpack_require__(6518); +var global = __webpack_require__(4475); +var defineBuiltInAccessor = __webpack_require__(2106); +var DESCRIPTORS = __webpack_require__(3724); + +var $TypeError = TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; +var INCORRECT_VALUE = global.self !== global; + +// `self` getter +// https://html.spec.whatwg.org/multipage/window-object.html#dom-self +try { + if (DESCRIPTORS) { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + var descriptor = Object.getOwnPropertyDescriptor(global, 'self'); + // some engines have `self`, but with incorrect descriptor + // https://github.com/denoland/deno/issues/15765 + if (INCORRECT_VALUE || !descriptor || !descriptor.get || !descriptor.enumerable) { + defineBuiltInAccessor(global, 'self', { + get: function self() { + return global; + }, + set: function self(value) { + if (this !== global) throw new $TypeError('Illegal invocation'); + defineProperty(global, 'self', { + value: value, + writable: true, + configurable: true, + enumerable: true + }); + }, + configurable: true, + enumerable: true + }); + } + } else $({ global: true, simple: true, forced: INCORRECT_VALUE }, { + self: global + }); +} catch (error) { /* empty */ } + + +/***/ }), + +/***/ 4603: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); +var uncurryThis = __webpack_require__(9504); +var toString = __webpack_require__(655); +var validateArgumentsLength = __webpack_require__(2812); + +var $URLSearchParams = URLSearchParams; +var URLSearchParamsPrototype = $URLSearchParams.prototype; +var append = uncurryThis(URLSearchParamsPrototype.append); +var $delete = uncurryThis(URLSearchParamsPrototype['delete']); +var forEach = uncurryThis(URLSearchParamsPrototype.forEach); +var push = uncurryThis([].push); +var params = new $URLSearchParams('a=1&a=2&b=3'); + +params['delete']('a', 1); +// `undefined` case is a Chromium 117 bug +// https://bugs.chromium.org/p/v8/issues/detail?id=14222 +params['delete']('b', undefined); + +if (params + '' !== 'a=2') { + defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name /* , value */) { + var length = arguments.length; + var $value = length < 2 ? undefined : arguments[1]; + if (length && $value === undefined) return $delete(this, name); + var entries = []; + forEach(this, function (v, k) { // also validates `this` + push(entries, { key: k, value: v }); + }); + validateArgumentsLength(length, 1); + var key = toString(name); + var value = toString($value); + var index = 0; + var dindex = 0; + var found = false; + var entriesLength = entries.length; + var entry; + while (index < entriesLength) { + entry = entries[index++]; + if (found || entry.key === key) { + found = true; + $delete(this, entry.key); + } else dindex++; + } + while (dindex < entriesLength) { + entry = entries[dindex++]; + if (!(entry.key === key && entry.value === value)) append(this, entry.key, entry.value); + } + }, { enumerable: true, unsafe: true }); +} + + +/***/ }), + +/***/ 7566: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var defineBuiltIn = __webpack_require__(6840); +var uncurryThis = __webpack_require__(9504); +var toString = __webpack_require__(655); +var validateArgumentsLength = __webpack_require__(2812); + +var $URLSearchParams = URLSearchParams; +var URLSearchParamsPrototype = $URLSearchParams.prototype; +var getAll = uncurryThis(URLSearchParamsPrototype.getAll); +var $has = uncurryThis(URLSearchParamsPrototype.has); +var params = new $URLSearchParams('a=1'); + +// `undefined` case is a Chromium 117 bug +// https://bugs.chromium.org/p/v8/issues/detail?id=14222 +if (params.has('a', 2) || !params.has('a', undefined)) { + defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name /* , value */) { + var length = arguments.length; + var $value = length < 2 ? undefined : arguments[1]; + if (length && $value === undefined) return $has(this, name); + var values = getAll(this, name); // also validates `this` + validateArgumentsLength(length, 1); + var value = toString($value); + var index = 0; + while (index < values.length) { + if (values[index++] === value) return true; + } return false; + }, { enumerable: true, unsafe: true }); +} + + +/***/ }), + +/***/ 8721: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + + +var DESCRIPTORS = __webpack_require__(3724); +var uncurryThis = __webpack_require__(9504); +var defineBuiltInAccessor = __webpack_require__(2106); + +var URLSearchParamsPrototype = URLSearchParams.prototype; +var forEach = uncurryThis(URLSearchParamsPrototype.forEach); + +// `URLSearchParams.prototype.size` getter +// https://github.com/whatwg/url/pull/734 +if (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) { + defineBuiltInAccessor(URLSearchParamsPrototype, 'size', { + get: function size() { + var count = 0; + forEach(this, function () { count++; }); + return count; + }, + configurable: true, + enumerable: true + }); +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ @@ -49,7 +4540,63 @@ __webpack_require__.d(__webpack_exports__, { WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler) }); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js +var es_array_push = __webpack_require__(4114); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.detached.js +var es_array_buffer_detached = __webpack_require__(6573); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer.js +var es_array_buffer_transfer = __webpack_require__(8100); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer-to-fixed-length.js +var es_array_buffer_transfer_to_fixed_length = __webpack_require__(7936); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.with-resolvers.js +var es_promise_with_resolvers = __webpack_require__(4628); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js +var es_typed_array_to_reversed = __webpack_require__(7467); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js +var es_typed_array_to_sorted = __webpack_require__(4732); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js +var es_typed_array_with = __webpack_require__(9577); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js +var esnext_iterator_constructor = __webpack_require__(8992); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.for-each.js +var esnext_iterator_for_each = __webpack_require__(3949); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js +var esnext_iterator_map = __webpack_require__(1454); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.some.js +var esnext_iterator_some = __webpack_require__(7550); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.difference.v2.js +var esnext_set_difference_v2 = __webpack_require__(3375); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.intersection.v2.js +var esnext_set_intersection_v2 = __webpack_require__(9225); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-disjoint-from.v2.js +var esnext_set_is_disjoint_from_v2 = __webpack_require__(3972); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-subset-of.v2.js +var esnext_set_is_subset_of_v2 = __webpack_require__(9209); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.is-superset-of.v2.js +var esnext_set_is_superset_of_v2 = __webpack_require__(5714); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.symmetric-difference.v2.js +var esnext_set_symmetric_difference_v2 = __webpack_require__(7561); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.set.union.v2.js +var esnext_set_union_v2 = __webpack_require__(6197); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.self.js +var web_self = __webpack_require__(3611); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js +var web_url_search_params_delete = __webpack_require__(4603); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js +var web_url_search_params_has = __webpack_require__(7566); +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js +var web_url_search_params_size = __webpack_require__(8721); ;// CONCATENATED MODULE: ./src/shared/util.js + + + + + + + + + + const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; @@ -65,6 +4612,7 @@ const RenderingIntentFlag = { ANNOTATIONS_FORMS: 0x10, ANNOTATIONS_STORAGE: 0x20, ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, OPLIST: 0x100 }; const AnnotationMode = { @@ -320,7 +4868,9 @@ const OPS = { paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, - constructPath: 91 + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93 }; const PasswordResponses = { NEED_PASSWORD: 1, @@ -785,8 +5335,18 @@ const FontRenderOps = { TRANSLATE: 8 }; +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.every.js +var esnext_iterator_every = __webpack_require__(3215); ;// CONCATENATED MODULE: ./src/core/primitives.js + + + + + + + + const CIRCULAR_REF = Symbol("CIRCULAR_REF"); const EOF = Symbol("EOF"); let CmdCache = Object.create(null); @@ -953,6 +5513,9 @@ class Dict { } return dict; } + delete(key) { + delete this._map[key]; + } } class Ref { constructor(num, gen) { @@ -1068,6 +5631,18 @@ class BaseStream { getBytes(length) { unreachable("Abstract method `getBytes` called"); } + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); + } + async asyncGetBytes() { + unreachable("Abstract method `asyncGetBytes` called"); + } + get isAsync() { + return false; + } + get canAsyncDecodeImageFromBuffer() { + return false; + } peekByte() { const peekedByte = this.getByte(); if (peekedByte !== -1) { @@ -1122,6 +5697,23 @@ class BaseStream { + + + + + + + + + + + + + + + + + const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; function getLookupTableFactory(initializer) { let lookup; @@ -1512,6 +6104,9 @@ function getNewAnnotationsMap(annotationStorage) { } return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; } +function stringToAsciiOrUTF16BE(str) { + return isAscii(str) ? str : stringToUTF16String(str, true); +} function isAscii(str) { return /^[\x00-\x7F]*$/.test(str); } @@ -1553,6 +6148,12 @@ function getSizeInBytes(x) { ;// CONCATENATED MODULE: ./src/core/stream.js + + + + + + class Stream extends BaseStream { constructor(arrayBuffer, start, length, dict) { super(); @@ -1622,6 +6223,21 @@ class NullStream extends Stream { + + + + + + + + + + + + + + + class ChunkedStream extends Stream { constructor(length, chunkSize, manager) { super(new Uint8Array(length), 0, length, null); @@ -2045,11 +6661,25 @@ class ChunkedStreamManager { } } +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js +var esnext_iterator_filter = __webpack_require__(4520); +// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.flags.js +var es_regexp_flags = __webpack_require__(9479); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.find.js +var esnext_iterator_find = __webpack_require__(2577); +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.reduce.js +var esnext_iterator_reduce = __webpack_require__(8872); ;// CONCATENATED MODULE: ./src/core/colorspace.js + + + + + + function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { const COMPONENTS = 3; alpha01 = alpha01 !== 1 ? 0 : alpha01; @@ -2238,6 +6868,8 @@ class ColorSpace { case "RGB": case "DeviceRGB": return this.singletons.rgb; + case "DeviceRGBA": + return this.singletons.rgba; case "CMYK": case "DeviceCMYK": return this.singletons.cmyk; @@ -2257,7 +6889,8 @@ class ColorSpace { } } } - throw new FormatError(`Unrecognized ColorSpace: ${cs.name}`); + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.singletons.gray; } } if (Array.isArray(cs)) { @@ -2332,10 +6965,12 @@ class ColorSpace { const range = params.getArray("Range"); return new LabCS(whitePoint, blackPoint, range); default: - throw new FormatError(`Unimplemented ColorSpace object: ${mode}`); + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.singletons.gray; } } - throw new FormatError(`Unrecognized ColorSpace object: ${cs}`); + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.singletons.gray; } static isDefaultDecode(decode, numComps) { if (!Array.isArray(decode)) { @@ -2360,6 +6995,9 @@ class ColorSpace { get rgb() { return shadow(this, "rgb", new DeviceRgbCS()); }, + get rgba() { + return shadow(this, "rgba", new DeviceRgbaCS()); + }, get cmyk() { return shadow(this, "cmyk", new DeviceCmykCS()); } @@ -2529,6 +7167,17 @@ class DeviceRgbCS extends ColorSpace { return bits === 8; } } +class DeviceRgbaCS extends ColorSpace { + constructor() { + super("DeviceRGBA", 4); + } + getOutputLength(inputLength, _alpha01) { + return inputLength * 4; + } + isPassthrough(bits) { + return bits === 8; + } +} class DeviceCmykCS extends ColorSpace { constructor() { super("DeviceCMYK", 4); @@ -2852,6 +7501,12 @@ class LabCS extends ColorSpace { ;// CONCATENATED MODULE: ./src/core/binary_cmap.js + + + + + + function hexToInt(a, size) { let n = 0; for (let i = 0; i <= size; i++) { @@ -3110,6 +7765,13 @@ class BinaryCMapReader { ;// CONCATENATED MODULE: ./src/core/decode_stream.js + + + + + + + const emptyBuffer = new Uint8Array(0); class DecodeStream extends BaseStream { constructor(maybeMinBufferLength) { @@ -3155,14 +7817,14 @@ class DecodeStream extends BaseStream { } return this.buffer[this.pos++]; } - getBytes(length, ignoreColorSpace = false) { + getBytes(length, decoderOptions = null) { const pos = this.pos; let end; if (length) { this.ensureBuffer(pos + length); end = pos + length; while (!this.eof && this.bufferLength < end) { - this.readBlock(ignoreColorSpace); + this.readBlock(decoderOptions); } const bufEnd = this.bufferLength; if (end > bufEnd) { @@ -3170,13 +7832,20 @@ class DecodeStream extends BaseStream { } } else { while (!this.eof) { - this.readBlock(ignoreColorSpace); + this.readBlock(decoderOptions); } end = this.bufferLength; } this.pos = end; return this.buffer.subarray(pos, end); } + async getImageData(length, decoderOptions = null) { + if (!this.canAsyncDecodeImageFromBuffer) { + return this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, decoderOptions); + } reset() { this.pos = 0; } @@ -3245,6 +7914,12 @@ class StreamsSequenceStream extends DecodeStream { ;// CONCATENATED MODULE: ./src/core/ascii_85_stream.js + + + + + + class Ascii85Stream extends DecodeStream { constructor(str, maybeLength) { if (maybeLength) { @@ -3362,6 +8037,12 @@ class AsciiHexStream extends DecodeStream { ;// CONCATENATED MODULE: ./src/core/ccitt.js + + + + + + const ccittEOL = -2; const ccittEOF = -1; const twoDimPass = 0; @@ -3913,6 +8594,14 @@ class CCITTFaxStream extends DecodeStream { ;// CONCATENATED MODULE: ./src/core/flate_stream.js + + + + + + + + const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); @@ -3940,6 +8629,43 @@ class FlateStream extends DecodeStream { this.codeSize = 0; this.codeBuf = 0; } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + return data?.subarray(0, length) || this.getBytes(length); + } + async asyncGetBytes() { + this.str.reset(); + const bytes = this.str.getBytes(); + try { + const { + readable, + writable + } = new DecompressionStream("deflate"); + const writer = writable.getWriter(); + writer.write(bytes); + writer.close(); + const chunks = []; + let totalLength = 0; + for await (const chunk of readable) { + chunks.push(chunk); + totalLength += chunk.byteLength; + } + const data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; + } + return data; + } catch { + this.str = new Stream(bytes, 2, bytes.length, this.str.dict); + this.reset(); + return null; + } + } + get isAsync() { + return true; + } getBits(bits) { const str = this.str; let codeSize = this.codeSize; @@ -4015,9 +8741,14 @@ class FlateStream extends DecodeStream { this.eof = true; } readBlock() { - let buffer, len; + let buffer, hdr, len; const str = this.str; - let hdr = this.getBits(3); + try { + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); + return; + } if (hdr & 1) { this.eof = true; } @@ -4487,6 +9218,13 @@ class ArithmeticDecoder { + + + + + + + class Jbig2Error extends BaseException { constructor(msg) { super(msg, "Jbig2Error"); @@ -6239,6 +10977,7 @@ class Jbig2Image { + class Jbig2Stream extends DecodeStream { constructor(stream, maybeLength, params) { super(maybeLength); @@ -6252,9 +10991,13 @@ class Jbig2Stream extends DecodeStream { } ensureBuffer(requested) {} readBlock() { + this.decodeImage(); + } + decodeImage(bytes) { if (this.eof) { - return; + return this.buffer; } + bytes ||= this.bytes; const jbig2Image = new Jbig2Image(); const chunks = []; if (this.params instanceof Dict) { @@ -6269,9 +11012,9 @@ class Jbig2Stream extends DecodeStream { } } chunks.push({ - data: this.bytes, + data: bytes, start: 0, - end: this.bytes.length + end: bytes.length }); const data = jbig2Image.parseChunks(chunks); const dataLength = data.length; @@ -6281,11 +11024,21 @@ class Jbig2Stream extends DecodeStream { this.buffer = data; this.bufferLength = dataLength; this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; } } ;// CONCATENATED MODULE: ./src/shared/image_utils.js + + + + + + function convertToRGBA(params) { switch (params.kind) { case ImageKind.GRAYSCALE_1BPP: @@ -6395,6 +11148,13 @@ function grayToRGBA(src, dest) { + + + + + + + class JpegError extends BaseException { constructor(msg) { super(msg, "JpegError"); @@ -7468,15 +12228,14 @@ class JpegImage { + + + + + + class JpegStream extends DecodeStream { constructor(stream, maybeLength, params) { - let ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xff) { - stream.skip(-1); - break; - } - } super(maybeLength); this.stream = stream; this.dict = stream.dict; @@ -7488,8 +12247,20 @@ class JpegStream extends DecodeStream { } ensureBuffer(requested) {} readBlock() { + this.decodeImage(); + } + decodeImage(bytes) { if (this.eof) { - return; + return this.buffer; + } + bytes ||= this.bytes; + for (let i = 0, ii = bytes.length - 1; i < ii; i++) { + if (bytes[i] === 0xff && bytes[i + 1] === 0xd8) { + if (i > 0) { + bytes = bytes.subarray(i); + } + break; + } } const jpegOptions = { decodeTransform: undefined, @@ -7520,7 +12291,7 @@ class JpegStream extends DecodeStream { } } const jpegImage = new JpegImage(jpegOptions); - jpegImage.parse(this.bytes); + jpegImage.parse(bytes); const data = jpegImage.getData({ width: this.drawWidth, height: this.drawHeight, @@ -7531,15 +12302,32 @@ class JpegStream extends DecodeStream { this.buffer = data; this.bufferLength = data.length; this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; } } +// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js +var web_dom_exception_stack = __webpack_require__(4979); ;// CONCATENATED MODULE: ./external/openjpeg/openjpeg.js + + + + + + + + + + + var OpenJPEG = (() => { var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; return function (moduleArg = {}) { var moduleRtn; - var Module = Object.assign({}, moduleArg); + var Module = moduleArg; var readyPromiseResolve, readyPromiseReject; var readyPromise = new Promise((resolve, reject) => { readyPromiseResolve = resolve; @@ -7547,11 +12335,15 @@ var OpenJPEG = (() => { }); var ENVIRONMENT_IS_WEB = true; var ENVIRONMENT_IS_WORKER = false; - Module.decode = function (bytes, ignoreColorSpace) { + Module.decode = function (bytes, { + numComponents = 4, + isIndexedColormap = false, + smaskInData = false + }) { const size = bytes.length; const ptr = Module._malloc(size); Module.HEAPU8.set(bytes, ptr); - const ret = Module._jp2_decode(ptr, size, ignoreColorSpace ? 1 : 0); + const ret = Module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData); Module._free(ptr); if (ret) { const { @@ -7607,18 +12399,14 @@ var OpenJPEG = (() => { }; } readAsync = (url, onload, onerror) => { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = () => { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - onload(xhr.response); - return; + fetch(url, { + credentials: "same-origin" + }).then(response => { + if (response.ok) { + return response.arrayBuffer(); } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); + return Promise.reject(new Error(response.status + " : " + response.url)); + }).then(onload, onerror); }; } else {} var out = Module["print"] || console.log.bind(console); @@ -7718,7 +12506,7 @@ var OpenJPEG = (() => { var dataURIPrefix = "data:application/octet-stream;base64,"; var isDataURI = filename => filename.startsWith(dataURIPrefix); function findWasmBinary() { - var f = "data:application/octet-stream;base64,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dEGwnQFqKAIAIQICfiAAKQMIIg5CAFMEQEEMIAFBAWogAUELThshBCADQQFrIQNBfyACdEF/c0EBdCEBQgEMAQsgAUEBa0EAIAFBAUobIQQgDkE/IAJrrYinQX8gAnRBf3NxQQF0QQFyIQEgAyACQQFqIgJrIQMgAq0LIQ8gACADNgIQIAAgBDYCHCAAIA4gD4Y3AwggACAAKQMoQv//////QIMgAa1CI4aENwMoQQYhBSADQQZIDQAgACgCHCIBQQJ0QbCdAWooAgAhAgJ+IAApAwgiDkIAUwRAQQwgAUEBaiABQQtOGyEEIANBAWshA0F/IAJ0QX9zQQF0IQFCAQwBCyABQQFrQQAgAUEBShshBCAOQT8gAmutiKdBfyACdEF/c3FBAXRBAXIhASADIAJBAWoiAmshAyACrQshDyAAIAM2AhAgACAENgIcIAAgDiAPhjcDCCAAIAApAyhC////////QIMgAa1CKoaENwMoQQchBSADQQZIDQAgACgCHCIBQQJ0QbCdAWooAgAhAgJ+IAApAwgiDkIAUwRAQQwgAUEBaiABQQtOGyEEIANBAWshA0F/IAJ0QX9zQQF0IQFCAQwBCyABQQFrQQAgAUEBShshBCAOQT8gAmutiKdBfyACdEF/c3FBAXRBAXIhASADIAJBAWoiAmshAyACrQshDyAAIAM2AhAgACAENgIcIAAgDiAPhjcDCCAAIAApAyhC/////////0CDIAGtQjGGhDcDKEEIIQULIAAgBUEBazYCICAAIAApAygiDkIHiDcDKCAOp0H/AHELIgEBfyAABEAgACgCDCIBBEAgARAJIABBADYCDAsgABAJCwuFAQIFfwF+AkAgAEKAgICAEFQEQCAAIQcMAQsDQCABQQFrIgEgAEIKgCIHQvYBfiAAfKdBMHI6AAAgAEL/////nwFWIQUgByEAIAUNAAsLIAenIgIEQANAIAFBAWsiASACQQpuIgNB9gFsIAJqQTByOgAAIAJBCUshBiADIQIgBg0ACwsgAQv54gEEen8Gewh+AX0jAEEQayJOJAACQCAALQAIQYABcUUNACAAKALMASABRw0AIAAoApwBIAFBjCxsaiJPKALcKyIVRQRAIE8QKQwBCyAAKALIARogACgC0AEhGSAAKAJMIgdFBEAgACgCSCEHCyAHKAIAIQYgBygCBCELIAco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AAACAAAA/a4BQQL9rAH9sQH9CwIAIAEiBkEBaiIBIA9HDQALIA8hBwsgByAbTg0AA0AgB0EDdCEBIAcgLEghBgJAIAdBAEwEQCA2KAIAIQogB0EATgRAIBQgAUECdCIBaiIyIDIoAgAgCiABIDZqIEUgBhsoAgBqQQJqQQJ1azYCACABICRqIgogCigCACAgKAIAIAEgIGogPCAGGygCAGpBAmpBAnVrNgIAIAEgKmoiCiAKKAIAIB8oAgAgASAfaiA6IAYbKAIAakECakECdWs2AgAgQygCACABIENqICYgBhsoAgBqQQJqIQYgASApaiEBDAILIBQgAUECdCIBaiIGIAYoAgAgCkEBdEECakECdWs2AgAgASAkaiIGIAYoAgAgFCgCFEEBdEECakECdWs2AgAgASAqaiIGIAYoAgAgFCgCGEEBdEECakECdWs2AgAgASApaiEBIBQoAhxBAXRBAmohBgwBCyAUIAcgLCAGG0EDdEEEa0ECdCIKaigCACEyIAZFBEAgFCABQQJ0IgFqIgYgBigCACAyIEUoAgBqQQJqQQJ1azYCACABICRqIgYgBigCACAKICRqKAIAIDwoAgBqQQJqQQJ1azYCACABICpqIgYgBigCACAKICpqKAIAIDooAgBqQQJqQQJ1azYCACABIClqIQEgCiApaigCACAmKAIAakECaiEGDAELIBQgAUECdCIBaiIGIAYoAgAgMiAGKAIQakECakECdWs2AgAgASAkaiIGIAYoAgAgCiAkaigCACAGKAIQakECakECdWs2AgAgASAqaiIGIAYoAgAgCiAqaigCACAGKAIQakECakECdWs2AgAgCiApaigCACABIClqIgEoAhBqQQJqIQYLIAEgASgCACAGQQJ1azYCACAHQQFqIgcgG0cNAAsLIA4gHE4NACAMIA4iASIHSgRAA0AgFCABQQV0aiIHIAf9AAIgIAf9AAIA/a4BQQH9rAEgB/0AAhD9rgH9CwIQIAFBAWoiASAMRw0ACyAMIQcLIAcgHE4NAANAIEMgB0EDdCIBQQJ0aiIyAn8gB0EASARAIBQoAgAhBiAHQX9HBEAgNiABQQJ0IgFqIgogCigCACAGajYCACABICBqIgYgBigCACAkKAIAajYCACABIB9qIgEgASgCACAqKAIAajYCACApKAIADAILIDYgAUECdCIB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LQAAQYD+A3I2AgwLIABBADYCEEEBCwtJAQF/AkBBAUEsEAwiAQRAIAFBADYCEAJAIABBAEwEQCABQQFBCBAMIgA2AiQgAEUNAQwDCyABQQA2AgwLIAEQCQtBACEBCyABC34CAX8BfiAAvSIDQjSIp0H/D3EiAkH/D0cEfCACRQRAIAEgAEQAAAAAAAAAAGEEf0EABSAARAAAAAAAAPBDoiABEF8hACABKAIAQUBqCzYCACAADwsgASACQf4HazYCACADQv////////+HgH+DQoCAgICAgIDwP4S/BSAACwuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGUzwEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTGAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASEGIAQhAiAFIQMgBkEwayIBQQpJDQALIAILtBQCFX8BfiMAQUBqIggkACAIIAE2AjwgCEEnaiEWIAhBKGohEQJAAkACQAJAA0BBACEHA0AgASENIAcgDkH/////B3NKDQIgByAOaiEOAkACQAJAAkAgASIHLQAAIgsEQANAAkACQCALQf8BcSIBRQRAIAchAQwBCyABQSVHDQEgByELA0AgCy0AAUElRwRAIAshAQwCCyAHQQFqIQcgCy0AAiEZIAtBAmoiASELIBlBJUYNAAsLIAcgDWsiByAOQf////8HcyIXSg0JIAAEQCAAIA0gBxARCyAHDQcgCCABNgI8IAFBAWohB0F/IRACQCABLAABQTBrIglBCUsNACABLQACQSRHDQAgAUEDaiEHQQEhEiAJIRALIAggBzYCPEEAIQwCQCAHLAAAIgtBIGsiAUEfSwRAIAchCQwBCyAHIQlBASABdCIBQYnRBHFFDQADQCAIIAdBAWoiCTYCPCABIAxyIQwgBywAASILQSBrIgFBIE8NASAJIQdBASABdCIBQYnRBHENAAsLAkAgC0EqRgRAAn8CQCAJLAABQTBrIgFBCUsNACAJLQACQSRHDQACfyAARQRAIAQgAUECdGpBCjYCAEEADAELIAMgAUEDdGooAgALIQ8gCUEDaiEBQQEMAQsgEg0GIAlBAWohASAARQRAIAggATYCPEEAIRJBACEPDAMLIAIgAigCACIHQQRqNgIAIAcoAgAhD0EACyESIAggATYCPCAPQQBODQFBACAPayEPIAxBgMAAciEMDAELIAhBPGoQYiIPQQBIDQogCCgCPCEBC0EAIQdBfyEKAn9BACABLQAAQS5HDQAaIAEtAAFBKkYEQAJ/AkAgASwAAkEwayIJQQlLDQAgAS0AA0EkRw0AIAFBBGohAQJ/IABFBEAgBCAJQQJ0akEKNgIAQQAMAQsgAyAJQQN0aigCAAsMAQsgEg0GIAFBAmohAUEAIABFDQAaIAIgAigCACIJQQRqNgIAIAkoAgALIQogCCABNgI8IApBAE4MAQsgCCABQQFqNgI8IAhBPGoQYiEKIAgoAjwhAUEBCyETA0AgByEUQRwhCSABIhgsAAAiB0H7AGtBRkkNCyABQQFqIQEgByAUQTpsakHPwAFqLQAAIgdBAWtBCEkNAAsgCCABNgI8AkAgB0EbRwRAIAdFDQwgEEEATgRAIABFBEAgBCAQQQJ0aiAHNgIADAwLIAggAyAQQQN0aikDADcDMAwCCyAARQ0IIAhBMGogByACIAYQYQwBCyAQQQBODQtBACEHIABFDQgLIAAtAABBIHENCyAMQf//e3EiCyAMIAxBgMAAcRshDEEAIRBBsAghFSARIQkCQAJAAn8CQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIBgsAAAiB0FTcSAHIAdBD3FBA0YbIAcgFBsiB0HYAGsOIQQWFhYWFhYWFhAWCQYQEBAWBhYWFhYCBQMWFgoWARYWBAALAkAgB0HBAGsOBxAWCxYQEBAACyAHQdMARg0LDBULIAgpAzAhHEGwCAwFC0EAIQcCQAJAAkACQAJAAkACQCAUQf8BcQ4IAAECAwQcBQYcCyAIKAIwIA42AgAMGwsgCCgCMCAONgIADBoLIAgoAjAgDqw3AwAMGQsgCCgCMCAOOwEADBgLIAgoAjAgDjoAAAwXCyAIKAIwIA42AgAMFgsgCCgCMCAOrDcDAAwVC0EIIAogCkEITRshCiAMQQhyIQxB+AAhBwsgESEBIAgpAzAiHEIAUgRAIAdBIHEhDQNAIAFBAWsiASAcp0EPcUHgxAFqLQAAIA1yOgAAIBxCD1YhGiAcQgSIIRwgGg0ACwsgASENIAgpAzBQDQMgDEEIcUUNAyAHQQR2QbAIaiEVQQIhEAwDCyARIQEgCCkDMCIcQgBSBEADQCABQQFrIgEgHKdBB3FBMHI6AAAgHEIHViEbIBxCA4ghHCAbDQALCyABIQ0gDEEIcUUNAiAKIBEgAWsiAUEBaiABIApIGyEKDAILIAgpAzAiHEIAUwRAIAhCACAcfSIcNwMwQQEhEEGwCAwBCyAMQYAQcQRAQQEhEEGxCAwBC0GyCEGwCCAMQQFxIhAbCyEVIBwgERAjIQ0LIBMgCkEASHENESAMQf//e3EgDCATGyEMAkAgCCkDMCIcQgBSDQAgCg0AIBEhDUEAIQoMDgsgCiAcUCARIA1raiIBIAEgCkgbIQoMDQsgCCkDMCEcDAsLAn9B/////wcgCiAKQf////8HTxsiDCIHQQBHIQkCQAJAAkAgCCgCMCIBQYQMIAEbIg0iAUEDcUUNACAHRQ0AA0AgAS0AAEUNAiAHQQFrIgdBAEchCSABQQFqIgFBA3FFDQEgBw0ACwsgCUUNAQJAIAEtAABFDQAgB0EESQ0AA0BBgIKECCABKAIAIglrIAlyQYCBgoR4cUGAgYKEeEcNAiABQQRqIQEgB0EEayIHQQNLDQALCyAHRQ0BCwNAIAEgAS0AAEUNAhogAUEBaiEBIAdBAWsiBw0ACwtBAAsiASANayAMIAEbIgEgDWohCSAKQQBOBEAgCyEMIAEhCgwMCyALIQwgASEKIAktAAANDwwLCyAIKQMwIhxCAFINAUIAIRwMCQsgCgRAIAgoAjAMAgtBACEHIABBICAPQQAgDBAUDAILIAhBADYCDCAIIBw+AgggCCAIQQhqIgc2AjBBfyEKIAcLIQtBACEHA0ACQCALKAIAIg1FDQAgCEEEaiANEGAiDUEASA0PIA0gCiAHa0sNACALQQRqIQsgByANaiIHIApJDQELC0E9IQkgB0EASA0MIABBICAPIAcgDBAUIAdFBEBBACEHDAELQQAhCSAIKAIwIQsDQCALKAIAIg1FDQEgCEEEaiIKIA0QYCINIAlqIgkgB0sNASAAIAogDRARIAtBBGohCyAHIAlLDQALCyAAQSAgDyAHIAxBgMAAcxAUIA8gByAHIA9IGyEHDAgLIBMgCkEASHENCUE9IQkgACAIKwMwIA8gCiAMIAcgBRETACIHQQBODQcMCgsgBy0AASELIAdBAWohBwwACwALIAANCSASRQ0DQQEhBwNAIAQgB0ECdGooAgAiAARAIAMgB0EDdGogACACIAYQYUEBIQ4gB0EBaiIHQQpHDQEMCwsLQQEhDiAHQQpPDQkDQCAEIAdBAnRqKAIADQEgB0EBaiIHQQpHDQALDAkLQRwhCQwGCyAIIBw8ACdBASEKIBYhDSALIQwLIAogCSANayILIAogC0obIgogEEH/////B3NKDQNBPSEJIA8gCiAQaiIBIAEgD0gbIgcgF0oNBCAAQSAgByABIAwQFCAAIBUgEBARIABBMCAHIAEgDEGAgARzEBQgAEEwIAogC0EAEBQgACANIAsQESAAQSAgByABIAxBgMAAcxAUIAgoAjwhAQwBCwsLQQAhDgwDC0E9IQkLQZTGASAJNgIAC0F/IQ4LIAhBQGskACAOC6gCAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEA4aIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEEGNBAEgNACAAKAJMQQBIIQggACAAKAIAIgdBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABA3DQEaCyAAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEGMLIQEgBgR/IABBAEEAIAAoAiQRAAAaIABBADYCMCAAIAY2AiwgAEEANgIcIAAoAhQaIABCADcDEEEABSABCxogACAAKAIAIAdBIHFyNgIAIAgNAAsgBUHQAWokAAsnAQF/QRwhAyABQQNxBH9BHAUgACABIAIQGyIANgIAQQBBMCAAGwsL/QMBBX8Cf0HwxAEoAgAiAiAAQQdqQXhxIgFBB2pBeHEiA2ohAAJAIANBACAAIAJNG0UEQCAAPwBBEHRNDQEgABABDQELQZTGAUEwNgIAQX8MAQtB8MQBIAA2AgAgAgsiAkF/RwRAIAEgAmoiAEEEa0EQNgIAIABBEGsiA0EQNgIAAkACf0GgzgEoAgAiAQR/IAEoAggFQQALIAJGBEAgAiACQQRrKAIAQX5xayIEQQRrKAIAIQUgASAANgIIIAQgBUF+cWsiACAAKAIAakEEay0AAEEBcQRAIAAoAgQiASAAKAIIIgQ2AgggBCABNgIEIAAgAyAAayIBNgIADAMLIAJBEGsMAQsgAkEQNgIAIAIgADYCCCACIAE2AgQgAkEQNgIMQaDOASACNgIAIAJBEGoLIgAgAyAAayIBNgIACyAAIAFBfHFqQQRrIAFBAXI2AgAgAAJ/IAAoAgBBCGsiAUH/AE0EQCABQQN2QQFrDAELIAFBHSABZyIDa3ZBBHMgA0ECdGtB7gBqIAFB/x9NDQAaQT8gAUEeIANrdkECcyADQQF0a0HHAGoiASABQT9PGwsiAUEEdCIDQaDGAWo2AgQgACADQajGAWoiAygCADYCCCADIAA2AgAgACgCCCAANgIEQajOAUGozgEpAwBCASABrYaENwMACyACQX9HC70BAQJ/AkAgACgCTCIBQQBOBEAgAUUNAUHMzgEoAgAgAUH/////A3FHDQELAkAgACgCUEEKRg0AIAAoAhQiASAAKAIQRg0AIAAgAUEBajYCFCABQQo6AAAPCyAAEGgPCyAAQcwAaiIBIAEoAgAiAkH/////AyACGzYCAAJAAkAgACgCUEEKRg0AIAAoAhQiAiAAKAIQRg0AIAAgAkEBajYCFCACQQo6AAAMAQsgABBoCyABKAIAGiABQQA2AgALfAECfyMAQRBrIgEkACABQQo6AA8CQAJAIAAoAhAiAgR/IAIFIAAQNw0CIAAoAhALIAAoAhQiAkYNACAAKAJQQQpGDQAgACACQQFqNgIUIAJBCjoAAAwBCyAAIAFBD2pBASAAKAIkEQAAQQFHDQAgAS0ADxoLIAFBEGokAAuwAgECfyAABEAgACgCABAxIABBADYCACAAKAJIIgEEQCABEAkgAEEANgJICyAAKAJEIgEEQCABEAkgAEEANgJECyAAKAJsIgEEQCABEAkgAEEANgJsCyAAKAJ0IgEEQCABKAIAIgIEQCACEAkgACgCdCIBQQA2AgALIAEQCSAAQQA2AnQLIAAoAngiAQRAIAEoAgwiAgRAIAIQCSAAKAJ4IgFBADYCDAsgASgCBCICBEAgAhAJIAAoAngiAUEANgIECyABKAIIIgIEQCACEAkgACgCeCIBQQA2AggLIAEoAgAiAgRAIAIQCSAAKAJ4IgFBADYCAAsgARAJIABBADYCeAsgACgCBCIBBEAgARAtIABBADYCBAsgACgCCCIBBEAgARAtIABBADYCCAsgABAJCwuGGwIefwV7IwBB8AFrIgkkAEEBIQ4CQCAAKAIAKAI8DQAgACgCgAENAAJAAkAgACgCdCIIRQRAIAAoAnghBAwBCyABKAIQIQMgCC8BBCEGAkAgACgCeCIERQ0AIAQoAgxFDQAgBC0AEiEDCwJAIAYEQCAIKAIAIQgDQCAIIAVBBmxqIgovAQAiByADTwRAIAkgAzYCtAEgCSAHNgKwASACQQFBsOYAIAlBsAFqEAhBACEODAYLAkAgCi8BBCIKRQ0AIApB//8DRg0AIApBAWsiCiADSQ0AIAkgAzYCpAEgCSAKNgKgASACQQFBsOYAIAlBoAFqEAhBACEODAYLIAVBAWoiBSAGRw0ACwwBCyADDQIMAQsDQCADQQFrIQNBACEFA0AgCCAFQQZsai8BACADRwRAIAVBAWoiBSAGRw0BDAQLCyADDQALCwJAIARFDQAgBCgCDCIKRQ0AAkACQCAELQASIggEQEEAIQVBASEHA0AgASgCECIDIAogBUECdGovAQAiBE0EQCAJIAM2ApQBIAkgBDYCkAEgAkEBQbDmACAJQZABahAIQQAhBwsgBUEBaiIFIAhHDQALIAhBBBAMIgNFDQFBACEFA0ACQCAKIAVBAnRqIgQtAAIiBkECTwRAIAkgBjYCRCAJIAU2AkAgAkEBQdvZACAJQUBrEAhBACEHDAELIAggBC0AAyIETQRAIAkgBDYCgAEgAkEBQaPZACAJQYABahAIQQAhBwwBCyADIARBAnRqIQsCQCAGQQFHIgwNACALKAIARQ0AIAkgBDYCUCACQQFBl9UAIAlB0ABqEAhBACEHDAELAkAgBg0AIARFDQAgCSAENgJkIAkgBTYCYCACQQFBmtgAIAlB4ABqEAhBACEHDAELAkAgDA0AIAQgBUYNACAJIAQ2AnggCSAFNgJ0IAkgBTYCcCACQQFBvtgAIAlB8ABqEAhBACEHDAELIAtBATYCAAsgBUEBaiIFIAhHDQALQQAhBQNAAkACQCADIAVBAnQiBGooAgBFBEAgBCAKai0AAg0BCyAFQQFqIgUgCEcNAiAHRQ0BIAEoAhBBAUcNBUEAIQUDQCADIAVBAnRqKAIABEAgCCAFQQFqIgVHDQEMBwsLQQAhByACQQJB78QAQQAQCCAIQRBPBEAgCEHwAXEhB0EAIQQDQCAKIARBAnRqIgZBAToAAiAGIAQ6AAMgBkEBOgA+IAZBAToAOiAGQQE6ADYgBkEBOgAyIAZBAToALiAGQQE6ACogBkEBOgAmIAZBAToAIiAGQQE6AB4gBkEBOgAaIAZBAToAFiAGQQE6ABIgBkEBOgAOIAZBAToACiAGQQE6AAYgBiAEQQFyOgAHIAYgBEEPcjoAPyAGIARBDnI6ADsgBiAEQQ1yOgA3IAYgBEEMcjoAMyAGIARBC3I6AC8gBiAEQQpyOgArIAYgBEEJcjoAJyAGIARBCHI6ACMgBiAEQQdyOgAfIAYgBEEGcjoAGyAGIARBBXI6ABcgBiAEQQRyOgATIAYgBEEDcjoADyAGIARBAnI6AAsgBEEQaiIEIAdHDQALIAcgCEYNBgsDQCAKIAdBAnRqIgQgBzoAAyAEQQE6AAIgB0EBaiIHIAhHDQALDAULIAkgBTYCMCACQQFBo9IAIAlBMGoQCEEAIQcgBUEBaiIFIAhHDQELCyADEAlBACEODAULIAhBBBAMIgMNAQtBACEOIAJBAUGa2wBBABAIDAMLIAMQCQsCQCAAKAJ4IgNFDQAgAygCDCIPRQRAIAMoAgQQCSAAKAJ4KAIIEAkgACgCeCgCABAJIAAoAngiAygCDCIEBH8gBBAJIAAoAngFIAMLEAkgAEEANgJ4DAELIAEoAhghDQJAAkAgAy0AEiIKBEAgAygCACEUIAMoAgQhBiADKAIIIQhBACEFAkADQCANIA8gBUECdGovAQBBNGxqKAIsBEAgCiAFQQFqIgVHDQEMAgsLIAkgBTYCICACQQFB0ucAIAlBIGoQCEEAIQ4MBgsgCkE0bBANIgtFDQFBACEFA0AgDyAFQQJ0aiIDLwEAIQcgCyADLQACBH8gAy0AAwUgBQtBNGxqIgQgDSAHQTRsaiID/QACAP0LAgAgBCADKAIwNgIwIAQgA/0AAiD9CwIgIAQgA/0AAhD9CwIQIAsgBUE0bGoiBCADKAIIIAMoAgxsQQJ0EBYiAzYCLCADRQRAIAVB//8DcSIABEADQCALIABBAWsiAEE0bGooAiwQCSAADQALCyALEAlBACEOIAJBAUGe5wBBABAIDAcLIAQgBSAIai0AADYCGCAEIAUgBmotAAA2AiAgBUEBaiIFIApHDQALIAAoAngvARAiEEEBayESA0AgCyATQTRsaiIDKAIMIAMoAghsIQYgDSAPIBNBAnRqIgQvAQBBNGxqKAIsIQgCQCAELQACRQRAIAZFDQEgAygCLCEFQQAhB0EAIQQCQCAGQQRJDQAgBSAIa0EQSQ0AIAZBfHEhBEEAIQMDQCAFIANBAnQiDGogCCAMav0AAgD9CwIAIANBBGoiAyAERw0ACyAEIAZGDQILIAQhAyAGQQNxIgwEQANAIAUgA0ECdCIRaiAIIBFqKAIANgIAIANBAWohAyAHQQFqIgcgDEcNAAsLIAQgBmtBfEsNAQNAIAUgA0ECdCIEaiAEIAhqKAIANgIAIAUgBEEEaiIHaiAHIAhqKAIANgIAIAUgBEEIaiIHaiAHIAhqKAIANgIAIAUgBEEMaiIEaiAEIAhqKAIANgIAIANBBGoiAyAGRw0ACwwBCyAGRQ0AIBQgBC0AAyIDQQJ0aiEEIAsgA0E0bGooAiwhBUEAIQMgBkEBRwRAIAZBfnEhFUEAIQwDQCAFIANBAnQiB2ogBCAHIAhqKAIAIhEgEiAQIBFKG0EAIBFBAE4bIApsQQJ0aigCADYCACAFIAdBBHIiB2ogBCAHIAhqKAIAIgcgEiAHIBBIG0EAIAdBAE4bIApsQQJ0aigCADYCACADQQJqIQMgDEECaiIMIBVHDQALCyAGQQFxRQ0AIAUgA0ECdCIDaiAEIAMgCGooAgAiAyASIAMgEEgbQQAgA0EAThsgCmxBAnRqKAIANgIACyATQQFqIhMgCkcNAAsMAgsgCkE0bBANIgsNAQtBACEOIAJBAUGe5wBBABAIDAMLIAEoAhAiAwRAQQAhBQNAIA0gBUE0bGooAiwiBARAIAQQCQsgBUEBaiIFIANHDQALCyANEAkgASAKNgIQIAEgCzYCGAsgACgCdCIFRQ0BIAUoAgAhByAFLwEEIgsEQCAHQSpqIRIgB0EkaiETIAdBHmohESAHQRhqIRQgB0ESaiEVIAdBDGohFiAHQQZqIRcgC0ECayEYQQAhBUEBIQQDQAJAIAEoAhAiAyAHIAVBBmxqIg0vAQAiBk0EQCAJIAM2AhQgCSAGNgIQIAJBAkHMNyAJQRBqEAgMAQsgDS8BBCIIQQFqQf//A3FBAU0EQCABKAIYIAZBNGxqIA0vAQI7ATAMAQsgCEEBayIKQf//A3EiDyADTwRAIAkgAzYCBCAJIA82AgAgAkECQaM3IAkQCAwBCwJAIAYgD0YNACANLwECDQAgCSABKAIYIgggBkE0bGoiAygCMDYC6AEgCSAD/QACIP0LA9gBIAkgA/0AAhD9CwPIASAJIAP9AAIA/QsDuAEgAyAIIA9BNGwiDGoiCCkCCDcCCCADIAgpAhA3AhAgAyAIKQIYNwIYIAMgCCkCIDcCICADIAgpAig3AiggAyAIKAIwNgIwIAMgCCkCADcCACABKAIYIAxqIgMgCf0AA7gB/QsCACADIAn9AAPYAf0LAiAgAyAJ/QADyAH9CwIQIAMgCSgC6AE2AjAgBUEBaiALTw0AIAQhCCAYIAVrQf//A3EiA0EHTwRAIAQgA0EBaiIZQfj/B3EiEGohCCAK/RAhJCAG/RAhI0EAIQwDQCAjICQgEiAEIAxqQQZsIgNqIhogAyATaiIbIAMgEWoiHCADIBRqIh0gAyAVaiIeIAMgFmoiHyADIBdqIiAgAyAHaiID/QgBAP1VAQAB/VUBAAL9VQEAA/1VAQAE/VUBAAX9VQEABv1VAQAHIiEgI/0uICEgJP0tIiX9Tv1SISIgISAj/S0gJf1QIiH9GQBBAXEEQCADICL9WQEAAAsgIf0ZAUEBcQRAICAgIv1ZAQABCyAh/RkCQQFxBEAgHyAi/VkBAAILICH9GQNBAXEEQCAeICL9WQEAAwsgIf0ZBEEBcQRAIB0gIv1ZAQAECyAh/RkFQQFxBEAgHCAi/VkBAAULICH9GQZBAXEEQCAbICL9WQEABgsgIf0ZB0EBcQRAIBogIv1ZAQAHCyAMQQhqIgwgEEcNAAsgECAZRg0BCwNAIAohAwJAIAYgByAIQQZsaiIMLwEAIhBHBEAgBiEDIA8gEEcNAQsgDCADOwEACyALIAhBAWoiCEH//wNxRw0ACwsgASgCGCAGQTRsaiANLwECOwEwCyAEQQFqIQQgBUEBaiIFIAtHDQALIAAoAnQiBSgCACEHCyAHBH8gBxAJIAAoAnQFIAULEAkgAEEANgJ0DAELQQAhDiACQQFBosUAQQAQCAsgCUHwAWokACAOC+kBAQZ/IwBBIGsiBCQAAn8CQCAAKAI8IgMEQEEBIQUDQCAAKAJMKAIYIAAoAkAgAkECdGooAgAiBkE0bGooAixFBEAgBCAGNgIQIAFBAkHaOSAEQRBqEAhBACEFIAAoAjwhAwsgAkEBaiICIANJDQALDAELQQEhBUEBIAAoAkwiAygCEEUNARoDQCADKAIYIAJBNGxqKAIsRQRAIAQgAjYCACABQQJB2jkgBBAIQQAhBSAAKAJMIQMLIAJBAWoiAiADKAIQSQ0ACwtBASAFDQAaIAFBAUG/FUEAEAhBAAshByAEQSBqJAAgBwsEAEF/C4YHAhZ/An4gACgCGCIQKAIQRQRAQQEPCyAQKAIYIQ0gACgCFCgCACgCFCELA0AgASANKAIkIgI2AiQgCygCHCIGIAJBmAFsaiEDAkACQAJ/IAAoAkAiEQRAIAYgCygCGEGYAWxqIgJBkAFrKAIAIAJBmAFrKAIAayEMIANBDGohBiADQQRqIQQgAygCCCECIAMoAgAhBUEkDAELIANBlAFqIQYgA0GMAWohBCADKAKQASICIAMoAogBIgVrIQxBNAsgC2ooAgAiEkUNACAEKAIAIQcgBigCACEJIAIgBWshBiABKAIIIgNCfyABNQIoIhiGQn+FIhkgATUCEHwgGIinIghqIQQCfyAFIAhLBEAgBSAIayEOQQAhCEEAIAIgBE0NARogBiAEIAVrIgZrDAELIAggBWshCCACIARNBEAgBiAIayEGQQAhDkEADAELQQAhDiADIQYgAiAEawshFSAJIAdrIQIgASgCDCIEIBkgATUCFHwgGIinIgpqIQUCfyAHIApLBEAgByAKayEPQQAhCkEAIAUgCU8NARogAiAFIAdrIgJrDAELIAogB2shCiAFIAlPBEAgAiAKayECQQAhD0EADAELQQAhDyAEIQIgCSAFawshB0EAIQUgCEEASA0BIApBAEgNASAVQQBIDQEgB0EASA0BIAZBAEgNASACQQBIDQEgAyAPbCAOaiEHIAogDGwgCGohCQJAAkACQCABKAIsIggNACAJDQAgBw0AIAMgDEcNACADIAZHDQAgAiAERw0BIAEgC0EkQTQgERtqIgIoAgA2AiwgAkEANgIADAMLIAgNAQsgBEUNAiAErSADrX5CIIinDQIgAyAEbCIDQf////8DSw0CIAEgA0ECdBAWIgM2AiwgA0UNAiAGIAEoAggiBEYgASgCDCIFIAJGcQ0AIANBACAEIAVsQQJ0EA4aCyACRQ0AIAJBAXEhFyAGQQJ0IQYgASgCLCAHQQJ0aiEEIBIgCUECdGohBSACQQFHBEAgAkH+////B3EhB0EAIQIDQCAEIAUgBhALIRYgBSAMQQJ0IglqIgggCWohBSAWIAEoAghBAnRqIAggBhALIAEoAghBAnRqIQQgAkECaiICIAdHDQALCyAXRQ0AIAQgBSAGEAsaCyALQcwAaiELIA1BNGohDSABQTRqIQFBASEFIBRBAWoiFCAQKAIQSQ0BCwsgBQvVEgIJfwx+IwBBoAFrIgUkAAJAIAJBI00EQEEAIQIgA0EBQbYuQQAQCAwBCyACQSRrIgIgAkEDbiIJQQNsRwRAQQAhAiADQQFBti5BABAIDAELIAAoAkghBiABIAVBnAFqIgJBAhAKIAAgBSgCnAE7AVAgAUECaiAGQQhqQQQQCiABQQZqIAZBDGpBBBAKIAFBCmogBkEEEAogAUEOaiAGQQRqQQQQCiABQRJqIABB3ABqQQQQCiABQRZqIABB4ABqQQQQCiABQRpqIABB1ABqQQQQCiABQR5qIABB2ABqQQQQCiABQSJqIAJBAhAKAkACQAJAIAUoApwBIgJBgIABTQRAIAYgAjYCECACIAlHBEAgBSAJNgKEASAFIAI2AoABIANBAUGh8AAgBUGAAWoQCEEAIQIMBQsgBigCBCICIAYoAgwiCEkgBigCCCILIAYoAgAiBEtxRQRAIAUgCK0gAq19NwN4IAUgC60gBK19NwNwIANBAUHr7AAgBUHwAGoQCEEAIQIMBQsgACgCXCIHQQAgACgCYCIKG0UEQCAFIAo2AgQgBSAHNgIAIANBAUGT8QAgBRAIQQAhAgwFCwJAAkAgACgCVCIMIARLDQBBfyAHIAxqIgcgByAMSRsgBE0NACAAKAJYIgcgAksNAEF/IAcgCmoiCiAHIApLGyACSw0BC0EAIQIgA0EBQdYUQQAQCAwFCwJAIAAoAuABDQAgACgC2AEiB0UNACAAKALcASIKRQ0AIAsgBGsiBCAHRiAIIAJrIgIgCkZxDQAgBSACNgJsIAUgBDYCaCAFIAo2AmQgBSAHNgJgIANBAUHT6AAgBUHgAGoQCEEAIQIMBQsgBiAJQTQQDCIENgIYIARFDQECQCAGKAIQRQ0AIAFBJGogBUGYAWoiAkEBEAogBCAFKAKYASIJQQd2Igo2AiAgBCAJQf8AcUEBaiIMNgIYIAAoAuABIQsgAUElaiACQQEQCiAEIAUoApgBNgIAIAFBJmogAkEBEAogBCAFKAKYASIINgIEQQAhAiAEKAIAIgdBgAJrQYF+SQRAQQAhCQwFC0EAIQkgCEGAAmtBgX5JDQQgBCgCGCIIQR9LDQMgBEEANgIkIAQgACgCoAE2AihBASEJIAYoAhBBAU0NAEEAIAogCxshCkEAIAwgCxshCyABQSdqIQEDQCABIAVBmAFqQQEQCiAEIAUoApgBIgdBB3YiCDYCVCAEIAdB/wBxQQFqIgc2AkwCQCAAKALgAQ0AIAAtALwBQQRxDQAgByALRiAIIApGcQ0AIAUgCDYCVCAFIAc2AlAgBSAJNgJMIAUgCjYCSCAFIAs2AkQgBSAJNgJAIANBAkHX7gAgBUFAaxAICyABQQFqIAVBmAFqIghBARAKIAQgBSgCmAE2AjQgAUECaiAIQQEQCiAEIAUoApgBIgg2AjggBCgCNCIHQYACa0GBfkkNBSAIQYACa0GAfk0NBSAEKAJMIghBIE8NBCABQQNqIQEgBEEANgJYIAQgACgCoAE2AlwgBEE0aiEEIAlBAWoiCSAGKAIQSQ0ACwtBACECIAAoAlwiCEUNBCAAKAJgIgtFDQQgACAIrSINQgF9Ig8gBigCCCAAKAJUIgdrrXwgDYCnIgE2AmggACALrSIOQgF9IhAgBigCDCAAKAJYIgprrXwgDoCnIgQ2AmwCQAJAIAFFDQAgBEUNAEH//wMgBG4gAU8NAQsgBSAENgIUIAUgATYCECADQQFBxekAIAVBEGoQCAwFCyABIARsIQkCQCAALQBEQQJxBEAgACAAKAIcIAdrIAhuNgIcIAAgACgCICAKayALbjYCICAAIA8gACgCJCAHa618IA2APgIkIAAgECAAKAIoIAprrXwgDoA+AigMAQsgACAENgIoIAAgATYCJCAAQgA3AhwLIAAgCUGMLBAMIgE2ApwBIAFFBEAgA0EBQc0dQQAQCAwFCyAGKAIQQbgIEAwhASAAKAIMIAE2AtArIAAoAgwoAtArRQRAIANBAUHNHUEAEAgMBQtBCkEUEAwhASAAKAIMIAE2AvArIAAoAgwiASgC8CtFBEAgA0EBQc0dQQAQCAwFCyABQQo2AvgrQQpBFBAMIQEgACgCDCABNgL8KyAAKAIMIgEoAvwrRQRAIANBAUHNHUEAEAgMBQsgAUEKNgKELAJAIAYoAhAiBEUNACAGKAIYIQhBACEBIARBAUcEQCAEQX5xIQsDQCAIIAFBNGxqIgcoAiBFBEAgACgCDCgC0CsgAUG4CGxqQQEgBygCGEEBa3Q2ArQICyAIIAFBAXIiB0E0bGoiCigCIEUEQCAAKAIMKALQKyAHQbgIbGpBASAKKAIYQQFrdDYCtAgLIAFBAmohASACQQJqIgIgC0cNAAsLIARBAXFFDQAgCCABQTRsaiICKAIgDQAgACgCDCgC0CsgAUG4CGxqQQEgAigCGEEBa3Q2ArQICyAJBEAgACgCnAEhAUEAIQIDQCABIAYoAhBBuAgQDCIENgLQKyAERQRAQQAhAiADQQFBzR1BABAIDAcLIAFBjCxqIQEgAkEBaiICIAlJDQALCyAAQQQ2AgggBigCECIDBEBBfyAAKAJYIgEgACgCYCICIAAoAmxBAWtsaiIEIAJqIgIgAiAESRsiAiAGKAIMIgQgAiAESRutIRBBfyAAKAJUIgIgACgCXCIEIAAoAmhBAWtsaiIAIARqIgQgACAESxsiACAGKAIIIgQgACAESRutIREgASAGKAIEIgAgACABSRutIRIgAiAGKAIAIgAgACACSRutIRMgBigCGCEAQQAhAQNAIAAgADUCBCINQgF9IhQgEnwgDYAiFT4CFCAAIAA1AgAiDkIBfSIWIBN8IA6AIhc+AhAgAEJ/IAA1AigiD4ZCf4UiGCAQIBR8IA2AIBV9Qv////8Pg3wgD4g+AgwgACARIBZ8IA6AIBd9Qv////8PgyAYfCAPiD4CCCAAQTRqIQAgAUEBaiIBIANHDQALC0EBIQIMBAsgBSACNgKQASADQQFB9jsgBUGQAWoQCEEAIQIMAwtBACECIAZBADYCECADQQFBzR1BABAIDAILIAUgCDYCNCAFIAk2AjAgA0EBQcfzACAFQTBqEAgMAQsgBSAINgIoIAUgBzYCJCAFIAk2AiAgA0EBQaHrACAFQSBqEAgLIAVBoAFqJAAgAgueAwEHfyMAQRBrIgYkAAJ/IAIgAkEBQQIgACgCSCgCECIIQYECSRsiB0EBdEEFaiIEbiIFIARsRiACIARPcUUEQCADQQFBiiNBABAIQQAMAQsCfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEEQQAhACAELQCILCICQQRxBEAgBCgCpANBAWohAAsgACAFaiIFQSBPBEAgBiAFNgIAIANBAUGLOyAGEAhBAAwBCyAEIAJBBHI6AIgsIAAgBUkEQCAEIABBlAFsakGoA2ohAgNAIAEgAkEBEAogAUEBaiIBIAJBBGogBxAKIAEgB2oiASACQQhqQQIQCiACIAIoAggiAyAEKAIIIgkgAyAJSRs2AgggAUECaiACQQxqQQEQCiABQQNqIgEgAkEQaiAHEAogASAHaiIBIAZBDGpBARAKIAIgBigCDDYCJCACIAIoAhAiAyAIIAMgCEkbNgIQIAJBlAFqIQIgAUEBaiEBIABBAWoiACAFRw0ACwsgBCAFQQFrNgKkA0EBCyEKIAZBEGokACAKC+wBAQR/IwBBEGsiBCQAAn8CQCABIARBCGoCfyAAKAJIKAIQQYACTQRAIAIEQEF/IQVBAQwCCyADQQFBviNBABAIQQAMAwsgAkEBTQ0BQX4hBUECCyIGEAogBCACIAVqNgIMIAQoAggiAiAAKAJIKAIQIgVPBEAgBCAFNgIEIAQgAjYCACADQQFBxjogBBAIQQAMAgsgACACIAEgBmogBEEMaiADEDtFBEAgA0EBQb4jQQAQCEEADAILQQEgBCgCDEUNARogA0EBQb4jQQAQCEEADAELIANBAUG+I0EAEAhBAAshByAEQRBqJAAgBwvZAQEEfyMAQRBrIgQkACAEIAI2AgwCQAJAIABBACABIARBDGogAxA7RQ0AIAQoAgwNAAJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIQdBASEFIAAoAkgoAhBBAkkNASAHKALQKyICQRxqIQZBASEBIAIhAwNAIAMgAigCGDYC0AggAyACKAKkBjYC3A4gA0HUCGogBkGIBhALGiADQbgIaiEDIAFBAWoiASAAKAJIKAIQSQ0ACwwBCyADQQFB1iJBABAICyAEQRBqJAAgBQvWAQEDfyMAQRBrIgQkAAJAIAJBAUECIAAoAkgoAhAiBkGBAkkbIgVBAmpHBEBBACEAIANBAUGKIEEAEAgMAQsCfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyECIAEgBEEMaiAFEApBASEAIAEgBWoiBSAEQQhqQQEQCiAGIAQoAgwiAU0EQCAEIAY2AgQgBCABNgIAIANBAUHo7wAgBBAIQQAhAAwBCyAFQQFqIAIoAtArIAFBuAhsakGoBmpBARAKCyAEQRBqJAAgAAuEAgEFfyMAQRBrIgQkAAJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIQYCQCACQQFBAiAAKAJIIgcoAhBBgQJJGyIFTQRAQQAhAiADQQFBpCNBABAIDAELIAQgBUF/cyACajYCDCABIARBCGogBRAKIAQoAggiCCAHKAIQTwRAQQAhAiADQQFBkOkAQQAQCAwBC0EBIQIgASAFaiIBIAYoAtArIAhBuAhsakEBEAogACAEKAIIIAFBAWogBEEMaiADEDxFBEBBACECIANBAUGkI0EAEAgMAQsgBCgCDEUNAEEAIQIgA0EBQaQjQQAQCAsgBEEQaiQAIAILrAYBB38jAEEQayIGJAAgBiACNgIMIAAoAkghCQJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIgQgBC0AiCxBAXI6AIgsAkAgAkEETQRAIANBAUG8IkEAEAgMAQsgASAEQQEQCiAEKAIAQQhPBEAgA0EBQZoiQQAQCAwBCyABQQFqIAZBCGpBARAKIAQgBigCCCICNgIEIAJBBU4EQCADQQFB8SFBABAIIARBfzYCBAsgAUECaiAEQQhqQQIQCiAEKAIIIgdBgIAEa0GAgHxNBEAgBiAHNgIAIANBAUGpPSAGEAgMAQsgBCAAKAKkASICIAcgAhs2AgwgAUEEaiAEQRBqQQEQCiAEKAIQQQJPBEAgA0EBQYcqQQAQCAwBCyABQQVqIQIgBiAGKAIMQQVrNgIMAkAgCSgCECIHRQ0AIAQoAgBBAXEhCCAEKALQKyEEQQAhCSAHQQhPBEAgB0F4cSEBA0AgBCAFQbgIbGogCDYCACAEIAVBAXJBuAhsaiAINgIAIAQgBUECckG4CGxqIAg2AgAgBCAFQQNyQbgIbGogCDYCACAEIAVBBHJBuAhsaiAINgIAIAQgBUEFckG4CGxqIAg2AgAgBCAFQQZyQbgIbGogCDYCACAEIAVBB3JBuAhsaiAINgIAIAVBCGohBSAKQQhqIgogAUcNAAsLIAdBB3EiAUUNAANAIAQgBUG4CGxqIAg2AgAgBUEBaiEFIAlBAWoiCSABRw0ACwtBACEFIABBACACIAZBDGogAxA8RQRAIANBAUG8IkEAEAgMAQsgBigCDARAIANBAUG8IkEAEAgMAQsCfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEBIAAoAkgoAhBBAk8EQCABKALQKyIBKAIEQQJ0IQcgAUGwB2ohCiABQawGaiEDQQEhCSABIQIDQCACIAH9AAIE/QsCvAggAiABKAIUNgLMCCACQeQOaiADIAcQCxogAkHoD2ogCiAHEAsaIAJBuAhqIQIgCUEBaiIJIAAoAkgoAhBJDQALC0EBIQULIAZBEGokACAFC+wJAQZ/IwBB8ABrIgQkACAEQQA2AmgCQCACQQhHBEAgA0EBQb0eQQAQCCADQQFBvR5BABAIDAELIAEgAEHMAWpBAhAKIAFBAmogBEHsAGpBBBAKIAFBBmogBEHkAGpBARAKIAFBB2ogBEHoAGpBARAKIAAoAswBIgIgACgCaCIIIAAoAmxsTwRAIAQgAjYCYCADQQFBnTsgBEHgAGoQCAwBCyAAKAKcASACQYwsbGohBSACIAhuIQcgBCgCZCEBAkAgACgCLCIGQQBOIAIgBkdxDQAgBSgC1CtBAWoiBiABRg0AIAQgBjYCWCAEIAE2AlQgBCACNgJQIANBAUG1OyAEQdAAahAIQQAhBQwBCyAFIAE2AtQrAkACQCAEKAJsIgFBAWtBDE0EfyABQQxHDQEgBEEMNgIwIANBAkH11wAgBEEwahAIIAQoAmwFIAELRQRAIANBBEGNzwBBABAIIABBATYCOAsCQAJAAkACQCAFKALYKyIBBEAgBCgCZCIGIAFJDQEgBCABNgIkIAQgBjYCICADQQFBhScgBEEgahAIIABBATYCOEEAIQUMBwsgBCgCaCIGDQEMAwsgBCgCaCIGRQ0BCyAEIAYgAC0AREEEdkEBcWoiATYCaCAEKAJkIgYgBSgC2CsiCUEBa0sEQCAEIAk2AgQgBCAGNgIAIANBAUGiJiAEEAggAEEBNgI4QQAhBQwFCyABIAZNBEAgBCABNgIUIAQgBjYCECADQQFB6ScgBEEQahAIIABBATYCOEEAIQUMBQsgBSABNgLYKwsgASAEKAJkQQFqRw0AIAAgAC0AREEBcjoARAsgBCgCbCEBIABBEDYCCCAAQQAgAUEMayAAKAI4GzYCGAJAIAAoAiwiAUF/RgRAQQQhBSACIAcgCGxrIgEgACgCHEkNASABIAAoAiRPDQEgByAAKAIgSQ0BIAcgACgCKE9BAnQhBQwBCyAAKALMASABR0ECdCEFCyAAIAAtAERB+wFxIAVyOgBEQQEhBSAAKALIASIBRQ0CIAEoAigiBiAAKALMASICQShsaiIHIAI2AgAgByAEKAJkIgg2AgwgBCgCaCIBBEAgByABNgIEIAcgBCgCaCIBNgIIIAcoAhAiAkUEQCABQRgQDCEBIAAoAsgBKAIoIAAoAswBQShsaiABNgIQIAENBEEAIQUgA0EBQck0QQAQCAwECyACIAFBGGwQECEBIAAoAsgBKAIoIAAoAswBQShsaiECIAFFBEAgAigCEBAJQQAhBSAAKALIASgCKCAAKALMAUEobGpBADYCECADQQFByTRBABAIDAQLIAIgATYCEAwDCyAHKAIQIgFFBEAgB0EKNgIIQQpBGBAMIQEgACgCyAEoAigiBiAAKALMASICQShsaiIHIAE2AhAgAUUNAiAEKAJkIQgLIAggBiACQShsaiICKAIISQ0CIAIgCEEBaiICNgIIIAEgAkEYbBAQIQEgACgCyAEoAiggACgCzAFBKGxqIQIgAUUEQCACKAIQEAlBACEFIAAoAsgBKAIoIAAoAswBQShsaiIAQQA2AgggAEEANgIQIANBAUHJNEEAEAgMAwsgAiABNgIQDAILIAQgATYCQCADQQFBgtoAIARBQGsQCEEAIQUMAQtBACEFIAdBADYCCCADQQFByTRBABAICyAEQfAAaiQAIAULqwcBCH8jAEHQAGsiBCQAIARBATYCTAJAAkAgACgCyAEiBSgCKCIDDQAgBSAAKAJsIAAoAmhsIgM2AiQgA0EoEAwhAyAAKALIASIFIAM2AiggA0UEQEEAIQUMAgsgBSgCJEUNAANAQQAhBSADIAZBKGwiB2oiA0EANgIUIANB5AA2AhxB5ABBGBAMIQkgByAAKALIASIIKAIoIgNqIAk2AhggCUUNAiAGQQFqIgYgCCgCJEkNAAsLIAAoAiwhCQJAIAMoAhBFDQACQCADIAlBKGxqIgMoAgRFBEAgASAAKQMwQgJ8IAIQLw0BQQAhBSACQQFBpylBABAIDAMLIAEgAygCECkDAEICfCACEC8NAEEAIQUgAkEBQacpQQAQCAwCCyAAKAIIQYACRw0AIABBCDYCCAsCQCAAKAJsIAAoAmhsIgdFDQAgACgCnAEhBUEAIQMgB0EITwRAIAdBeHEhCEEAIQYDQCAFIANBjCxsakF/NgLUKyAFIANBAXJBjCxsakF/NgLUKyAFIANBAnJBjCxsakF/NgLUKyAFIANBA3JBjCxsakF/NgLUKyAFIANBBHJBjCxsakF/NgLUKyAFIANBBXJBjCxsakF/NgLUKyAFIANBBnJBjCxsakF/NgLUKyAFIANBB3JBjCxsakF/NgLUKyADQQhqIQMgBkEIaiIGIAhHDQALCyAHQQdxIgZFDQADQCAFIANBjCxsakF/NgLUKyADQQFqIQMgCkEBaiIKIAZHDQALC0EAIQUgACAEQcgAakEAIARBxABqIARBQGsgBEE8aiAEQThqIARBNGogBEHMAGogASACECBFDQAgCUEBaiEHA0ACQCAEKAJMRQ0AIAAgBCgCSCIDQQBBACABIAIQJEUNAiAAKAJoIQggACgCbCEKIAQgA0EBaiIGNgIgIAQgCCAKbDYCJCACQQRBsNcAIARBIGoQCCAAKALQASAAKAJMKAIYEG1FDQIgACgCnAEgA0GMLGxqIgUoAtwrIggEQCAIEAkgBUIANwLcKwsgBCAGNgIQIAJBBEH2/AAgBEEQahAIIAMgCUYEQCABIAAoAsgBKQMIQgJ8IAIQLw0BQQAhBSACQQFBpylBABAIDAMLIAQgBzYCBCAEIAY2AgAgAkECQe3lACAEEAhBACEFIAAgBEHIAGpBACAEQcQAaiAEQUBrIARBPGogBEE4aiAEQTRqIARBzABqIAEgAhAgDQEMAgsLIAAgAhBrIQULIARB0ABqJAAgBQvIBgIHfwF+IwBB0ABrIgMkACADQQE2AkwCQAJAIAAoAmgiBEEBRw0AIAAoAmxBAUcNACAAKAJUDQAgACgCWA0AIAAoAkwiBSgCAA0AIAUoAgQNACAFKAIIIAAoAlxHDQAgBSgCDCAAKAJgRw0AQQAhBCAAIANByABqQQAgA0HEAGogA0FAayADQTxqIANBOGogA0E0aiADQcwAaiABIAIQIEUNAQJAIAAgAygCSEEAQQAgASACECQEQCAAKAJMIgEoAhANAUEBIQQMAwsgAkEBQZLBAEEAEAgMAgsgASgCGCEBQQAhAgNAIAEgAkE0bCIEaigCLBAJIAAoAkwiBSgCGCIBIARqIgYgACgC0AEiBygCFCgCACgCFCACQcwAbGoiCCgCJDYCLCAGIAcoAhgoAhggBGooAiQ2AiQgCEEANgIkQQEhBCACQQFqIgIgBSgCEEkNAAsMAQsDQAJAAn8CQCAEQQFHDQAgACgCbEEBRw0AIAAoApwBKALcK0UNACADQQA2AkggAEEANgLMASAAIAAoAghBgAFyNgIIQQAMAQtBACEEIAAgA0HIAGpBACADQcQAaiADQUBrIANBPGogA0E4aiADQTRqIANBzABqIAEgAhAgRQ0DIAMoAkxFDQEgAygCSAsiB0EBaiEEIAAgB0EAQQAgASACECQhCSAAKAJoIAAoAmxsIQUgCUUEQCADIAU2AgQgAyAENgIAIAJBAUGXOSADEAhBACEEDAMLIAMgBTYCJCADIAQ2AiAgAkEEQbDXACADQSBqEAggACgC0AEgACgCTCgCGBBtRQRAQQAhBAwDCwJAAkAgACgCaEEBRw0AIAAoAmxBAUcNACAAKAJMIgUoAgAgACgCSCIGKAIARw0BIAUoAgQgBigCBEcNASAFKAIIIAYoAghHDQEgBSgCDCAGKAIMRw0BCyAAKAKcASAHQYwsbGoiBSgC3CsiBkUNACAGEAkgBUIANwLcKwsgAyAENgIQIAJBBEH2/AAgA0EQahAIIAEpAwgiClAEfkIABSAKIAEpAzh9C1AEQCAAKAIIQcAARg0BCyAIQQFqIgggACgCaCIEIAAoAmxsRw0BCwsgACACEGshBAsgA0HQAGokACAEC7UGAQx/IAAoAkghCQJAIAAoAmggACgCbGwiDARAIAkoAhAiAUG4CGwhDSABIAFsQQJ0IQogACgCDCEEIAAoApwBIQMDQCADKALQKyELIAMgBEGMLBALIgFBADYC6CsgAUF/NgLUKyABQQA2ArAoIAFBADYChCwgAUEANgLwKyABQgA3AvgrIAEgCzYC0CsgASABLQCILEH8AXE6AIgsIAQoAugrBEAgASAKEA0iAzYC6CsgA0UEQEEADwsgAyAEKALoKyAKEAsaCyABIAQoAvgrQRRsIgUQDSIDNgLwK0EAIQggA0UNAiADIAQoAvArIAUQCxogBCgC9CsiBgRAIAQoAvArIQMgASgC8CshBUEAIQcDQCADKAIMBEAgBSADKAIQEA0iBjYCDCAGRQRAQQAPCyAGIAMoAgwgAygCEBALGiAEKAL0KyEGCyABIAEoAvgrQQFqNgL4KyAFQRRqIQUgA0EUaiEDIAdBAWoiByAGSQ0ACwsgASAEKAKELEEUbCIFEA0iAzYC/CsgA0UNAiADIAQoAvwrIAUQCxogASAEKAKELCIINgKELCAIBEAgBCgC/CshAyABKAL8KyEFQQAhBwNAIAMoAggiBgRAIAUgASgC8CsgBiAEKALwK2tqNgIICyADKAIMIgYEQCAFIAEoAvArIAYgBCgC8CtrajYCDAsgBUEUaiEFIANBFGohAyAHQQFqIgcgCEcNAAsLIAsgBCgC0CsgDRALGiABQYwsaiEDIA5BAWoiDiAMRw0ACwtBASEIIAACf0EAQQFByAAQDCIBRQ0AGiABIAEtAChB/gFxQQFyOgAoIAFBAUEEEAwiBDYCFCABIAQNABogARAJQQALIgE2AtABIAFFBEBBAA8LIAAoAtQBIQVBACEEIAEgAEHQAGo2AhwgASAJNgIYQQFB0AYQDCEDIAEoAhQgAzYCAAJAIANFDQAgCSgCEEHMABAMIQMgASgCFCgCACIHIAM2AhQgA0UNACAHIAkoAhA2AhAgACgCpAEhBCABIAU2AiwgASAENgIAQQEhBAsgBA0AIAAoAtABEE5BACEIIABBADYC0AEgAkEBQcIbQQAQCAsgCAvVEgMMfwF9AX4jAEEwayIIJAAgAEEBNgIIAn8CQAJAIAEgCEEoaiIFQQIgAhASQQJHDQAgBSAIQSxqQQIQCiAIKAIsQc/+A0cNACAAQQI2AgggACgCyAEgASkDOEICfSIQNwMAIAggEDcDECACQQRB/t4AIAhBEGoQCCAAKALIASIDKQMAIRAgAygCGCIHQQFqIgUgAygCICIETQRAIAMoAhwhBAwCCyADAn8gBLNDAADIQpIiD0MAAIBPXSAPQwAAAABgcQRAIA+pDAELQQALIgU2AiAgAygCHCAFQRhsEBAiBARAIAMgBDYCHCADKAIYIgdBAWohBQwCCyADKAIcEAkgA0EANgIgIANCADcDGCACQQFBqR1BABAICyACQQFBxfUAQQAQCEEADAELIAQgB0EYbGoiBEECNgIQIAQgEMQ3AwggBEHP/gM7AQAgAyAFNgIYIAEgACgCEEECIAIQEkECRwRAIAJBAUGWEkEAEAhBAAwBCyAAKAIQIAhBKGpBAhAKAkACQCAIKAIoIgRBkP8DRwRAA0BB8L0BIQcgBEH//QNNBEAgCCAENgIAIAJBAUHKECAIEAhBAAwFCwNAIAciBSgCACIDBEAgBUEMaiEHIAMgBEcNAQsLAkACQCADDQBBAiEGIAJBAkH1HEEAEAhBlhIhBwJAAkAgASAAKAIQQQIgAhASQQJHDQADQCAAKAIQIAhBLGpBAhAKQfC9ASEDIAgoAiwiBEGA/gNPBEADQCADIgUoAgAiDARAIANBDGohAyAEIAxHDQELCyAFKAIEIAAoAghxRQRAQfwoIQcMAwsgDARAIAxBkP8DRgRAIAhBkP8DNgIoDAcLIAEpAzghECAAKALIASIDKAIYIgVBAWoiBCADKAIgIgdNBEAgAygCHCEHDAULIAMCfyAHs0MAAMhCkiIPQwAAgE9dIA9DAAAAAGBxBEAgD6kMAQtBAAsiBTYCICADKAIcIAVBGGwQECIHBEAgAyAHNgIcIAMoAhgiBUEBaiEEDAULIAMoAhwQCSADQQA2AiAgA0IANwMYQakdIQcMAwsgBkECaiEGCyABIAAoAhBBAiACEBJBAkYNAAsLIAJBASAHQQAQCCACQQFB/scAQQAQCEEADAcLIAcgBUEYbGoiBSAGNgIQIAUgEKcgBmusNwMIIAVBADsBACADIAQ2AhggCCAMNgIoQfC9ASEEA0AgBCIFKAIAIgNFDQEgBEEMaiEEIAMgDEcNAAsLIAUoAgQgACgCCHFFBEAgAkEBQfwoQQAQCEEADAYLIAEgACgCEEECIAIQEkECRwRAIAJBAUGWEkEAEAhBAAwGCyAAKAIQIAhBJGpBAhAKIAgoAiQiBEEBTQRAIAJBAUGhLkEAEAhBAAwGCyAIIARBAmsiBzYCJCAAKAIQIQQgACgCFCAHSQRAIAQgBxAQIgRFBEAgACgCEBAJIABCADcDECACQQFB1CVBABAIQQAMBwsgACAENgIQIAAgCCgCJCIHNgIUCyABIAQgByACEBIiBCAIKAIkRwRAIAJBAUGWEkEAEAhBAAwGCyAAIAAoAhAgBCACIAUoAggRAQBFBEAgAkEBQagSQQAQCEEADAYLIAEpAzghECAIKAIkIQwCQCAAKALIASIFKAIYIgZBAWoiByAFKAIgIgRNBEAgBSgCHCEEDAELIAUCfyAEs0MAAMhCkiIPQwAAgE9dIA9DAAAAAGBxBEAgD6kMAQtBAAsiBDYCICAFKAIcIARBGGwQECIERQ0FIAUgBDYCHCAFKAIYIgZBAWohBwsgBCAGQRhsaiIEIAxBBGo2AhAgBCAQpyAMa0EEa6w3AwggBCADOwEAIAUgBzYCGCABIAAoAhBBAiACEBJBAkcEQCACQQFBlhJBABAIQQAMBgtBASAKIANB3P4DRhshCkEBIAsgA0HS/gNGGyELQQEgDSADQdH+A0YbIQ0gACgCECAIQShqQQIQCiAIKAIoIgRBkP8DRw0BCwsgDQ0BCyACQQFBmCRBABAIQQAMAgsgC0UEQCACQQFBxiRBABAIQQAMAgsgCkUEQCACQQFB9CRBABAIQQAMAgtBACEDQQAhDSMAQRBrIgQkAEEBIQcCQCAALQC8AUEBcUUNAAJAIAAoAnAiC0UNAAJAA0AgACgCdCANQQN0aiIFKAIAIgoEQCADIAUoAgQiBmsiBUEAIAMgBU8bIQUgAyAGSQRAIAYgA2shCyADIApqIQoDQCALQQRJBEBBjishAwwFCyAKIARBDGpBBBAKIAQoAgwiA0F/cyAJSQRAQfQqIQMMBQsgAyALQQRrIgZrIAUgAyAGSyIMGyEFIAMgCWohCSAGIANrIQsgCkEAIAMgDBtqQQRqIQogAyAGSQ0ACyAAKAJwIQsLIAUhAwsgDUEBaiINIAtJDQALIANFDQFBACEHIAJBAUHpFkEAEAgMAgtBACEHIAJBASADQQAQCAwBCyAAIAkQDSIDNgKIASADRQRAQQAhByACQQFBviBBABAIDAELIAAgCTYCfCAAKAJ0IQYCQCAAKAJwIgoEQEEAIQlBACEDQQAhBQNAIAYgBUEDdCINaiIMKAIAIgsEQCAAKAKIASADaiEKAn8gDCgCBCIGIAlNBEAgCiALIAYQCxogAyAGaiEDIAkgBmsMAQsgCiALIAkQCxogAyAJaiEDIAYgCWsiBgRAIAkgC2ohCQNAIAZBBEkNBiAJIARBCGpBBBAKIAlBBGohCSAAKAKIASADaiEKIAZBBGsiBiAEKAIIIgtJBEAgCiAJIAYQCxogAyAGaiEDIAQoAgggBmsMAwsgCiAJIAsQCxogBCgCCCIKIANqIQMgCSAKaiEJIAYgCmsiBg0ACwtBAAshCSAAKAJ0IA1qKAIAEAkgACgCdCIGIA1qQgA3AgAgACgCcCEKCyAFQQFqIgUgCkkNAAsgACgCfCEJIAAoAogBIQMLIAAgCTYCkAEgACADNgJ4IABBADYCcCAGEAkgAEEANgJ0DAELQQAhByACQQFBjitBABAICyAEQRBqJAAgB0UEQCACQQFBjz1BABAIQQAMAgsgAkEEQYfXAEEAEAggACgCyAEgASkDOEL+////D3xC/////w+DNwMIIABBCDYCCEEBDAELIAUoAhwQCSAFQQA2AiAgBUIANwMYIAJBAUGpHUEAEAhBAAshDiAIQTBqJAAgDgscACAAKAIIRSAAKALAAUEARyAAKALEAUEAR3FxCwQAQQALDwAgAARAIAAgATYCuAELC48BAQR/IAAoAhgiAQRAIAAoAhwiA0E0biEEIANBNE8Ef0EAIQMDQCABKAIAIgIEQCACQQFrEAkgAUEANgIACyABKAIEIgIEQCACEAkgAUEANgIECyABKAIIIgIEQCACEAkgAUEANgIICyABQTRqIQEgA0EBaiIDIARHDQALIAAoAhgFIAELEAkgAEEANgIYCwuGAQEEfyAAKAIYIgEEQCAAKAIcIgJBwABPBH8gAkEGdiEEQQAhAgNAIAEoAgAiAwRAIAMQCSABQQA2AgALIAEoAgQiAwRAIAMQCSABQQA2AgQLIAEoAjwQCSABQQA2AjwgAUFAayEBIAJBAWoiAiAERw0ACyAAKAIYBSABCxAJIABBADYCGAsLPwEBfyAABEAgACgCdCIBBEAgARAJIABBADYCdAsgACgCeCIBBEAgARAJIABBADYCeAsgACgClAEQCSAAEAkLC8GmBQRcfwJ7Bn4BfSMAQeAAayIjJAAgACgCCCEaAkACQAJAAkAgACgCAEUEQCAaIBooAhAgGigCCGsgGigCFCAaKAIMa2xBAnQiBhAWIgM2AjwgA0UEQCAAKAIkGiAAKAIgQQFB0TxBABAIIAAoAiQaIABBHGohEAwDCyADQQAgBhAOGgwBCyAaKAI8IgNFDQAgAxAJIBpBADYCPAsgACgCECIyKAIcIDIoAhhBmAFsaiIDQZgBaygCACE1IANBkAFrKAIAITYgACgCFCEvIAAoAgwhMCAAKAIEITcgACgCHCgCAEUNAiAAQRxqIRACQAJ/QQAgASgCBCIDQQBMDQAaIAEoAgAhBgJAA0AgBiAHQQxsaiIEKAIARQ0BIAdBAWoiByADRw0AC0EADAELIAQoAgQLIgQNAEEBQZwBEAwiBEUEQCAAKAIgQQFBkDBBABAIDAILIARBADYCjAEgASgCBCIDQf////8HRwR/An8gASgCACEGIANBAEoEQANAIAYgCUEMbGoiBygCAEUEQCAHKAIIIgMEfyAHKAIEIAMRAgAgASgCAAUgBgsgCUEMbGoiAUEPNgIIIAEgBDYCBEEBDAMLIAlBAWoiCSADRw0ACwtBACAGIANBDGxBDGoQECIDRQ0AGiABIAM2AgAgAyABKAIEIgZBDGxqIgNBDzYCCCADIAQ2AgQgA0EANgIAIAEgBkEBajYCBEEBCwVBAAsNACAAKAIgQQFBjT5BABAIIAQoAnQiAQRAIAEQCSAEQQA2AnQLIAQoAngiAQRAIAEQCSAEQQA2AngLIAQoApQBEAkgBBAJDAELIAQgACgCGDYCkAEgACgCKCErIAAoAiQhISAAKAIgIR0gLygCqAYhESAwKAIQIQECQAJAIC8oAhAiFkHAAHEEQCAWIQojAEGwAmsiDyQAAkAgEQRAICEEQEEAIQcgHUEBQYEYQQAQCAwCC0EAIQcgHUEBQYEYQQAQCAwBCyAEKAJ0IQcCQAJAIBooAhQgGigCDGsiAyAaKAIQIBooAghrIgZsIgEgBCgChAFLBEAgBxAJIAQgAUECdCIREBYiBzYCdCAHRQRAQQAhBwwECyAEIAE2AoQBDAELIAdFDQEgAUECdCERCyAHQQAgERAOGgsgBCgCeCEHAkAgBCgCiAFBzxRLDQAgBxAJIARBwNIAEBYiBzYCeCAHDQBBACEHDAELIARB0BQ2AogBIAdBAEHA0gAQDhogBCADNgKAASAEIAY2AnwgGigCGCICRQRAQQEhBwwBCyAaKAIcIQ1BASEHAkACQAJAAkACQCAaKAI0IgMEQCAaKAIEIQlBACEHQQAhAQJAIANBBE8EQCADQXxxIQEDQCAJIAhBA3RqIgZBHGogBkEUaiAGQQxqIAb9CQIE/VYCAAH9VgIAAv1WAgADIF79rgEhXiAIQQRqIgggAUcNAAsgXiBeIF79DQgJCgsMDQ4PAAECAwABAgP9rgEiXiBeIF79DQQFBgcAAQIDAAECAwABAgP9rgH9GwAhByABIANGDQELA0AgCSABQQN0aigCBCAHaiEHIAFBAWoiASADRw0ACwsgA0EBRgRAIAQoApABRQ0FCyAHIAQoApgBTQ0BIAQoApQBIAcQECIRDQJBACEHDAYLIAQoApABRQ0FCyAEKAKUASIRDQFBACEHDAQLIAQgBzYCmAEgBCARNgKUAQsgGigCNEUEQEEAIQcMAgsgGigCBCEIQQAhB0EAIQEDQCAHIBFqIAggAUEDdCIDaiIGKAIAIAYoAgQQCxogGigCBCIIIANqKAIEIAdqIQcgAUEBaiIBIBooAjRJDQALDAELIBooAgQoAgAhEQtBACEBQQAhCAJ/QQAgGigCKCIDRQ0AGiAaKAIAIgYoAgghCEEAIANBAUYNABogBigCIAshAyACIA1rIUUCQCADIAhqIghFBEBBACEJDAELQQEhASAaKAIAIgMoAgAhBUEAIQkgCEEBRgRAQQAhAQwBCyADKAIYIQkLIEVBAWohFiAEKAJ0IQ4gBCgCeCEUIBooAgwhEiAaKAIUIRggGigCCCEkIBooAhAhKwJAAkACQAJAAkACQAJAAkACQCABRQ0AIAkNACAhRQ0BIB1BAkH8zwBBABAIQQEhCAwCCyAIQQRJDQEgIQRAIA8gCDYCcCAdQQFB/cUAIA9B8ABqEAgMCAsgDyAINgJgIB1BAUH9xQAgD0HgAGoQCEEAIQcMCAsgHUECQfzPAEEAEAggGigCGCIBQR5LDQFBASEMIAEgFk8NAwwFCyAaKAIYIgFBHk0NASAhRQ0AIA8gATYCICAdQQFBq9sAIA9BIGoQCAwFCyAPIAE2AgAgHUEBQavbACAPEAhBACEHDAULIAEgFkkNASAIQQJJBEAgCCEMDAELIAEgFkcEQCAIIQwMAQtBASEMQZDGAS0AAA0AICFFBEBBkMYBQQE6AAAgDyAINgJAIB1BAkGBzAAgD0FAaxAIDAELQZDGAS0AAEUEQEGQxgFBAToAACAPIAg2AlAgHUECQYHMACAPQdAAahAICwsCQAJAIAVBAkkNACAFIAdLDQAgBSAJaiAHTQ0BCyAhBEBBACEHIB1BAUHDxQBBABAIDAULQQAhByAdQQFBw8UAQQAQCAwECwJAAkAgBSARaiITQQFrLQAAQQR0IBNBAmstAABBD3FyIgZBAkkNACAFIAZIDQAgBkHwH0kNAQsgIQRAQQAhByAdQQFB5vIAQQAQCAwFC0EAIQcgHUEBQebyAEEAEAgMBAsgGigCHCEmIA9BADYCkAIgD0EANgKYAiAPQgA3A4gCIA9CADcDqAIgD0IANwKcAiAPIAZBAWsiBzYClAIgDyAFIBFqIAZrIgE2AoACQv8BIWAgBkECTwRAIAExAAAhYAtBCCEDIA9BCDYCkAIgDyAGQQJrIgg2ApQCIA8gYEIPhCBgIAdBAUYbImA3A4gCIA8gASAGQQFKaiIHNgKAAiAPIGBC/wFRIg02ApgCAn8CQCABQQNxIgJBA0YNAEL/ASFhIA0EQEEAIActAABBjwFLDQIaCyAGQQNOBEAgBzEAACFhCyAPIAZBA2siDTYClAIgD0EPQRAgYEL/AVEiCxsiAzYCkAIgDyAHIAZBAkpqIgE2AoACIA8gYUIPhCBhIAhBAUYbImFC/wFRNgKYAiAPIGBCB0IIIAsbhiBhhCJgNwOIAiACQQJGDQAgYUL/AVEEQEEAIAEtAABBjwFLDQIaC0L/ASFiIAZBBE4EQCABMQAAIWILIA8gBkEEayIHNgKUAiAPIAEgBkEDSmoiATYCgAIgDyBiQg+EIGIgDUEBRhsiYkL/AVE2ApgCIA8gA0EHQQggYUL/AVEiCBtqIgM2ApACIA8gYEIHQgggCBuGIGKEImA3A4gCIAJBAUYNAEL/ASFhIGJC/wFRBEBBACABLQAAQY8BSw0CGgsgBkEFTgRAIAExAAAhYQsgDyAGQQVrNgKUAiAPIAEgBkEESmo2AoACIA8gYUIPhCBhIAdBAUYbImFC/wFRNgKYAiAPIANBB0EIIGJC/wFRIgEbaiIDNgKQAiAPIGBCB0IIIAEbhiBhhCJgNwOIAgsgDyBgQcAAIANrrYY3A4gCQQELRQRAICEEQEEAIQcgHUEBQd7UAEEAEAgMBQtBACEHIB1BAUHe1ABBABAIDAQLICsgJGshFSAPIAZBAmsiCzYC9AEgDyAFIBFqIgJBA2siAzYC4AEgDyACQQJrLQAAIhlBjwFLIg02AvgBIA8gGUEEdq0iYDcD6AEgD0EDQQQgYEIHg0IHURsiATYC8AEgA0EDcUEBaiIHIAsgByALSBshCAJAAkAgBkECTARAIA8gCyAIayICNgL0AQwBCyAPIAJBBGsiBzYC4AEgDyADLQAAIhdBjwFLIg02AvgBIA8gF60iYSABrYYgYIQiYDcD6AEgD0EIQQdBCCBhQv8Ag0L/AFEbIBlBjwFNGyABaiIBNgLwAQJAIAhBAUYEQCAHIQMMAQsgDyACQQVrIgM2AuABIA8gBy0AACIZQY8BSyINNgL4ASAPIBmtImEgAa2GIGCEImA3A+gBIA9BCEEHQQggYUL/AINC/wBRGyAXQY8BTRsgAWoiATYC8AEgCEECRg0AIA8gAkEGayIHNgLgASAPIAMtAAAiF0GPAUsiDTYC+AEgDyAXrSJhIAGthiBghCJgNwPoASAPQQhBB0EIIGFC/wCDQv8AURsgGUGPAU0bIAFqIgE2AvABIAhBA0YEQCAHIQMMAQsgDyACQQdrIgM2AuABIA8gBzEAACJhQo8BViINNgL4ASAPIGEgAa2GIGCEImA3A+gBIA9BCEEHQQggYUL/AINC/wBRGyAXQY8BTRsgAWoiATYC8AELIA8gCyAIayICNgL0ASABQSBLDQELAkAgAkEETgRAIANBA2soAgAhByAPIAJBBGs2AvQBIA8gA0EEazYC4AEMAQsgAkEATARAQQAhBwwBCyACQQFxIUcCQCACQQFGBEBBGCEIQQAhBwwBCyACQf7///8HcSEXQRghCEEAIQdBACELA0AgDyADQQFrIh82AuABIAMtAAAhRiAPIANBAmsiAzYC4AEgDyACQQFrNgL0ASAfLQAAIR8gDyACQQJrIgI2AvQBIEYgCHQgB3IgHyAIQQhrdHIhByAIQRBrIQggC0ECaiILIBdHDQALCyBHRQ0AIA8gA0EBazYC4AEgAy0AACFIIA8gAkEBazYC9AEgSCAIdCAHciEHCyAPIAdB/wFxIgNBjwFLNgL4ASAPQQdBCCAHQYCAgPgHcUGAgID4B0YbQQggDRsiAkEIQQdBCCAHQYCA/ANxQYCA/ANGGyAHQf////94TRtqIghBCEEHQQggB0GA/gFxQYD+AUYbIAdBEHZB/wFxIg1BjwFNG2oiC0EIQQdBCCAHQf8AcUH/AEYbIAdBCHZB/wFxIhlBjwFNGyABamo2AvABIA8gDSACdCAHQRh2ciAZIAh0ciADIAt0cq0gAa2GIGCENwPoAQsgD0HAAWogESAFIAZrQf8BEFQCf0EAIAxBAkkNABogD0GgAWogEyAJQQAQVEEAIAxBAkYNABpCACFgQgAhYiAPQQE2ApgBIA9BADYCkAEgD0IANwOIASAPIAlBAWsiBjYClAEgDyAFIBFqIAlqIgNBAWsiATYCgAEgAUEDcSEFAkAgCUEATARAIAEhAwwBCyAPIANBAmsiAzYCgAEgATEAACFgCyAPIGA3A4gBIA8gYEKPAVYiETYCmAEgD0EHQQggYEL/AINC/wBRGyINNgKQAQJAIAVFDQAgDyAJQQJrIgI2ApQBAkAgCUECSARAIAMhBwwBCyAPIANBAWsiBzYCgAEgAzEAACFiCyAPIGJCjwFWIhE2ApgBIA8gYiANrYYgYIQiYTcDiAEgD0EIQQdBCCBiQv8Ag0L/AFEbIGBCjwFYGyANaiINNgKQASAFQQFGBEAgByEDIGEhYCAGIQkgAiEGDAELIA8gCUEDayIINgKUAQJAIAlBA0gEQCAHIQEMAQsgDyAHQQFrIgE2AoABIAcxAAAhYwsgDyBjQo8BViIRNgKYASAPIGMgDa2GIGGEImA3A4gBIA9BCEEHQQggY0L/AINC/wBRGyBiQo8BWBsgDWoiDTYCkAEgBUECRgRAIAEhAyACIQkgCCEGDAELIA8gCUEEayIGNgKUAUIAIWICQCAJQQRIBEAgASEDDAELIA8gAUEBayIDNgKAASABMQAAIWILIA8gYkKPAVYiETYCmAEgDyBiIA2thiBghCJgNwOIASAPQQhBB0EIIGJC/wCDQv8AURsgY0KPAVgbIA1qIg02ApABIAghCQsgDUEgTQRAAkAgCUEFTgRAIANBA2soAgAhByAPIAlBBWs2ApQBIA8gA0EEazYCgAEMAQtBACEHIAlBAkgNAEEYIQkDQCAPIANBAWsiATYCgAEgAy0AACFJIA8gBkEBayICNgKUASBJIAl0IAdyIQcgBkEBSyFKIAEhAyAJQQhrIQkgAiEGIEoNAAsLIA8gB0H/AXEiAUGPAUs2ApgBIA9BB0EIIAdBgICA+AdxQYCAgPgHRhtBCCARGyIDQQhBB0EIIAdBgID8A3FBgID8A0YbIAdB/////3hNG2oiBkEIQQdBCCAHQYD+AXFBgP4BRhsgB0EQdkH/AXEiCUGPAU0baiICQQhBB0EIIAdB/wBxQf8ARhsgB0EIdkH/AXEiCEGPAU0bIA1qajYCkAEgDyAJIAN0IAdBGHZyIAggBnRyIAEgAnRyrSANrYYgYIQ3A4gBC0EBCyExIBggEmshHyAWQQFqISwgFEEAOgDAECAUQcAQaiELIA9BgAJqECEhAiAVQQBKBEAgJkEBayETIBQhAyALIQhBACERIA4hBkEAIQ0DQCANIQUgEUEIdCAPQeABahAqQf8AcUEBdHJBsP0Aai8BACEBAkAgEQ0AIAFBACACQQJrIgdBf0YbIQEgAkEBSgRAIAchAgwBCyAPQYACahAhIQILIA8pA+gBIWQgDygC8AEhSyADIAMoAgAgAUEEdiIYQQNxIAFBAnZBMHFyICJ0ciIWNgIAIAFBBXZBB3EgAUEQcSIeQQR2ciERIEsgAUEHcSIHayENIGQgB62IImCnIQlBACEHIBUgBUECckoEQCARQQh0IAlB/wBxQQF0ckGw/QBqLwEAIQcCQCARDQAgB0EAIAJBAmsiCUF/RhshByACQQFKBEAgCSECDAELIA9BgAJqECEhAgsgB0EEdkEBcSAHQQV2QQdxciERIA0gB0EHcSIJayENIGAgCa2IImCnIQkLIAMgB0ECdEGABnEgB0EwcXIgIkEEanQgFnI2AgACQCAHQQJ2QQJxIAFBA3ZBAXFyIhdBA0cNAEEEQQMgAkECayIWQX9GGyEXIAJBAUoEQCAWIQIMAQsgD0GAAmoQISECCwJ/IBdFBEAgD0KBgICAEDcCeEEADAELIBdBAk0EQCAPQQEgCUEHcUHknQFqLQAAIhZBBXZBfyAWQQJ2QQdxIhl0QX9zIAkgFkEDcSIJdnFqQQFqIhYgF0EBRiIXGzYCfCAPIBZBASAXGzYCeCAJIBlqDAELIAkgCUEHcUHknQFqLQAAIhZBA3EiGXYhCSAXQQNGBEAgFkEFdkEBaiEXIBlBA0YEQCAPIAlBAXFBAnI2AnwgDyAXQX8gFkECdkEHcSIWdEF/cyAJQQF2cWo2AnggFkEEagwCCyAPIBcgCSAJQQdxQeSdAWotAAAiCUEDcSISdiIgQX8gFkECdkEHcSIWdEF/c3FqNgJ4IA9BfyAJQQJ2QQdxIhd0QX9zICAgFnZxIAlBBXZqQQFqNgJ8IBYgGWogEmogF2oMAQsgDyAJIAlBB3FB5J0Bai0AACIJQQNxIhJ2IiBBfyAWQQJ2QQdxIhd0QX9zcSAWQQV2akEDajYCeCAPQX8gCUECdkEHcSIWdEF/cyAgIBd2cSAJQQV2akEDajYCfCASIBlqIBdqIBZqCyEJAkAgLCAPKAJ4IhlPBEAgDygCfCISICxNDQELICEEQEEAIQcgHUEBQan2AEEAEAgMBwtBACEHIB1BAUGp9gBBABAIDAYLIA8gDSAJazYC8AEgDyBgIAmtiDcD6AEgB0HwAXEgGEEPcXJB/wFB/wEgBUEEaiINIBVrQQF0diANIBVMGyIJIAlB1QBxIB9BAUobIglBf3NxBEAgIQRAQQAhByAdQQFBv9oAQQAQCAwHC0EAIQcgHUEBQb/aAEEAEAgMBgsCQAJAIB4EQCAPQcABahATIRcgDyAPKALQASAZIAFBE3RBH3VqIhZrNgLQASAPIA8pA8gBIBatiDcDyAEgF0F/IBZ0QX9zcSABQQh2QQFxIBZ0ckEBckECaiATdCAXQR90ciEWDAELQQAhFiAJQQFxRQ0BCyAGIBY2AgALAkAgAUEgcQRAIA9BwAFqEBMhFyAPIA8oAtABIBkgAUESdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASAGIBVBAnRqIBdBfyAWdEF/c3EgAUEJdkEBcSAWdHJBAXIiFkECaiATdCAXQR90cjYCACAIQSAgFmdrIhYgCC0AAEH/AHEiFyAWIBdLG0GAAXI6AAAMAQsgCUECcUUNACAGIBVBAnRqQQA2AgALIAZBBGohFwJAAkAgAUHAAHEEQCAPQcABahATIRggDyAPKALQASAZIAFBEXRBH3VqIhZrNgLQASAPIA8pA8gBIBatiDcDyAEgGEF/IBZ0QX9zcSABQQp2QQFxIBZ0ckEBckECaiATdCAYQR90ciEWDAELQQAhFiAJQQRxRQ0BCyAXIBY2AgALIAhBADoAAQJAIAFBgAFxBEAgD0HAAWoQEyEYIA8gDygC0AEgGSABQRB0QR91aiIWazYC0AEgDyAPKQPIASAWrYg3A8gBIBcgFUECdGogGEF/IBZ0QX9zcSABQQt2QQFxIBZ0ckEBciIBQQJqIBN0IBhBH3RyNgIAIAhBoH8gAWdrOgABDAELIAlBCHFFDQAgFyAVQQJ0akEANgIACyAGQQhqIQECQAJAIAdBEHEEQCAPQcABahATIRkgDyAPKALQASASIAdBE3RBH3VqIhZrNgLQASAPIA8pA8gBIBatiDcDyAEgGUF/IBZ0QX9zcSAHQQh2QQFxIBZ0ckEBckECaiATdCAZQR90ciEXDAELQQAhFyAJQRBxRQ0BCyABIBc2AgALAkAgB0EgcQRAIA9BwAFqEBMhGSAPIA8oAtABIBIgB0ESdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASABIBVBAnRqIBlBfyAWdEF/c3EgB0EJdkEBcSAWdHJBAXIiAUECaiATdCAZQR90cjYCACAIQSAgAWdrIgEgCC0AAUH/AHEiFiABIBZLG0GAAXI6AAEMAQsgCUEgcUUNACABIBVBAnRqQQA2AgALIAZBDGohAQJAAkAgB0HAAHEEQCAPQcABahATIRkgDyAPKALQASASIAdBEXRBH3VqIhZrNgLQASAPIA8pA8gBIBatiDcDyAEgGUF/IBZ0QX9zcSAHQQp2QQFxIBZ0ckEBckECaiATdCAZQR90ciEXDAELQQAhFyAJQcAAcUUNAQsgASAXNgIACyAIQQJqIghBADoAAAJAIAdBgAFxBEAgD0HAAWoQEyEWIA8gDygC0AEgEiAHQRB0QR91aiIJazYC0AEgDyAPKQPIASAJrYg3A8gBIAEgFUECdGogFkF/IAl0QX9zcSAHQQt2QQFxIAl0ckEBciIBQQJqIBN0IBZBH3RyNgIAIAhBoH8gAWdrOgAADAELIAlBgAFJDQAgASAVQQJ0akEANgIACyAiQRBzISIgAyAFQQRxaiEDIAZBEGohBiANIBVIDQALCyAKQQhxITggFEGwDGohKCAUQaAIaiEpIBRBkARqISUgH0EDTgRAIBVBA2whOSAVQQF0ITogJkEBayEgQQMgJkECayIBdCEtQQEgAXQhLiAVQQdqQQF2Qfz///8HcUEEaiE9ICsgJEF/c2oiAUEDdiIDQQJ0Ij5BBGohOyADQQFqIj9B/P///wNxIhxBAnQhPCAcQQN0IRIgAUEYSSFAQQIhGQNAIBkhEyALLQAAIRYgC0EAOgAAICJBb3FBAnMhIgJAIBVBAEwEQCATQQJqIRkMAQsgJSAUIBNBBHEbIREgE0ECaiEZIA4gEyAVbEECdGohCEEAIQogCyEGQQAhDQNAIA0hBSAGLQABQQV2QQRxIAogFkEHdnJyIgNBCHQgD0HgAWoQKkH/AHFBAXRyQbCNAWovAQAhAQJAIAMNACABQQAgAkECayIDQX9GGyEBIAJBAUoEQCADIQIMAQsgD0GAAmoQISECCyAPKQPoASFlIA8oAvABIUwgESARKAIAIAFBBHZBA3EgAUECdkEwcXIgInRyIgk2AgAgAUHAAHEiKkEFdiABQYABcSInQQZ2ciEKIEwgAUEHcSIDayEXIGUgA62IImCnIQ1BACEYAkAgFSAFQQJyTARAQQAhBwwBCyAKIAYtAAJBBXZBBHEgBi0AAUEHdnJyIgNBCHQgDUH/AHFBAXRyQbCNAWovAQAhBwJAIAMNACAHQQAgAkECayIDQX9GGyEHIAJBAUoEQCADIQIMAQsgD0GAAmoQISECCyAHQQV2IAdBBnZyQQJxIQogFyAHQQdxIgNrIRcgYCADrYgiYKchDQsgESAHQQJ0QYAGcSAHQTBxciAiQQRqdCAJcjYCAEEBIQlBASEDAkAgB0ECdkECcSABQQN2QQFxciIeRQ0AIA0gDUEHcUHknQFqLQAAIgNBA3EiDXYhCSAeQQNHBEBBASAJQX8gA0ECdkEHcSIYdEF/c3EgA0EFdmpBAWoiAyAeQQFGIh4bIQkgA0EBIB4bIQMgDSAYaiEYDAELIAlBB3FB5J0Bai0AACIeQQNxIjMgDSADQQJ2QQdxIhtqaiAeQQJ2QQdxIg1qIRggCSAzdiIJQX8gG3RBf3NxIANBBXZqQQFqIQNBfyANdEF/cyAJIBt2cSAeQQV2akEBaiEJCyAPIBcgGGs2AvABIA8gYCAYrYg3A+gBIAFB8AFxIg0gDUEBa3EEQCADIBZB/wBxIhYgBi0AAUH/AHEiFyAWIBdLGyIWQQJrIhdBACAWIBdPG2ohAwsgB0HwAXEiFyAXQQFrcQRAIAkgBi0AAUH/AHEiFiAGLQACQf8AcSIYIBYgGEsbIhZBAmtBACAWQQJLG2ohCQsgAyAsTSAJICxNcUUEQCAhBEBBACEHIB1BAUGN9wBBABAIDAkLQQAhByAdQQFBjfcAQQAQCAwICyAGLQACIRYgBkEAOwABIBcgDUEEdnJB/wFB/wEgBUEEaiINIBVrQQF0diANIBVMGyIXQdUAcSAXIBkgH0obIhhBf3NxBEAgIQRAQQAhByAdQQFBv9oAQQAQCAwJC0EAIQcgHUEBQb/aAEEAEAgMCAsCQAJAIAFBEHEEQCAPQcABahATIR4gDyAPKALQASADIAFBE3RBH3VqIhdrNgLQASAPIA8pA8gBIBetiDcDyAEgHkF/IBd0QX9zcSABQQh2QQFxIBd0ckEBckECaiAgdCAeQR90ciEXDAELQQAhFyAYQQFxRQ0BCyAIIBc2AgALAkAgAUEgcQRAIA9BwAFqEBMhHiAPIA8oAtABIAMgAUESdEEfdWoiF2s2AtABIA8gDykDyAEgF62INwPIASAIIBVBAnRqIB5BfyAXdEF/c3EgAUEJdkEBcSAXdHJBAXIiF0ECaiAgdCAeQR90cjYCACAGQSAgF2drIhcgBi0AAEH/AHEiHiAXIB5LG0GAAXI6AAAMAQsgGEECcUUNACAIIBVBAnRqQQA2AgALIAhBBGohHgJAAkAgKgRAIA9BwAFqEBMhGyAPIA8oAtABIAMgAUERdEEfdWoiF2s2AtABIA8gDykDyAEgF62INwPIASAbQX8gF3RBf3NxIAFBCnZBAXEgF3RyQQFyQQJqICB0IBtBH3RyIRcMAQtBACEXIBhBBHFFDQELIB4gFzYCAAsCQCAnBEAgD0HAAWoQEyEXIA8gDygC0AEgAyABQRB0QR91aiIDazYC0AEgDyAPKQPIASADrYg3A8gBIB4gFUECdGogF0F/IAN0QX9zcSABQQt2QQFxIAN0ckEBciIBQQJqICB0IBdBH3RyNgIAIAZBoH8gAWdrOgABDAELIBhBCHFFDQAgHiAVQQJ0akEANgIACyAIQQhqIQECQAJAIAdBEHEEQCAPQcABahATIRcgDyAPKALQASAJIAdBE3RBH3VqIgNrNgLQASAPIA8pA8gBIAOtiDcDyAEgF0F/IAN0QX9zcSAHQQh2QQFxIAN0ckEBckECaiAgdCAXQR90ciEDDAELQQAhAyAYQRBxRQ0BCyABIAM2AgALAkAgB0EgcQRAIA9BwAFqEBMhFyAPIA8oAtABIAkgB0ESdEEfdWoiA2s2AtABIA8gDykDyAEgA62INwPIASABIBVBAnRqIBdBfyADdEF/c3EgB0EJdkEBcSADdHJBAXIiAUECaiAgdCAXQR90cjYCACAGQSAgAWdrIgEgBi0AAUH/AHEiAyABIANLG0GAAXI6AAEMAQsgGEEgcUUNACABIBVBAnRqQQA2AgALIAhBDGohAQJAAkAgB0HAAHEEQCAPQcABahATIRcgDyAPKALQASAJIAdBEXRBH3VqIgNrNgLQASAPIA8pA8gBIAOtiDcDyAEgF0F/IAN0QX9zcSAHQQp2QQFxIAN0ckEBckECaiAgdCAXQR90ciEDDAELQQAhAyAYQcAAcUUNAQsgASADNgIACyAGQQJqIQYCQCAHQYABcQRAIA9BwAFqEBMhFyAPIA8oAtABIAkgB0EQdEEfdWoiA2s2AtABIA8gDykDyAEgA62INwPIASABIBVBAnRqIBdBfyADdEF/c3EgB0ELdkEBcSADdHJBAXIiAUECaiAgdCAXQR90cjYCACAGQaB/IAFnazoAAAwBCyAYQYABSQ0AIAEgFUECdGpBADYCAAsgIkEQcyEiIBEgBUEEcWohESAIQRBqIQggDSAVSA0ACwsCQCAMQQJJDQAgE0ECcUUNACAZQQRxIQMCQAJ/AkACQCAxBEAgFCAlIAMbIRZBACEYIBVBAEwNASAOIBNBAmsgFWxBAnRqIREDQCAPQYABahAqIQdBACEBIBYoAgAiCARAIBEgGEECdGohAUEAIQlBDyEGA0ACQCAGIAhxRQ0AIAZBkaLEiAFxIg0gCHEEQCABIAEoAgAgB0F/c0EBcSAgdHMgLnI2AgAgB0EBdiEHCyANQQF0IAhxBEAgASAVQQJ0aiIFIAUoAgAgB0F/c0EBcSAgdHMgLnI2AgAgB0EBdiEHCyANQQJ0IAhxBEAgASA6QQJ0aiIFIAUoAgAgB0F/c0EBcSAgdHMgLnI2AgAgB0EBdiEHCyANQQN0IAhxRQ0AIAEgOUECdGoiDSANKAIAIAdBf3NBAXEgIHRzIC5yNgIAIAdBAXYhBwsgAUEEaiEBIAZBBHQhBiAJQQFqIglBCEcNAAsgCGkhAQsgFkEEaiEWIA8gDygCkAEgAWs2ApABIA8gDykDiAEgAa2INwOIASAYQQhqIhggFUgNAAsLICkgKCADGyEFIBQgJSADGyEWIANFIRggFUEATA0DQQAhAyBADQEgBSAWIDtqSSAWIAUgO2oiB0lxDQFBACAFIgEgFiIGID5qQQhqSSAGQQRqIAdJcQ0CGiAGIDxqIQYgASA8aiEB/QwAAAAAAAAAAAAAAAAAAAAAIV5BACEHA0AgBSAHQQJ0IgNqIgkgAyAWaiID/QACACJfQQT9rQEgX0EE/asBIF4gX/0NDA0ODxAREhMUFRYXGBkaG0Ec/a0B/VD9UCBf/VAiXv0LAgAgCSBeIAP9AAIEQRz9qwH9UCJeQQH9rQH9DHd3d3d3d3d3d3d3d3d3d3f9TiBeQQH9qwH9DO7u7u7u7u7u7u7u7u7u7u79Tv1QIF79UCBf/U/9CwIAIF8hXiAHQQRqIgcgHEcNAAsgHCA/Rg0DIBIhAyBe/RsDDAILIANFIRggKSAoIAMbIQUMAgsgBSEBIBYhBkEACyEHA0AgB0EcdiEJIAEgBigCACIHQQR2IAkgB0EEdHJyIAdyIgk2AgAgASAJIAYoAgRBHHRyIglBAXZB9+7duwdxIAlBAXRB7t27935xciAJciAHQX9zcTYCACABQQRqIQEgBkEEaiEGIANBCGoiAyAVSA0ACwsgE0EGSQ0AQQAhCUEAIREgFiEBICkgKCAYGyIbIQcgFCAlIBgbIhchBgJAIBVBAEwiDQ0AA0AgAUEEaiEDIAcoAgAhCCABKAIAIQEgByA4BH8gCAUgAUEEdCARQRx2ciABQQR2ciADKAIAQRx0ciABckEDdEGIkaLEeHEgCHILIAYoAgBBf3NxNgIAIAZBBGohBiAHQQRqIQcgASERIAMhASAJQQhqIgkgFUgNAAsgDQ0AIA4gE0EGayAVbEECdGohQUEAIR4gFyERA0BBACEDIBsoAgAiAQRAIBUgHmshQkEAIQdBACEKA0AgByFNIA9BoAFqEBMhBwJAIAogCkEEaiIGIEIgBiAeaiAVSBsiM04iQwRAQQAhBgwBCyARKAIAQX9zISogQSAKIB5yQQJ0aiEYQQAhBkEPIAoiCUECdCJEdCINIQgDQAJAIAEgCHFFDQAgCEGRosSIAXEiJyABcQRAIAdBAXEEQCADICdyIQNBMiAJQQJ0dCAqcSABciEBCyAHQQF2IQcgBkEBaiEGCyABICdBAXQiNHEEQCAHQQFxBEAgAyA0ciEDIAFB9AAgCUECdHQgKnFyIQELIAdBAXYhByAGQQFqIQYLIAEgJ0ECdCI0cQRAIAdBAXEEQCADIDRyIQMgAUHoASAJQQJ0dCAqcXIhAQsgB0EBdiEHIAZBAWohBgsgASAnQQN0IidxRQ0AIAdBAXEEQCADICdyIQMgAUHAASAJQQJ0dCAqcXIhAQsgBkEBaiEGIAdBAXYhBwsgCEEEdCEIIAlBAWoiCSAzSA0ACyADIER2Qf//A3FFDQAgQw0AA0ACQCADIA1xRQ0AIA1BkaLEiAFxIgkgA3EEQCAYIBgoAgAgB0EfdHIgLXI2AgAgB0EBdiEHIAZBAWohBgsgCUEBdCADcQRAIBggFUECdGoiCCAIKAIAIAdBH3RyIC1yNgIAIAdBAXYhByAGQQFqIQYLIAlBAnQgA3EEQCAYIDpBAnRqIgggCCgCACAHQR90ciAtcjYCACAHQQF2IQcgBkEBaiEGCyAJQQN0IANxRQ0AIBggOUECdGoiCSAJKAIAIAdBH3RyIC1yNgIAIAZBAWohBiAHQQF2IQcLIA1BBHQhDSAYQQRqIRggCkEBaiIKIDNIDQALCyAPIA8oArABIAZrNgKwASAPIA8pA6gBIAatiDcDqAFBASEHQQQhCiBNQQFxRQ0ACyAbIBsoAgQgA0EbdkEOcSADQR12ciADQRx2ciARKAIEQX9zcXI2AgQLIBEoAgAgA3IiA0EDdkGRosSIAXEiAUEEdiABQQR0ciABciEGIB4EQCAFQQRrIgcgBygCACAWQQRrKAIAQX9zIAFBHHRxcjYCAAsgBSAFKAIAIAYgFigCAEF/c3FyNgIAIAUgBSgCBCAWKAIEQX9zIANBH3ZxcjYCBCAbQQRqIRsgEUEEaiERIAVBBGohBSAWQQRqIRYgHkEIaiIeIBVIDQALCyAXQQAgPRAOGgsgGSAfSA0ACwsCQCAMQQJJDQACQCAfQQNxQQFrIhZBAkkgMXEEQCAVQQBMDQFBASAmQQJrdCECIA4gH0H8//8HcSAVbEECdGohESAlIBQgH0EEcRshBSAmQQFrIQhBACEKIBVBDGwhDCAVQQN0IQsDQCAPQYABahAqIQdBACEBIAUoAgAiAwRAIBEgCkECdGohAUEPIQZBACEJA0ACQCADIAZxRQ0AIAZBkaLEiAFxIg0gA3EEQCABIAEoAgAgB0F/c0EBcSAIdHMgAnI2AgAgB0EBdiEHCyANQQF0IANxBEAgASAVQQJ0aiIdIB0oAgAgB0F/c0EBcSAIdHMgAnI2AgAgB0EBdiEHCyANQQJ0IANxBEAgASALaiIdIB0oAgAgB0F/c0EBcSAIdHMgAnI2AgAgB0EBdiEHCyANQQN0IANxRQ0AIAEgDGoiDSANKAIAIAdBf3NBAXEgCHRzIAJyNgIAIAdBAXYhBwsgAUEEaiEBIAZBBHQhBiAJQQFqIglBCEcNAAsgA2khAQsgBUEEaiEFIA8gDygCkAEgAWs2ApABIA8gDykDiAEgAa2INwOIASAKQQhqIgogFUgNAAsLIBZBAUsNACAVQQBMDQAgJSAUIB9BBHEiARshCSAoICkgARshAkEAIQMCfwJAICsgJEF/c2oiAUE4SQ0AIAIgCSABQQF2Qfz///8HcSIGQQRqIgdqSSAJIAIgB2oiB0lxDQAgAiAGIAlqQQhqSSAJQQRqIAdJcQ0AIAFBA3ZBAWoiDUH8////A3EiCEEDdCEDIAkgCEECdCIBaiEGIAEgAmohAf0MAAAAAAAAAAAAAAAAAAAAACFeQQAhBwNAIAIgB0ECdCIWaiIRIAkgFmoiFv0AAgAiX0EE/a0BIF9BBP2rASBeIF/9DQwNDg8QERITFBUWFxgZGhtBHP2tAf1Q/VAgX/1QIl79CwIAIBEgXiAW/QACBEEc/asB/VAiXkEB/a0B/Qx3d3d3d3d3d3d3d3d3d3d3/U4gXkEB/asB/Qzu7u7u7u7u7u7u7u7u7u7u/U79UCBe/VAgX/1P/QsCACBfIV4gB0EEaiIHIAhHDQALIAggDUYNAiBe/RsDDAELIAIhASAJIQZBAAshBwNAIAdBHHYhCSABIAYoAgAiB0EEdiAJIAdBBHRyciAHciIJNgIAIAEgCSAGKAIEQRx0ciIJQQF2Qffu3bsHcSAJQQF0Qe7du/d+cXIgCXIgB0F/c3E2AgAgAUEEaiEBIAZBBGohBiADQQhqIgMgFUgNAAsLIB8gH0EBakEDcWtBA2tBACAfQQZKGyIRIB9ODQBBAyAmQQJrdCEZICsgJEF/c2oiAUEDdiIDQQJ0IitBBGohHSADQQFqIgNB/P///wNxIhJBAnQhISASQQN0IRYgFUEMbCEsIBVBA3QhLSABQRhJISYgAyASRiEbA0ACQAJAAkACQAJ/AkAgHyARayIBQQFrIgNBA08EQEF/IRcgAUEFSA0FIBVBAEwNBiAlIBQgEUEEcSIBGyECICggKSABGyEJIDgEQEEAIQYgJg0EIAIgCSAdakkgAiAdaiAJS3ENBCACICFqIQEgCSAhaiEHA0AgCSAGQQJ0IgNqIgggCP0AAgAgAiADav0AAgD9T/0LAgAgBkEEaiIGIBJHDQALIBYhBiAbDQYMBQsgFCAlIAEbIQ1BACEDICYNASAJIA0gHWpJIA0gCSAdaiIBSXENASAJIA0gK2pBCGpJIA1BBGogAUlxDQEgCSACIB1qSSABIAJLcQ0BIAIgIWohCCAJICFqIQEgDSAhaiEH/QwAAAAAAAAAAAAAAAAAAAAAIV5BACEGA0AgCSAGQQJ0IgNqIgUgAyANaiIM/QACACJfQQT9rQEgX0EE/asBIF4gX/0NDA0ODxAREhMUFRYXGBkaG0Ec/a0B/VD9UCAM/QACBEEc/asB/VAgX/1QQQP9qwH9DIiIiIiIiIiIiIiIiIiIiIj9TiAF/QACAP1QIAIgA2r9AAIA/U/9CwIAIF8hXiAGQQRqIgYgEkcNAAsgGw0FIBYhAyBe/RsDDAILIANBAnRB7J0BaigCACEXDAQLIA0hByAJIQEgAiEIQQALIQYDQCAGQRx2IQkgASABKAIAIAcoAgAiBkEEdiAJIAZBBHRyciAHKAIEQRx0ciAGckEDdEGIkaLEeHFyIAgoAgBBf3NxNgIAIAhBBGohCCABQQRqIQEgB0EEaiEHIANBCGoiAyAVSA0ACwwCCyAJIQcgAiEBCwNAIAcgBygCACABKAIAQX9zcTYCACABQQRqIQEgB0EEaiEHIAZBCGoiBiAVSA0ACwsgFUEATA0AICUgFCARQQRxIgEbIQogKCApIAEbIQIgFCAlIAEbIRMgKSAoIAEbIR4gDiARIBVsQQJ0aiEuQQAhBQNAQQAhAyACKAIAIBdxIgEEQCAVIAVrISpBACEHQQAhDQNAIAchTiAPQaABahATIQcCQCANIA1BBGoiBiAqIAUgBmogFUgbIiROIicEQEEAIQYMAQsgFyAKKAIAQX9zcSEYIC4gBSANckECdGohC0EAIQZBDyANIglBAnQiHHQiICEIA0ACQCABIAhxRQ0AIAhBkaLEiAFxIiIgAXEEQCAHQQFxBEAgAyAiciEDQTIgCUECdHQgGHEgAXIhAQsgB0EBdiEHIAZBAWohBgsgASAiQQF0IjFxBEAgB0EBcQRAIAMgMXIhAyABQfQAIAlBAnR0IBhxciEBCyAHQQF2IQcgBkEBaiEGCyABICJBAnQiMXEEQCAHQQFxBEAgAyAxciEDIAFB6AEgCUECdHQgGHFyIQELIAdBAXYhByAGQQFqIQYLIAEgIkEDdCIicUUNACAHQQFxBEAgAyAiciEDIAFBwAEgCUECdHQgGHFyIQELIAZBAWohBiAHQQF2IQcLIAhBBHQhCCAJQQFqIgkgJEgNAAsgAyAcdkH//wNxRQ0AICcNAANAAkAgAyAgcUUNACAgQZGixIgBcSIJIANxBEAgCyALKAIAIAdBH3RyIBlyNgIAIAdBAXYhByAGQQFqIQYLIAlBAXQgA3EEQCALIBVBAnRqIgggCCgCACAHQR90ciAZcjYCACAHQQF2IQcgBkEBaiEGCyAJQQJ0IANxBEAgCyAtaiIIIAgoAgAgB0EfdHIgGXI2AgAgB0EBdiEHIAZBAWohBgsgCUEDdCADcUUNACALICxqIgkgCSgCACAHQR90ciAZcjYCACAGQQFqIQYgB0EBdiEHCyAgQQR0ISAgC0EEaiELIA1BAWoiDSAkSA0ACwsgDyAPKAKwASAGazYCsAEgDyAPKQOoASAGrYg3A6gBQQEhB0EEIQ0gTkEBcUUNAAsgAiACKAIEIANBG3ZBDnEgA0EddnIgA0EcdnIgCigCBEF/c3FyNgIECyAKKAIAIANyIgNBA3ZBkaLEiAFxIgFBBHYgAUEEdHIgAXIhBiAFBEAgHkEEayIHIAcoAgAgE0EEaygCAEF/cyABQRx0cXI2AgALIB4gHigCACAGIBMoAgBBf3NxcjYCACAeIB4oAgQgEygCBEF/cyADQR92cXI2AgQgAkEEaiECIApBBGohCiAeQQRqIR4gE0EEaiETIAVBCGoiBSAVSA0ACwsgEUEEaiIRIB9IDQALC0EBIQcgH0EATA0DIBVBAEwNAyAVQfz///8HcSIGQQJ0IQIgFUEESSEIQQAhCQNAIA4gCSAVbEECdGohAwJAAkAgCARAIAMhB0EAIQEMAQsgAiADaiEHQQAhAQNAIAMgAUECdGoiDSAN/QACACJe/Qz///9/////f////3////9//U4iX/2hASBfIF79DAAAAAAAAAAAAAAAAAAAAAD9Of1S/QsCACABQQRqIgEgBkcNAAsgBiIBIBVGDQELA0AgB0EAIAcoAgAiA0H/////B3EiDWsgDSADQQBIGzYCACAHQQRqIQcgAUEBaiIBIBVHDQALC0EBIQcgCUEBaiIJIB9HDQALDAMLICFFDQAgDyAaKAIYNgI0IA8gFjYCMCAdQQFB3cYAIA9BMGoQCAwBCyAPIAE2AhQgDyAWNgIQIB1BAUHdxgAgD0EQahAIQQAhBwwBC0EAIQcLIA9BsAJqJAAgBw0BDAMLIAQgAUEJdEHgqQFqNgJsAn8gBCgCdCEBAkACQCAaKAIQIBooAghrIgUgGigCFCAaKAIMayIJbCIDIAQoAoQBSwRAIAEQCSAEIANBAnQQFiIBNgJ0QQAgAUUNAxogBCADNgKEAQwBCyABRQ0BCyABQQAgA0ECdBAOGgsgBCgCeCEBAkAgBUECaiIGIAlBA2pBAnYiDEECamwiAyAEKAKIAU0EQCADQQJ0IQgMAQsgARAJIAQgA0ECdCIIEBYiATYCeCABDQBBAAwBCyAEIAM2AogBIAFBACAIEA4aAkAgBkUNACAEKAJ4IgchAQJAIAZBBE8EQCAHIAZBfHEiDUECdGohAUEAIQgDQCAHIAhBAnRq/QwAACBJAAAgSQAAIEkAACBJ/QsCACAIQQRqIgggDUcNAAsgBiANRg0BCwNAIAFBgICAyQQ2AgAgAUEEaiEBIA1BAWoiDSAGRw0ACwsgByAMQQFqIAZsQQJ0aiEDQQAhDQJAAkAgBkEESQRAIAMhAQwBCyADIAZBfHEiDUECdGohAUEAIQgDQCADIAhBAnRq/QwAACBJAAAgSQAAIEkAACBJ/QsCACAIQQRqIgggDUcNAAsgBiANRg0BCwNAIAFBgICAyQQ2AgAgAUEEaiEBIA1BAWoiDSAGRw0ACwsgCUEDcSIBRQ0AIAZFDQBBgICAyARBgICAwARBgICAgAQgAUECRhsgAUEBRhshCyAHIAYgDGxBAnRqIQNBACENAkAgBkEESQRAIAMhAQwBCyADIAZBfHEiDUECdGohASAL/REhX0EAIQgDQCADIAhBAnRqIF/9CwIAIAhBBGoiCCANRw0ACyAGIA1GDQELA0AgASALNgIAIAFBBGohASANQQFqIg0gBkcNAAsLIAQgCTYCgAEgBCAFNgJ8QQELRQ0CIBooAhwgEWoiGUEfTgRAICFFDQIgIyAZNgIQIB1BAkHWwAAgI0EQahAIDAMLIAQQU0EAIQEgBEHAqQE2AmQgBEHgngE2AmAgBEGAnwE2AhwCQAJAAkACQCAaKAI0IgdBAUsNACAEKAKQAUUNAiAHDQAMAQsgGigCBCEDIAdBBE8EQCAHQXxxIQJBACEGA0AgAyAGQQN0aiIBQRxqIAFBFGogAUEMaiAB/QkCBP1WAgAB/VYCAAL9VgIAAyBe/a4BIV4gBkEEaiIGIAJHDQALIF4gXiBe/Q0ICQoLDA0ODwABAgMAAQID/a4BIl4gXiBe/Q0EBQYHAAECAwABAgMAAQID/a4B/RsAIQEgAiAHRg0BCwNAIAMgAkEDdGooAgQgAWohASACQQFqIgIgB0cNAAsLIAFBAmoiAyAEKAKYAUsEQCAEKAKUASADEBAiBkUNBSAEIAY2ApQBIAEgBmpBADsAACAEIAM2ApgBIBooAjQhBwsgBCgClAEhHiAHRQ0BIBooAgQhBkEAIQJBACEBA0AgAiAeaiAGIAFBA3QiA2oiBigCACAGKAIEEAsaIBooAgQiBiADaigCBCACaiECIAFBAWoiASAaKAI0SQ0ACwwBCyAHQQFHDQEgGigCBCgCACEeCyAaKAI8IgEEQCAEKAJ0ISwgBCABNgJ0CyAaKAIsBEAgFkEIcSElIARBHGohDyAWQQFxIS0gFkECcUUhLkECIR8DQCAeIChqIQEgGigCACApQRhsaiIgKAIAIQMCQCAtIB9BAkkgGSAaKAIcQQRrTHFxIiIEQCAEIAE2AhQgBCABIANqIgM2AhggBCADLwAAOwFwIANB/wE6AAAgBCgCGEH/AToAASAEQQA2AgggBEEANgIAIAQgATYCEAwBCyAEIAE2AhQgBCABIANqIgY2AhggBCAGLwAAOwFwIAZB/wE6AAAgBCgCGEH/AToAASAEIARBHGo2AmggBCABNgIQIARBADYCDCAEIAMEfyABLQAAQRB0BUGAgPwHCyIDNgIAQQEhBiABQQFqIQkgAS0AASEHAn8gAS0AAEH/AUYEQCAHQZABTwRAIARBATYCDCADQYD+A3IMAgsgBCAJNgIQQQAhBiAHQQl0IANqDAELIAQgCTYCECAHQQh0IANyCyEBIAQgBjYCCCAEQYCAAjYCBCAEIAFBB3Q2AgALICAoAgAhKgJAIBlBAEwNACAgKAIIRQ0AICIgLnIhJ0EAISYDQAJAAkACQAJAAkAgH0EBaw4CAQIACyAiBEBBASAZdCIBQQF2IAFyIREgBCgCfCIFQQJ0Ig0gBCgCeGpBDGohASAEKAJ0IQZBACEIIAQoAoABIgNBBE8EQCAFRQ0FIAVBA2whAiAFQQF0IQxBACARayEJA0AgDEECdCELQQAhAwNAAkAgASIHKAIAIgFFDQACQCABQZCAgAFxDQAgAUHvA3FFDQAgBCgCACEBAkAgBCgCCCIQDQAgAUH/AUYhCiAEKAIQIhAtAAAhAQJAIApFBEAgBCABNgIAIAQgEEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIBBBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiEDYCCAJAIAEgEHZBAXFFDQACQCAQDQAgAUH/AUYhCiAEKAIQIhAtAAAhAQJAIApFBEAgBCABNgIAIAQgEEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIBBBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiEDYCCCAGIAkgESABIBB2QQFxIhAbNgIAIAQoAnwhASAHQQRrIgogCigCAEEgcjYCACAHIAcoAgRBCHI2AgQgByAHKAIAIBBBE3RyQRByNgIAICUNACAHQX4gAWtBAnRqIgEgASgCBEGAgAJyNgIEIAEgASgCACAQQR90ckGAgARyNgIAIAFBBGsiASABKAIAQYCACHI2AgALIAcgBygCAEGAgIABciIBNgIACwJAIAFBgIGACHENACABQfgecUUNACAEKAIAIQECQCAEKAIIIhANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIAcCfyABIBB2QQFxRQRAIAcoAgAMAQsCQCAQDQAgAUH/AUYhCiAEKAIQIhAtAAAhAQJAIApFBEAgBCABNgIAIAQgEEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIBBBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiEDYCCCAGIA1qIAkgESABIBB2QQFxIgEbNgIAIAdBBGsiECAQKAIAQYACcjYCACAHIAcoAgRBwAByNgIEIAcoAgAgAUEWdHJBgAFyC0GAgIAIciIBNgIACwJAIAFBgIiAwABxDQAgAUHA9wFxRQ0AIAQoAgAhAQJAIAQoAggiEA0AIAFB/wFGIQogBCgCECIQLQAAIQECQCAKRQRAIAQgATYCACAEIBBBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAQQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIhA2AgggBwJ/IAEgEHZBAXFFBEAgBygCAAwBCwJAIBANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIAYgC2ogCSARIAEgEHZBAXEiARs2AgAgB0EEayIQIBAoAgBBgBByNgIAIAcgBygCBEGABHI2AgQgBygCACABQRl0ckGACHILQYCAgMAAciIBNgIACyABQYDAgIAEcQ0AIAFBgLwPcUUNACAEKAIAIQECQCAEKAIIIhANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIAEgEHZBAXEEQCAGIAJBAnRqIU8CQCAQDQAgAUH/AUYhFCAEKAIQIhAtAAAhAQJAIBRFBEAgBCABNgIAIAQgEEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIBBBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiEDYCCCBPIAkgESABIBB2QQFxIhAbNgIAIAQoAnwhASAHQQRrIgogCigCAEGAgAFyNgIAIAcgBygCBEGAIHI2AgQgByAHKAIAIBBBHHRyQYDAAHI2AgAgByABQQJ0aiIBIAEoAgRBBHI2AgQgASABKAIMQQFyNgIMIAEgASgCCCAQQRJ0ckECcjYCCAsgByAHKAIAQYCAgIAEcjYCAAsgBkEEaiEGIAdBBGohASADQQFqIgMgBUcNAAsgB0EMaiEBIAYgAkECdGohBiAIQQRqIgggBCgCgAEiA0F8cUkNAAsLIAMgCE0NAyAFRQ0DQQAhE0EAIBFrIQsgAyEQA0ACQCAIIBBGBEAgCCEQDAELIAFBBGshDCABKAIAIQ1BACECA0ACQCANIAJBA2wiB3YiCUGQgIABcQ0AIAlB7wNxRQ0AIAQoAgAhAwJAIAQoAggiCQ0AIANB/wFHIRAgBCgCECIJLQAAIQMCQCAQRQRAIANBkAFPBEBB/wEhAyAEQf8BNgIADAILIAQgAzYCACAEIAlBAWo2AhBBByEJDAILIAQgAzYCACAEIAlBAWo2AhALQQghCQsgBCAJQQFrIgk2AggCQCADIAl2QQFxRQ0AIAYgAiAFbEECdGohUAJAIAkNACADQf8BRyENIAQoAhAiCS0AACEDAkAgDUUEQCADQZABTwRAQf8BIQMgBEH/ATYCAAwCCyAEIAM2AgAgBCAJQQFqNgIQQQchCQwCCyAEIAM2AgAgBCAJQQFqNgIQC0EIIQkLIAQgCUEBayIJNgIIIFAgCyARIAMgCXZBAXEiCRs2AgAgBCgCfCEQIAwgDCgCAEEgIAd0cjYCACABIAEoAgAgCUETdEEQciAHdHI2AgAgASABKAIEQQggB3RyNgIEIAIgJXJFBEAgAUF+IBBrQQJ0aiIDIAMoAgRBgIACcjYCBCADIAMoAgAgCUEfdHJBgIAEcjYCACADQQRrIgMgAygCAEGAgAhyNgIACyACQQNHDQAgASAQQQJ0aiIDIAMoAgRBBHI2AgQgAyADKAIMQQFyNgIMIAMgAygCCCAJQRJ0ckECcjYCCAsgASABKAIAQYCAgAEgB3RyIg02AgAgBCgCgAEhAwsgAyEQIAJBAWoiAiADIAhrSQ0ACwsgBkEEaiEGIAFBBGohASATQQFqIhMgBUcNAAsMAwtBACEHQQAhDUEAIRcCQAJAAkACQCAEKAJ8IhBBwABHDQAgBCgCgAFBwABHDQBBAEEBIBl0IgFBAXYgAXIiEWshBSAEQRxqIRAgBCgCeEGMAmohBiAEKAIIIQggBCgCBCEDIAQoAgAhAiAEKAJoIQwgBCgCdCEBIBZBCHENAQNAQQAhFwNAIAEhCSAGIgcoAgAiBgRAAkAgBkGQgIABcQ0AIAZB7wNxIgFFDQAgAyAQIAQoAmwgAWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siFBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBQbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyIUG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiAUGwwBCyALKAIECwR/IAMgECAHKAIEQRF2QQRxIAdBBGsiCigCAEETdkEBcSAGQQ52QRBxIAZBEHZBwABxIAZBqgFxcnJyciIUQeC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB4LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCACAKIAooAgBBIHI2AgAgByAHKAIEQQhyNgIEIAdBjAJrIgsgCygCAEGAgAhyNgIAIAdBhAJrIgsgCygCAEGAgAJyNgIAIAdBiAJrIgsgCygCACABQR90ckGAgARyNgIAIAYgAUETdHJBEHIFIAYLQYCAgAFyIQYLAkAgBkGAgYAIcQ0AIAZB+B5xRQ0AIAMgECAEKAJsIAZBA3YiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEUdkEEcSAHQQRrIgooAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSAUQaoBcXJycnIiFEHguQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQeC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoACIAogCigCAEGAAnI2AgAgByAHKAIEQcAAcjYCBCAGIAFBFnRyQYABcgUgBgtBgICACHIhBgsCQCAGQYCIgMAAcQ0AIAZBwPcBcUUNACADIBAgBCgCbCAGQQZ2IhRB7wNxai0AAEECdGoiDCgCACILKAIAIgFrIQMCfyABIAJBEHZLBEAgCygCBCEKIAwgC0EIQQwgASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIAogCkUgExsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIQogDCALQQxBCCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAKRSAKIBMbDAELIAsoAgQLBH8gAyAQIAcoAgRBF3ZBBHEgB0EEayIKKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgFEGqAXFycnJyIhRB4LkBai0AAEECdGoiDCgCACILKAIAIgFrIQMgFEHguwFqLQAAIRMgCSAFIBECfyABIAJBEHZLBEAgCygCBCEUIAwgC0EIQQwgASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBQgFEUgDhsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIRQgDCALQQxBCCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAURSAUIA4bDAELIAsoAgQLIBNzIgEbNgKABCAKIAooAgBBgBByNgIAIAcgBygCBEGABHI2AgQgBiABQRl0ckGACHIFIAYLQYCAgMAAciEGCwJAIAZBgMCAgARxDQAgBkGAvA9xRQ0AIAMgECAEKAJsIAZBCXYiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEadkEEcSAHQQRrIgooAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSAUQaoBcXJycnIiFEHguQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQeC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoAGIAogCigCAEGAgAFyNgIAIAcgBygCBEGAIHI2AgQgByAHKAKEAkEEcjYChAIgByAHKAKMAkEBcjYCjAIgByAHKAKIAiABQRJ0ckECcjYCiAIgBiABQRx0ckGAwAByBSAGC0GAgICABHIhBgsgByAGNgIACyAHQQRqIQYgCUEEaiEBIBdBAWoiF0HAAEcNAAsgB0EMaiEGIAlBhAZqIQEgDUE8SSFRIA1BBGohDSBRDQALDAILQQEgGXQiAUEBdiABciENIAQoAngiCSAQQQJ0akEMaiEGIAQoAoABIQEgBCgCCCEIIAQoAgQhAyAEKAIAIQIgBCgCaCEMIAQoAnQhEQJAIBZBCHEEQAJAIAFBBEkNACAQBEBBACANayEUIARBHGohBSAQQQxsIRMgEEEDdCEVA0BBACELA0AgBiIJKAIAIgYEQAJAIAZBkICAAXENACAGQe8DcSIBRQ0AIAMgBSAEKAJsIAFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAwJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIQ4gDCAKQQxBCCABIANLIhIbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAORSAOIBIbDAELIAooAgQhDiAMIApBCEEMIAEgA0siEhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAOIA5FIBIbCwR/IAMgBSAJKAIEQRF2QQRxIAlBBGsiDigCAEETdkEBcSAGQQ52QRBxIAZBEHZBwABxIAZBqgFxcnJyciISQeC5AWotAABBAnRqIgwoAgAiCigCACIBayEDIBJB4LsBai0AACEYIBEgFCANAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhEiAMIApBDEEIIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBJFIBIgGxsMAQsgCigCBCESIAwgCkEIQQwgASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBIgEkUgGxsLIBhzIgEbNgIAIA4gDigCAEEgcjYCACAJIAkoAgRBCHI2AgQgBiABQRN0ckEQcgUgBgtBgICAAXIhBgsCQCAGQYCBgAhxDQAgBkH4HnFFDQAgAyAFIAQoAmwgBkEDdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBFHZBBHEgCUEEayIOKAIAQRZ2QQFxIAZBD3ZBEHEgBkETdkHAAHEgEkGqAXFycnJyIhJB4LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHguwFqLQAAIRggESAQQQJ0aiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiARs2AgAgDiAOKAIAQYACcjYCACAJIAkoAgRBwAByNgIEIAYgAUEWdHJBgAFyBSAGC0GAgIAIciEGCwJAIAZBgIiAwABxDQAgBkHA9wFxRQ0AIAMgBSAEKAJsIAZBBnYiEkHvA3FqLQAAQQJ0aiIMKAIAIgooAgAiAWshAwJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIQ4gDCAKQQxBCCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAORSAOIBgbDAELIAooAgQhDiAMIApBCEEMIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAOIA5FIBgbCwR/IAMgBSAJKAIEQRd2QQRxIAlBBGsiDigCAEEZdkEBcSAGQRJ2QRBxIAZBFnZBwABxIBJBqgFxcnJyciISQeC5AWotAABBAnRqIgwoAgAiCigCACIBayEDIBJB4LsBai0AACEYIBEgFWogFCANAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhEiAMIApBDEEIIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBJFIBIgGxsMAQsgCigCBCESIAwgCkEIQQwgASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBIgEkUgGxsLIBhzIgEbNgIAIA4gDigCAEGAEHI2AgAgCSAJKAIEQYAEcjYCBCAGIAFBGXRyQYAIcgUgBgtBgICAwAByIQYLAkAgBkGAwICABHENACAGQYC8D3FFDQAgAyAFIAQoAmwgBkEJdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBGnZBBHEgCUEEayIOKAIAQRx2QQFxIAZBFXZBEHEgBkEZdkHAAHEgEkGqAXFycnJyIhJB4LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHguwFqLQAAIRggESATaiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiChs2AgAgDiAOKAIAQYCAAXI2AgAgCSAJKAIEQYAgcjYCBCAEKAJ8QQJ0IAlqIgEgASgCBEEEcjYCBCABIAEoAgxBAXI2AgwgASABKAIIIApBEnRyQQJyNgIIIAYgCkEcdHJBgMAAcgUgBgtBgICAgARyIQYLIAkgBjYCAAsgCUEEaiEGIBFBBGohESALQQFqIgsgEEcNAAsgCUEMaiEGIBEgE2ohESAHQQRqIgcgBCgCgAEiAUF8cUkNAAsMAQtBBCABQXxxIgYgBkEETRtBAWsiBkF8cUEEaiEHIAkgBkEBdEF4cWpBFGohBgsgBCAINgIIIAQgAzYCBCAEIAI2AgAgBCAMNgJoIBBFDQEgASAHTQ0BA0AgASAHRiFSQQAhCCAHIQEgUkUEQANAIAQgBiARIAggEGxBAnRqIA0gCCAEKAJ8QQJqQQEQUiAIQQFqIgggBCgCgAEiASAHa0kNAAsLIAZBBGohBiARQQRqIREgF0EBaiIXIBBHDQALDAELAkAgAUEESQ0AIBAEQEEAIA1rIRQgBEEcaiEFIBBBDGwhEyAQQQN0IRUDQEEAIQsDQCAGIgkoAgAiBgRAAkAgBkGQgIABcQ0AIAZB7wNxIgFFDQAgAyAFIAQoAmwgAWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siEhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gEhsMAQsgCigCBCEOIAwgCkEIQQwgASADSyISG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgEhsLBH8gAyAFIAkoAgRBEXZBBHEgCUEEayIOKAIAQRN2QQFxIAZBDnZBEHEgBkEQdkHAAHEgBkGqAXFycnJyIhJB4LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHguwFqLQAAIRggESAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiChs2AgAgDiAOKAIAQSByNgIAIAkgCSgCBEEIcjYCBCAJQX4gBCgCfGtBAnRqIgEgASgCBEGAgAJyNgIEIAEgASgCACAKQR90ckGAgARyNgIAIAFBBGsiASABKAIAQYCACHI2AgAgBiAKQRN0ckEQcgUgBgtBgICAAXIhBgsCQCAGQYCBgAhxDQAgBkH4HnFFDQAgAyAFIAQoAmwgBkEDdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBFHZBBHEgCUEEayIOKAIAQRZ2QQFxIAZBD3ZBEHEgBkETdkHAAHEgEkGqAXFycnJyIhJB4LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHguwFqLQAAIRggESAQQQJ0aiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiARs2AgAgDiAOKAIAQYACcjYCACAJIAkoAgRBwAByNgIEIAYgAUEWdHJBgAFyBSAGC0GAgIAIciEGCwJAIAZBgIiAwABxDQAgBkHA9wFxRQ0AIAMgBSAEKAJsIAZBBnYiEkHvA3FqLQAAQQJ0aiIMKAIAIgooAgAiAWshAwJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIQ4gDCAKQQxBCCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAORSAOIBgbDAELIAooAgQhDiAMIApBCEEMIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAOIA5FIBgbCwR/IAMgBSAJKAIEQRd2QQRxIAlBBGsiDigCAEEZdkEBcSAGQRJ2QRBxIAZBFnZBwABxIBJBqgFxcnJyciISQeC5AWotAABBAnRqIgwoAgAiCigCACIBayEDIBJB4LsBai0AACEYIBEgFWogFCANAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhEiAMIApBDEEIIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBJFIBIgGxsMAQsgCigCBCESIAwgCkEIQQwgASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBIgEkUgGxsLIBhzIgEbNgIAIA4gDigCAEGAEHI2AgAgCSAJKAIEQYAEcjYCBCAGIAFBGXRyQYAIcgUgBgtBgICAwAByIQYLAkAgBkGAwICABHENACAGQYC8D3FFDQAgAyAFIAQoAmwgBkEJdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBGnZBBHEgCUEEayIOKAIAQRx2QQFxIAZBFXZBEHEgBkEZdkHAAHEgEkGqAXFycnJyIhJB4LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHguwFqLQAAIRggESATaiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiChs2AgAgDiAOKAIAQYCAAXI2AgAgCSAJKAIEQYAgcjYCBCAEKAJ8QQJ0IAlqIgEgASgCBEEEcjYCBCABIAEoAgxBAXI2AgwgASABKAIIIApBEnRyQQJyNgIIIAYgCkEcdHJBgMAAcgUgBgtBgICAgARyIQYLIAkgBjYCAAsgCUEEaiEGIBFBBGohESALQQFqIgsgEEcNAAsgCUEMaiEGIBEgE2ohESAHQQRqIgcgBCgCgAEiAUF8cUkNAAsMAQtBBCABQXxxIgYgBkEETRtBAWsiBkF8cUEEaiEHIAkgBkEBdEF4cWpBFGohBgsgBCAINgIIIAQgAzYCBCAEIAI2AgAgBCAMNgJoIBBFDQAgASAHTQ0AA0AgASAHRiFTQQAhCCAHIQEgU0UEQANAIAQgBiARIAggEGxBAnRqIA0gCCAEKAJ8QQJqQQAQUiAIQQFqIgggBCgCgAEiASAHa0kNAAsLIAZBBGohBiARQQRqIREgF0EBaiIXIBBHDQALCwwCCwNAQQAhFwNAIAEhCSAGIgcoAgAiBgRAAkAgBkGQgIABcQ0AIAZB7wNxIgFFDQAgAyAQIAQoAmwgAWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siFBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBQbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyIUG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiAUGwwBCyALKAIECwR/IAMgECAHKAIEQRF2QQRxIAdBBGsiCigCAEETdkEBcSAGQQ52QRBxIAZBEHZBwABxIAZBqgFxcnJyciIUQeC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB4LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCACAKIAooAgBBIHI2AgAgByAHKAIEQQhyNgIEIAYgAUETdHJBEHIFIAYLQYCAgAFyIQYLAkAgBkGAgYAIcQ0AIAZB+B5xRQ0AIAMgECAEKAJsIAZBA3YiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEUdkEEcSAHQQRrIgooAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSAUQaoBcXJycnIiFEHguQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQeC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoACIAogCigCAEGAAnI2AgAgByAHKAIEQcAAcjYCBCAGIAFBFnRyQYABcgUgBgtBgICACHIhBgsCQCAGQYCIgMAAcQ0AIAZBwPcBcUUNACADIBAgBCgCbCAGQQZ2IhRB7wNxai0AAEECdGoiDCgCACILKAIAIgFrIQMCfyABIAJBEHZLBEAgCygCBCEKIAwgC0EIQQwgASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIAogCkUgExsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIQogDCALQQxBCCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAKRSAKIBMbDAELIAsoAgQLBH8gAyAQIAcoAgRBF3ZBBHEgB0EEayIKKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgFEGqAXFycnJyIhRB4LkBai0AAEECdGoiDCgCACILKAIAIgFrIQMgFEHguwFqLQAAIRMgCSAFIBECfyABIAJBEHZLBEAgCygCBCEUIAwgC0EIQQwgASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBQgFEUgDhsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIRQgDCALQQxBCCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAURSAUIA4bDAELIAsoAgQLIBNzIgEbNgKABCAKIAooAgBBgBByNgIAIAcgBygCBEGABHI2AgQgBiABQRl0ckGACHIFIAYLQYCAgMAAciEGCwJAIAZBgMCAgARxDQAgBkGAvA9xRQ0AIAMgECAEKAJsIAZBCXYiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEadkEEcSAHQQRrIgooAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSAUQaoBcXJycnIiFEHguQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQeC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoAGIAogCigCAEGAgAFyNgIAIAcgBygCBEGAIHI2AgQgByAHKAKEAkEEcjYChAIgByAHKAKMAkEBcjYCjAIgByAHKAKIAiABQRJ0ckECcjYCiAIgBiABQRx0ckGAwAByBSAGC0GAgICABHIhBgsgByAGNgIACyAHQQRqIQYgCUEEaiEBIBdBAWoiF0HAAEcNAAsgB0EMaiEGIAlBhAZqIQEgDUE8SSFUIA1BBGohDSBUDQALCyAEIAg2AgggBCADNgIEIAQgAjYCACAEIAw2AmgLDAILICIEQEEBIBl0QQF2IQkgBCgCfCIRQQJ0IgwgBCgCeGpBDGohASAEKAJ0IQZBACENIAQoAoABIgNBBE8EQCARRQ0EIBFBA2whBSARQQF0IQtBACAJayECA0AgC0ECdCEKQQAhAwNAAkAgASIHKAIAIgFFDQAgAUGQgIABcUEQRgRAIAQoAgAhAQJAIAQoAggiEA0AIAFB/wFGIRAgBCgCECIILQAAIQECQCAQRQRAIAQgATYCACAEIAhBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAIQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIgg2AgggBiACIAkgASAIdkEBcSAGKAIAIgFBH3ZGGyABajYCACAHIAcoAgBBgIDAAHIiATYCAAsgAUGAgYAIcUGAAUYEQCAEKAIAIQECQCAEKAIIIhANACABQf8BRiEQIAQoAhAiCC0AACEBAkAgEEUEQCAEIAE2AgAgBCAIQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgCEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIINgIIIAYgDGoiECACIAkgASAIdkEBcSAQKAIAIgFBH3ZGGyABajYCACAHIAcoAgBBgICABHIiATYCAAsgAUGAiIDAAHFBgAhGBEAgBCgCACEBAkAgBCgCCCIQDQAgAUH/AUYhECAEKAIQIggtAAAhAQJAIBBFBEAgBCABNgIAIAQgCEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIAhBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiCDYCCCAGIApqIhAgAiAJIAEgCHZBAXEgECgCACIBQR92RhsgAWo2AgAgByAHKAIAQYCAgCByIgE2AgALIAFBgMCAgARxQYDAAEcNACAGIAVBAnRqIRAgBCgCACEBAkAgBCgCCCIIDQAgAUH/AUYhFCAEKAIQIggtAAAhAQJAIBRFBEAgBCABNgIAIAQgCEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIAhBAWo2AhBBByEIDAILQf8BIQEgBEH/ATYCAAtBCCEICyAEIAhBAWsiCDYCCCAQIAIgCSABIAh2QQFxIBAoAgAiAUEfdkYbIAFqNgIAIAcgBygCAEGAgICAAnI2AgALIAZBBGohBiAHQQRqIQEgA0EBaiIDIBFHDQALIAdBDGohASAGIAVBAnRqIQYgDUEEaiINIAQoAoABIgNBfHFJDQALCyADIA1NDQIgEUUNAkEAIRNBACAJayEFIAMhBwNAAkAgByANRgRAIA0hBwwBCyABKAIAIRBBACECA0BBkICAASACQQNsIgd0IBBxQRAgB3RGBEAgBiACIBFsQQJ0aiEQIAQoAgAhAwJAIAQoAggiCA0AIANB/wFHIQwgBCgCECIILQAAIQMCQCAMRQRAIANBkAFPBEBB/wEhAyAEQf8BNgIADAILIAQgAzYCACAEIAhBAWo2AhBBByEIDAILIAQgAzYCACAEIAhBAWo2AhALQQghCAsgBCAIQQFrIgg2AgggECAFIAkgAyAIdkEBcSAQKAIAIgNBH3ZGGyADajYCACABIAEoAgBBgIDAACAHdHIiEDYCACAEKAKAASEDCyADIQcgAkEBaiICIAMgDWtJDQALCyAGQQRqIQYgAUEEaiEBIBNBAWoiEyARRw0ACwwCCyAEKAJ4IQggBCgCdCEHIAQoAoABIQMCQCAEKAJ8IgxBwABHDQAgA0HAAEcNACAIQYwCaiEDQQAhE0EAQQEgGXRBAXYiBWshDCAEKAIIIQIgBCgCBCEGIAQoAgAhASAEKAJoIQ0DQEEAIQgDQCAHIQkgAyIQKAIAIgcEQCADIVUgB0GQgIABcUEQRgRAIAYgD0EQQQ9BDiAHQe8DcRsgB0GAgMAAcRtBAnRqIg0oAgAiESgCACIDayEGAn8gAyABQRB2SwRAIBEoAgQhCyANIBFBCEEMIAMgBksiChtqKAIANgIAA0ACQCACDQAgBCgCECICQQFqIREgAi0AASEGIAItAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECDAILIAQgETYCECAGQQl0IAFqIQFBByECDAELIAQgETYCEEEIIQIgBkEIdCABaiEBCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiALIAtFIAobDAELIAEgA0EQdGshASAGQYCAAnFFBEAgESgCBCELIA0gEUEMQQggAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQMgAi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIANBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiADQQh0IAFqIQELIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgC0UgCyAKGwwBCyARKAIECyEDIAkgDCAFIAMgCSgCACIRQR92RhsgEWo2AgAgB0GAgMAAciEHCyAHQYCBgAhxQYABRgRAIAYgD0EQQQ9BDiAHQfgecRsgB0GAgIAEcRtBAnRqIg0oAgAiESgCACIDayEGAn8gAyABQRB2SwRAIBEoAgQhCyANIBFBCEEMIAMgBksiChtqKAIANgIAA0ACQCACDQAgBCgCECICQQFqIREgAi0AASEGIAItAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECDAILIAQgETYCECAGQQl0IAFqIQFBByECDAELIAQgETYCEEEIIQIgBkEIdCABaiEBCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiALIAtFIAobDAELIAEgA0EQdGshASAGQYCAAnFFBEAgESgCBCELIA0gEUEMQQggAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQMgAi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIANBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiADQQh0IAFqIQELIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgC0UgCyAKGwwBCyARKAIECyEDIAkgDCAFIAMgCSgCgAIiEUEfdkYbIBFqNgKAAiAHQYCAgARyIQcLIAdBgIiAwABxQYAIRgRAIAYgD0EQQQ9BDiAHQcD3AXEbIAdBgICAIHEbQQJ0aiINKAIAIhEoAgAiA2shBgJ/IAMgAUEQdksEQCARKAIEIQsgDSARQQhBDCADIAZLIgobaigCADYCAANAAkAgAg0AIAQoAhAiAkEBaiERIAItAAEhBiACLQAAQf8BRgRAIAZBkAFPBEAgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgwCCyAEIBE2AhAgBkEJdCABaiEBQQchAgwBCyAEIBE2AhBBCCECIAZBCHQgAWohAQsgAkEBayECIAFBAXQhASADQQF0IgNBgIACSQ0ACyADIQYgCyALRSAKGwwBCyABIANBEHRrIQEgBkGAgAJxRQRAIBEoAgQhCyANIBFBDEEIIAMgBksiChtqKAIANgIAA0ACQCACDQAgBCgCECICQQFqIREgAi0AASEDIAItAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECDAILIAQgETYCECADQQl0IAFqIQFBByECDAELIAQgETYCEEEIIQIgA0EIdCABaiEBCyACQQFrIQIgAUEBdCEBIAZBAXQiBkGAgAJJDQALIAtFIAsgChsMAQsgESgCBAshAyAJIAwgBSADIAkoAoAEIhFBH3ZGGyARajYCgAQgB0GAgIAgciEHCyBVIAdBgMCAgARxQYDAAEYEfyAGIA9BEEEPQQ4gB0GAvA9xGyAHQYCAgIACcRtBAnRqIg0oAgAiESgCACIDayEGAn8gAyABQRB2SwRAIBEoAgQhCyANIBFBCEEMIAMgBksiChtqKAIANgIAA0ACQCACDQAgBCgCECICQQFqIREgAi0AASEGIAItAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECDAILIAQgETYCECAGQQl0IAFqIQFBByECDAELIAQgETYCEEEIIQIgBkEIdCABaiEBCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiALIAtFIAobDAELIAEgA0EQdGshASAGQYCAAnFFBEAgESgCBCELIA0gEUEMQQggAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQMgAi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIANBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiADQQh0IAFqIQELIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgC0UgCyAKGwwBCyARKAIECyEDIAkgDCAFIAMgCSgCgAYiEUEfdkYbIBFqNgKABiAHQYCAgIACcgUgBws2AgALIBBBBGohAyAJQQRqIQcgCEEBaiIIQcAARw0ACyAQQQxqIQMgCUGEBmohByATQTxJIVYgE0EEaiETIFYNAAsgBCACNgIIIAQgBjYCBCAEIAE2AgAgBCANNgJoDAILQQEgGXRBAXYhCyAIIAxBAnQiDmpBDGohCSAEKAIIIQIgBCgCBCEGIAQoAgAhASAEKAJoIQ1BACERAkAgA0EESQ0AIAwEQCAMQQNsIRQgDEEBdCEXQQAgC2shCgNAIBdBAnQhEkEAIQgDQCAJIgUoAgAiEARAIBBBkICAAXFBEEYEQCAGIA9BEEEPQQ4gEEHvA3EbIBBBgIDAAHEbQQJ0aiINKAIAIgkoAgAiA2shBgJ/IAMgAUEQdk0EQCABIANBEHRrIQEgBkGAgAJxBEAgCSgCBAwCCyAJKAIEIRMgDSAJQQxBCCADIAZLIhUbaigCADYCAANAAkAgAg0AIAQoAhAiCUEBaiECIAktAAEhAyAJLQAAQf8BRwRAIAQgAjYCEEEIIQIgA0EIdCABaiEBDAELIANBjwFNBEAgBCACNgIQIANBCXQgAWohAUEHIQIMAQsgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgsgAkEBayECIAFBAXQhASAGQQF0IgZBgIACSQ0ACyATRSATIBUbDAELIAkoAgQhEyANIAlBCEEMIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEGIAktAABB/wFHBEAgBCACNgIQQQghAiAGQQh0IAFqIQEMAQsgBkGPAU0EQCAEIAI2AhAgBkEJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiATIBNFIBUbCyEDIAcgCiALIAMgBygCACIJQR92RhsgCWo2AgAgEEGAgMAAciEQCyAQQYCBgAhxQYABRgRAIAYgD0EQQQ9BDiAQQfgecRsgEEGAgIAEcRtBAnRqIg0oAgAiCSgCACIDayEGAn8gAyABQRB2TQRAIAEgA0EQdGshASAGQYCAAnEEQCAJKAIEDAILIAkoAgQhEyANIAlBDEEIIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEDIAktAABB/wFHBEAgBCACNgIQQQghAiADQQh0IAFqIQEMAQsgA0GPAU0EQCAEIAI2AhAgA0EJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIAZBAXQiBkGAgAJJDQALIBNFIBMgFRsMAQsgCSgCBCETIA0gCUEIQQwgAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQYgCS0AAEH/AUcEQCAEIAI2AhBBCCECIAZBCHQgAWohAQwBCyAGQY8BTQRAIAQgAjYCECAGQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIBMgE0UgFRsLIQMgByAOaiIJIAogCyADIAkoAgAiCUEfdkYbIAlqNgIAIBBBgICABHIhEAsgEEGAiIDAAHFBgAhGBEAgBiAPQRBBD0EOIBBBwPcBcRsgEEGAgIAgcRtBAnRqIg0oAgAiCSgCACIDayEGAn8gAyABQRB2TQRAIAEgA0EQdGshASAGQYCAAnEEQCAJKAIEDAILIAkoAgQhEyANIAlBDEEIIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEDIAktAABB/wFHBEAgBCACNgIQQQghAiADQQh0IAFqIQEMAQsgA0GPAU0EQCAEIAI2AhAgA0EJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIAZBAXQiBkGAgAJJDQALIBNFIBMgFRsMAQsgCSgCBCETIA0gCUEIQQwgAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQYgCS0AAEH/AUcEQCAEIAI2AhBBCCECIAZBCHQgAWohAQwBCyAGQY8BTQRAIAQgAjYCECAGQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIBMgE0UgFRsLIQMgByASaiIJIAogCyADIAkoAgAiCUEfdkYbIAlqNgIAIBBBgICAIHIhEAsgBSAQQYDAgIAEcUGAwABGBH8gBiAPQRBBD0EOIBBBgLwPcRsgEEGAgICAAnEbQQJ0aiINKAIAIgkoAgAiA2shBgJ/IAMgAUEQdk0EQCABIANBEHRrIQEgBkGAgAJxBEAgCSgCBAwCCyAJKAIEIRMgDSAJQQxBCCADIAZLIhUbaigCADYCAANAAkAgAg0AIAQoAhAiCUEBaiECIAktAAEhAyAJLQAAQf8BRwRAIAQgAjYCEEEIIQIgA0EIdCABaiEBDAELIANBjwFNBEAgBCACNgIQIANBCXQgAWohAUEHIQIMAQsgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgsgAkEBayECIAFBAXQhASAGQQF0IgZBgIACSQ0ACyATRSATIBUbDAELIAkoAgQhEyANIAlBCEEMIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEGIAktAABB/wFHBEAgBCACNgIQQQghAiAGQQh0IAFqIQEMAQsgBkGPAU0EQCAEIAI2AhAgBkEJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiATIBNFIBUbCyEDIAcgFEECdGoiCSAKIAsgAyAJKAIAIglBH3ZGGyAJajYCACAQQYCAgIACcgUgEAs2AgALIAVBBGohCSAHQQRqIQcgCEEBaiIIIAxHDQALIAVBDGohCSAHIBRBAnRqIQcgEUEEaiIRIAQoAoABIgNBfHFJDQALDAELQQQgA0F8cSIJIAlBBE0bQQFrIglBfHFBBGohESAIIAlBAXRBeHFqQRRqIQkLIAQgAjYCCCAEIAY2AgQgBCABNgIAIAQgDTYCaCAMRQ0BIAMgEU0NAUEAIRNBACALayEUIAMhAQNAAkAgASARRgRAIBEhAQwBCyAJKAIAIQJBACEQA0BBkICAASAQQQNsIgh0IAJxQRAgCHRGBEAgByAMIBBsQQJ0aiEFIAQgD0EQQQ9BDiACIAh2IgFB7wNxGyABQYCAwABxG0ECdGoiDTYCaCAEIAQoAgQgDSgCACICKAIAIgFrIgM2AgQCfyABIAQoAgAiBkEQdksEQCACKAIEIQogBCABNgIEIA0gAkEIQQwgASADSyIOG2ooAgA2AgAgBCgCCCECA0ACQCACDQAgBCgCECICQQFqIQ0gAi0AASEDIAItAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBkGA/gNqIQZBCCECDAILIAQgDTYCECADQQl0IAZqIQZBByECDAELIAQgDTYCEEEIIQIgA0EIdCAGaiEGCyAEIAJBAWsiAjYCCCAEIAZBAXQiBjYCACAEIAFBAXQiATYCBCABQYCAAkkNAAsgCiAKRSAOGwwBCyAEIAYgAUEQdGsiBjYCACADQYCAAnFFBEAgAigCBCEKIA0gAkEMQQggASADSyIOG2ooAgA2AgAgBCgCCCECA0ACQCACDQAgBCgCECICQQFqIQ0gAi0AASEBIAItAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgBkGA/gNqIQZBCCECDAILIAQgDTYCECABQQl0IAZqIQZBByECDAELIAQgDTYCEEEIIQIgAUEIdCAGaiEGCyAEIAJBAWsiAjYCCCAEIAZBAXQiBjYCACAEIANBAXQiAzYCBCADQYCAAkkNAAsgCkUgCiAOGwwBCyACKAIECyEBIAUgFCALIAEgBSgCACIDQR92RhsgA2o2AgAgCSAJKAIAQYCAwAAgCHRyIgI2AgAgBCgCgAEhAwsgEEEBaiIQIAMiASARa0kNAAsLIAlBBGohCSAHQQRqIQcgE0EBaiITIAxHDQALDAELQQAhEUEAIRcCQAJAAkACQCAEKAJ8IhRBwABHDQAgBCgCgAFBwABHDQBBAEEBIBl0IgFBAXYgAXIiFGshEyAEQeQAaiEIIARB4ABqIRAgBEEcaiELIAQoAnhBjAJqIQYgBCgCCCEFIAQoAgQhASAEKAIAIQIgBCgCaCEJIAQoAnQhAyAWQQhxDQEDQEEAIQwDQCADIRECQAJAAn8CQAJAIAYiDSgCACIGRQRAIAEgECgCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEHIBAgA0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohCSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgChsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQcgECADQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAobDAELIAMoAgQLRQRAIBAhCQwGCyABIAgoAgAiAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhByAIIANBCEEMIAEgBkkiChtqKAIAIgM2AgADQAJAIAUNACAEKAIQIglBAWohBSAJLQABIQEgCS0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgChsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQcgCCADQQxBCCABIAZJIgobaigCACIDNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEGIAktAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgBkEIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgChsMAQsgAygCBAshCiABIAMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQcgCCADQQhBDCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEJIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgByAHRSAOGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhByAIIANBDEEIIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECADQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDhsMAQsgAygCBAshA0EAIQYgCCEJAkACQAJAAn8CQAJAIAMgCkEBdHIOBAABAwUKCyABIAsgDSgCBEERdkEEcSANQQRrIgcoAgBBE3ZBAXFyIg5B4LkBai0AAEECdGoiCSgCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEKIAkgA0EIQQwgASAGSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohCSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgEhsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQogCSADQQxBCCABIAZJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBIbDAELIAMoAgQLIQMgESATIBQgAyAOQeC7AWotAABzIgMbNgIAIAcgBygCAEEgcjYCACANIA0oAgRBCHI2AgQgDUGMAmsiBiAGKAIAQYCACHI2AgAgDUGEAmsiBiAGKAIAQYCAAnI2AgAgDUGIAmsiBiAGKAIAIANBH3RyQYCABHI2AgAgA0ETdCFXIAEgCyAEKAJsLQACQQJ0aiIHKAIAIgMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQkgByADQQhBDCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEHIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAc2AhAgAUEJdCACaiECQQchBQwBCyAEIAc2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCSAJRSAOGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhCSAHIANBDEEIIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQcgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBzYCECADQQl0IAJqIQJBByEFDAELIAQgBzYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAlFIAkgDhsMAQsgAygCBAshAyBXQRByIgYgA0UNARoLIAEgCyANKAIEQRR2QQRxIA1BBGsiCSgCAEEWdkEBcSAGQQ92QRBxIAZBE3ZBwABxIAZBA3ZBqgFxcnJyciISQeC5AWotAABBAnRqIgooAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAKIAdBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIAobDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAogB0EMQQggASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAKGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHguwFqLQAAcyIDGzYCgAIgCSAJKAIAQYACcjYCACANIA0oAgRBwAByNgIEIAYgA0EWdHJBgAFyCyEGIAEgCyAEKAJsIAZBBnZB7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgDhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEJIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIA4bDAELIAcoAgQLRQ0BCyABIAsgDSgCBEEXdkEEcSANQQRrIgkoAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAGQQZ2QaoBcXJycnIiEkHguQFqLQAAQQJ0aiIKKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCiAHQQhBDCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAKGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAKIAdBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gChsMAQsgBygCBAshAyARIBMgFCADIBJB4LsBai0AAHMiAxs2AoAEIAkgCSgCAEGAEHI2AgAgDSANKAIEQYAEcjYCBCAGIANBGXRyQYAIciEGCyABIAsgBCgCbCAGQQl2Qe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIA4bDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAOGwwBCyAHKAIEC0UNBQsgASALIA0oAgRBGnZBBHEgDUEEayIOKAIAQRx2QQFxIAZBFXZBEHEgBkEZdkHAAHEgBkEJdkGqAXFycnJyIgpB4LkBai0AAEECdGoiCSgCACIHKAIAIgNrIQEgAyACQRB2SwRAIAcoAgQhEiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASASIBJFIBUbDAQLIAIgA0EQdGshAiABQYCAAnENASAHKAIEIRIgCSAHQQxBCCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyASRSASIBUbDAMLAkAgBkGQgIABcQ0AIAEgCyAEKAJsIAZB7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgDhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIA4bDAELIAcoAgQLRQ0AIAEgCyANKAIEQRF2QQRxIA1BBGsiCigCAEETdkEBcSAGQQ52QRBxIAZBEHZBwABxIAZBqgFxcnJyciISQeC5AWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIBUbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAkgB0EMQQggASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAVGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHguwFqLQAAcyIDGzYCACAKIAooAgBBIHI2AgAgDSANKAIEQQhyNgIEIA1BjAJrIgcgBygCAEGAgAhyNgIAIA1BhAJrIgcgBygCAEGAgAJyNgIAIA1BiAJrIgcgBygCACADQR90ckGAgARyNgIAIAYgA0ETdHJBEHIhBgsCQCAGQYCBgAhxDQAgASALIAQoAmwgBkEDdiIOQe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIBIbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiASGwwBCyAHKAIEC0UNACABIAsgDSgCBEEUdkEEcSANQQRrIgooAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSAOQaoBcXJycnIiEkHguQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAVGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gFRsMAQsgBygCBAshAyARIBMgFCADIBJB4LsBai0AAHMiAxs2AoACIAogCigCAEGAAnI2AgAgDSANKAIEQcAAcjYCBCAGIANBFnRyQYABciEGCwJAIAZBgIiAwABxDQAgASALIAQoAmwgBkEGdiIOQe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIBIbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiASGwwBCyAHKAIEC0UNACABIAsgDSgCBEEXdkEEcSANQQRrIgooAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAOQaoBcXJycnIiEkHguQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAVGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gFRsMAQsgBygCBAshAyARIBMgFCADIBJB4LsBai0AAHMiAxs2AoAEIAogCigCAEGAEHI2AgAgDSANKAIEQYAEcjYCBCAGIANBGXRyQYAIciEGCyAGQYDAgIAEcQ0DIAEgCyAEKAJsIAZBCXYiEkHvA3FqLQAAQQJ0aiIJKAIAIgEoAgAiA2shBwJ/IAMgAkEQdksEQCABKAIEIQogCSABQQhBDCADIAdLIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQcgCiAKRSAOGwwBCyACIANBEHRrIQIgB0GAgAJxRQRAIAEoAgQhCiAJIAFBDEEIIAMgB0siDhtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQUgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAdBAXQiB0GAgAJJDQALIApFIAogDhsMAQsgASgCBAtFBEAgByEBDAQLIAcgCyANKAIEQRp2QQRxIA1BBGsiDigCAEEcdkEBcSAGQRV2QRBxIAZBGXZBwABxIBJBqgFxcnJyciIKQeC5AWotAABBAnRqIgkoAgAiBygCACIBayEDIAEgAkEQdksEQCAHKAIEIRIgCSAHQQhBDCABIANLIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyASIBJFIBUbDAMLIAIgAUEQdGshAiADQYCAAnFFDQEgAyEBCyAHKAIEDAELIAcoAgQhEiAJIAdBDEEIIAEgA0siFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASASRSASIBUbCyEDIBEgEyAUIAMgCkHguwFqLQAAcyIDGzYCgAYgDiAOKAIAQYCAAXI2AgAgDSANKAIEQYAgcjYCBCANIA0oAoQCQQRyNgKEAiANIA0oAowCQQFyNgKMAiANIA0oAogCIANBEnRyQQJyNgKIAiAGIANBHHRyQYDAAHIhBgsgDSAGQf///7Z7cTYCAAsgDUEEaiEGIBFBBGohAyAMQQFqIgxBwABHDQALIA1BDGohBiARQYQGaiEDIBdBPEkhWCAXQQRqIRcgWA0ACwwCC0EBIBl0IgFBAXYgAXIhDiAEKAJ4IgcgFEECdGpBDGohAyAEKAKAASEGIAQoAgghBSAEKAIEIQEgBCgCACECIAQoAmghCSAEKAJ0IQsCQAJAIBZBCHEEQCAGQQRJDQIgFEUNASAEQeQAaiEQIARB4ABqIQ0gFEEDbCEbIBRBAXQhJEEAIA5rIRUgBEEcaiESA0BBACEYA0ACQAJAAn8CQCADIggoAgAiAwRAAkAgA0GQgIABcQ0AIAEgEiAEKAJsIANB7wNxai0AAEECdGoiCSgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEMIAkgB0EMQQggASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQYgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDEUgDCAKGwwBCyAHKAIEIQwgCSAHQQhBDCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgDCAMRSAKGwtFDQAgASASIAgoAgRBEXZBBHEgCEEEayIMKAIAQRN2QQFxIANBDnZBEHEgA0EQdkHAAHEgA0GqAXFycnJyIhNB4LkBai0AAEECdGoiCSgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEKIAkgB0EMQQggASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQYgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAcGwwBCyAHKAIEIQogCSAHQQhBDCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCiAKRSAcGwshBiALIBUgDiAGIBNB4LsBai0AAHMiBhs2AgAgDCAMKAIAQSByNgIAIAggCCgCBEEIcjYCBCADIAZBE3RyQRByIQMLAkAgA0GAgYAIcQ0AIAEgEiAEKAJsIANBA3YiCkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIBMbC0UNACABIBIgCCgCBEEUdkEEcSAIQQRrIgwoAgBBFnZBAXEgA0EPdkEQcSADQRN2QcAAcSAKQaoBcXJycnIiE0HguQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgFEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAMIAwoAgBBgAJyNgIAIAggCCgCBEHAAHI2AgQgAyAGQRZ0ckGAAXIhAwsCQCADQYCIgMAAcQ0AIAEgEiAEKAJsIANBBnYiCkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIBMbC0UNACABIBIgCCgCBEEXdkEEcSAIQQRrIgwoAgBBGXZBAXEgA0ESdkEQcSADQRZ2QcAAcSAKQaoBcXJycnIiE0HguQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgJEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAMIAwoAgBBgBByNgIAIAggCCgCBEGABHI2AgQgAyAGQRl0ckGACHIhAwsgA0GAwICABHENAyABIBIgBCgCbCADQQl2IgpB7wNxai0AAEECdGoiCSgCACIBKAIAIgZrIQcCfyAGIAJBEHZNBEAgAiAGQRB0ayECIAdBgIACcQRAIAEoAgQMAgsgASgCBCEMIAkgAUEMQQggBiAHSyITG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohBSAGLQABIQEgBi0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgB0EBdCIHQYCAAkkNAAsgDEUgDCATGwwBCyABKAIEIQwgCSABQQhBDCAGIAdLIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQcgDCAMRSATGwtFBEAgByEBDAQLIAcgEiAIKAIEQRp2QQRxIAhBBGsiDCgCAEEcdkEBcSADQRV2QRBxIANBGXZBwABxIApBqgFxcnJyciITQeC5AWotAABBAnRqIgkoAgAiCigCACIBayEGIAEgAkEQdk0EQCACIAFBEHRrIQIgBkGAgAJxBEAgBiEBDAMLIAooAgQhByAJIApBDEEIIAEgBksiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEBIAUtAABB/wFHBEAgBCAKNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHRSAHIBwbDAMLIAooAgQhByAJIApBCEEMIAEgBksiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEGIAUtAABB/wFHBEAgBCAKNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAo2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAcgB0UgHBsMAgsgASANKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgDSAGQQxBCCABIANJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAwbDAELIAYoAgQhByANIAZBCEEMIAEgA0kiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAwbC0UEQCANIQkMBAsgASAQKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgECAGQQxBCCABIANJIgwbaigCACIGNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEDIAktAABB/wFHBEAgBCAFNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDBsMAQsgBigCBCEHIBAgBkEIQQwgASADSSIMG2ooAgAiBjYCAANAAkAgBQ0AIAQoAhAiCUEBaiEFIAktAAEhASAJLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgByAHRSAMGwshDCABIAYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgECAGQQxBCCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAobDAELIAYoAgQhByAQIAZBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAobCyEGQQAhAyAQIQkCQAJAAkACfwJAAkAgBiAMQQF0cg4EAAEDBQgLIAEgEiAIKAIEQRF2QQRxIAhBBGsiBygCAEETdkEBcXIiCkHguQFqLQAAQQJ0aiIJKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQwgCSAGQQxBCCABIANJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAYoAgQhDCAJIAZBCEEMIAEgA0kiExtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAMIAxFIBMbCyEDIAsgFSAOIAMgCkHguwFqLQAAcyIDGzYCACAHIAcoAgBBIHI2AgAgCCAIKAIEQQhyNgIEIANBE3QhWSABIBIgBCgCbC0AAkECdGoiBygCACIGKAIAIgNrIQECfyADIAJBEHZNBEAgAiADQRB0ayECIAFBgIACcQRAIAYoAgQMAgsgBigCBCEJIAcgBkEMQQggASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohByAGLQABIQMgBi0AAEH/AUcEQCAEIAc2AhBBCCEFIANBCHQgAmohAgwBCyADQY8BTQRAIAQgBzYCECADQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCUUgCSAKGwwBCyAGKAIEIQkgByAGQQhBDCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEHIAYtAAEhASAGLQAAQf8BRwRAIAQgBzYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAHNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCSAJRSAKGwshBiBZQRByIgMgBkUNARoLIAEgEiAIKAIEQRR2QQRxIAhBBGsiCSgCAEEWdkEBcSADQQ92QRBxIANBE3ZBwABxIANBA3ZBqgFxcnJyciITQeC5AWotAABBAnRqIgwoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAMIAdBDEEIIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDBsMAQsgBygCBCEKIAwgB0EIQQwgASAGSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgDBsLIQYgCyAUQQJ0aiAVIA4gBiATQeC7AWotAABzIgYbNgIAIAkgCSgCAEGAAnI2AgAgCCAIKAIEQcAAcjYCBCADIAZBFnRyQYABcgshAyABIBIgBCgCbCADQQZ2Qe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQkgBy0AASEGIActAABB/wFHBEAgBCAJNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAk2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgChsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQEgBy0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgChsLRQ0BCyABIBIgCCgCBEEXdkEEcSAIQQRrIgkoAgBBGXZBAXEgA0ESdkEQcSADQRZ2QcAAcSADQQZ2QaoBcXJycnIiE0HguQFqLQAAQQJ0aiIMKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogDCAHQQxBCCABIAZJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIAwbDAELIAcoAgQhCiAMIAdBCEEMIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIAwbCyEGIAsgJEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAJIAkoAgBBgBByNgIAIAggCCgCBEGABHI2AgQgAyAGQRl0ckGACHIhAwsgASASIAQoAmwgA0EJdkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIAobDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIAobC0UNAwsgASASIAgoAgRBGnZBBHEgCEEEayIMKAIAQRx2QQFxIANBFXZBEHEgA0EZdkHAAHEgA0EJdkGqAXFycnJyIhNB4LkBai0AAEECdGoiCSgCACIKKAIAIgZrIQEgBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnENASAKKAIEIQcgCSAKQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiBUEBaiEKIAUtAAEhBiAFLQAAQf8BRwRAIAQgCjYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAKNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIBwbDAILIAooAgQhByAJIApBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEBIAUtAABB/wFHBEAgBCAKNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHIAdFIBwbDAELIAooAgQLIQYgCyAbQQJ0aiAVIA4gBiATQeC7AWotAABzIgcbNgIAIAwgDCgCAEGAgAFyNgIAIAggCCgCBEGAIHI2AgQgBCgCfEECdCAIaiIGIAYoAgRBBHI2AgQgBiAGKAIMQQFyNgIMIAYgBigCCCAHQRJ0ckECcjYCCCADIAdBHHRyQYDAAHIhAwsgCCADQf///7Z7cTYCAAsgCEEEaiEDIAtBBGohCyAYQQFqIhggFEcNAAsgCEEMaiEDIAsgG0ECdGohCyARQQRqIhEgBCgCgAEiBkF8cUkNAAsMAgsCQCAGQQRJDQAgFARAIARB5ABqIRAgBEHgAGohDSAUQQNsIRsgFEEBdCEkQQAgDmshFSAEQRxqIRIDQEEAIRgDQAJAAkACfwJAIAMiCCgCACIDBEACQCADQZCAgAFxDQAgASASIAQoAmwgA0HvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIAobDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIAobC0UNACABIBIgCCgCBEERdkEEcSAIQQRrIgwoAgBBE3ZBAXEgA0EOdkEQcSADQRB2QcAAcSADQaoBcXJycnIiE0HguQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgFSAOIAYgE0HguwFqLQAAcyIHGzYCACAMIAwoAgBBIHI2AgAgCCAIKAIEQQhyNgIEIAhBfiAEKAJ8a0ECdGoiBiAGKAIEQYCAAnI2AgQgBiAGKAIAIAdBH3RyQYCABHI2AgAgBkEEayIGIAYoAgBBgIAIcjYCACADIAdBE3RyQRByIQMLAkAgA0GAgYAIcQ0AIAEgEiAEKAJsIANBA3YiCkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIBMbC0UNACABIBIgCCgCBEEUdkEEcSAIQQRrIgwoAgBBFnZBAXEgA0EPdkEQcSADQRN2QcAAcSAKQaoBcXJycnIiE0HguQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgFEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAMIAwoAgBBgAJyNgIAIAggCCgCBEHAAHI2AgQgAyAGQRZ0ckGAAXIhAwsCQCADQYCIgMAAcQ0AIAEgEiAEKAJsIANBBnYiCkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIBMbC0UNACABIBIgCCgCBEEXdkEEcSAIQQRrIgwoAgBBGXZBAXEgA0ESdkEQcSADQRZ2QcAAcSAKQaoBcXJycnIiE0HguQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgJEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAMIAwoAgBBgBByNgIAIAggCCgCBEGABHI2AgQgAyAGQRl0ckGACHIhAwsgA0GAwICABHENAyABIBIgBCgCbCADQQl2IgpB7wNxai0AAEECdGoiCSgCACIBKAIAIgZrIQcCfyAGIAJBEHZNBEAgAiAGQRB0ayECIAdBgIACcQRAIAEoAgQMAgsgASgCBCEMIAkgAUEMQQggBiAHSyITG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohBSAGLQABIQEgBi0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgB0EBdCIHQYCAAkkNAAsgDEUgDCATGwwBCyABKAIEIQwgCSABQQhBDCAGIAdLIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQcgDCAMRSATGwtFBEAgByEBDAQLIAcgEiAIKAIEQRp2QQRxIAhBBGsiDCgCAEEcdkEBcSADQRV2QRBxIANBGXZBwABxIApBqgFxcnJyciITQeC5AWotAABBAnRqIgkoAgAiCigCACIBayEGIAEgAkEQdk0EQCACIAFBEHRrIQIgBkGAgAJxBEAgBiEBDAMLIAooAgQhByAJIApBDEEIIAEgBksiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEBIAUtAABB/wFHBEAgBCAKNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHRSAHIBwbDAMLIAooAgQhByAJIApBCEEMIAEgBksiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEGIAUtAABB/wFHBEAgBCAKNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAo2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAcgB0UgHBsMAgsgASANKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgDSAGQQxBCCABIANJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAwbDAELIAYoAgQhByANIAZBCEEMIAEgA0kiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAwbC0UEQCANIQkMBAsgASAQKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgECAGQQxBCCABIANJIgwbaigCACIGNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEDIAktAABB/wFHBEAgBCAFNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDBsMAQsgBigCBCEHIBAgBkEIQQwgASADSSIMG2ooAgAiBjYCAANAAkAgBQ0AIAQoAhAiCUEBaiEFIAktAAEhASAJLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgByAHRSAMGwshDCABIAYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQcgECAGQQxBCCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAobDAELIAYoAgQhByAQIAZBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAobCyEGQQAhAyAQIQkCQAJAAkACfwJAAkAgBiAMQQF0cg4EAAEDBQgLIAEgEiAIKAIEQRF2QQRxIAhBBGsiBygCAEETdkEBcXIiCkHguQFqLQAAQQJ0aiIJKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQwgCSAGQQxBCCABIANJIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRwRAIAQgCTYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIBMbDAELIAYoAgQhDCAJIAZBCEEMIAEgA0kiExtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEBIAYtAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAMIAxFIBMbCyEDIAsgFSAOIAMgCkHguwFqLQAAcyIGGzYCACAHIAcoAgBBIHI2AgAgCCAIKAIEQQhyNgIEIAhBfiAEKAJ8a0ECdGoiAyADKAIEQYCAAnI2AgQgAyADKAIAIAZBH3RyQYCABHI2AgAgA0EEayIDIAMoAgBBgIAIcjYCACAGQRN0IVogASASIAQoAmwtAAJBAnRqIgcoAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhCSAHIAZBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQcgBi0AASEDIAYtAABB/wFHBEAgBCAHNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAc2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAlFIAkgChsMAQsgBigCBCEJIAcgBkEIQQwgASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohByAGLQABIQEgBi0AAEH/AUcEQCAEIAc2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBzYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAkgCUUgChsLIQYgWkEQciIDIAZFDQEaCyABIBIgCCgCBEEUdkEEcSAIQQRrIgkoAgBBFnZBAXEgA0EPdkEQcSADQRN2QcAAcSADQQN2QaoBcXJycnIiE0HguQFqLQAAQQJ0aiIMKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogDCAHQQxBCCABIAZJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIAwbDAELIAcoAgQhCiAMIAdBCEEMIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIAwbCyEGIAsgFEECdGogFSAOIAYgE0HguwFqLQAAcyIGGzYCACAJIAkoAgBBgAJyNgIAIAggCCgCBEHAAHI2AgQgAyAGQRZ0ckGAAXILIQMgASASIAQoAmwgA0EGdkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEJIActAAEhBiAHLQAAQf8BRwRAIAQgCTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAJNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIAobDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQkgBy0AASEBIActAABB/wFHBEAgBCAJNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIAobC0UNAQsgASASIAgoAgRBF3ZBBHEgCEEEayIJKAIAQRl2QQFxIANBEnZBEHEgA0EWdkHAAHEgA0EGdkGqAXFycnJyIhNB4LkBai0AAEECdGoiDCgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEKIAwgB0EMQQggASAGSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQYgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAMGwwBCyAHKAIEIQogDCAHQQhBDCABIAZJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCiAKRSAMGwshBiALICRBAnRqIBUgDiAGIBNB4LsBai0AAHMiBhs2AgAgCSAJKAIAQYAQcjYCACAIIAgoAgRBgARyNgIEIAMgBkEZdHJBgAhyIQMLIAEgEiAEKAJsIANBCXZB7wNxai0AAEECdGoiCSgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEMIAkgB0EMQQggASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQYgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDEUgDCAKGwwBCyAHKAIEIQwgCSAHQQhBDCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgDCAMRSAKGwtFDQMLIAEgEiAIKAIEQRp2QQRxIAhBBGsiDCgCAEEcdkEBcSADQRV2QRBxIANBGXZBwABxIANBCXZBqgFxcnJyciITQeC5AWotAABBAnRqIgkoAgAiCigCACIGayEBIAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxDQEgCigCBCEHIAkgCkEMQQggASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQYgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgCjYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAcGwwCCyAKKAIEIQcgCSAKQQhBDCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiBUEBaiEKIAUtAAEhASAFLQAAQf8BRwRAIAQgCjYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgByAHRSAcGwwBCyAKKAIECyEGIAsgG0ECdGogFSAOIAYgE0HguwFqLQAAcyIHGzYCACAMIAwoAgBBgIABcjYCACAIIAgoAgRBgCByNgIEIAQoAnxBAnQgCGoiBiAGKAIEQQRyNgIEIAYgBigCDEEBcjYCDCAGIAYoAgggB0ESdHJBAnI2AgggAyAHQRx0ckGAwAByIQMLIAggA0H///+2e3E2AgALIAhBBGohAyALQQRqIQsgGEEBaiIYIBRHDQALIAhBDGohAyALIBtBAnRqIQsgEUEEaiIRIAQoAoABIgZBfHFJDQALDAELQQQgBkF8cSIDIANBBE0bQQFrIgNBfHFBBGohESAHIANBAXRBeHFqQRRqIQMLIAQgBTYCCCAEIAE2AgQgBCACNgIAIAQgCTYCaCAURQ0EIAYgEU0NBANAQQAhBSARIAQoAoABRwRAA0AgBCADIAsgBSAUbEECdGogDiAFQQAQUSAFQQFqIgUgBCgCgAEgEWtJDQALCyADIAMoAgBB////tntxNgIAIAtBBGohCyADQQRqIQMgF0EBaiIXIBRHDQALDAQLQQQgBkF8cSIDIANBBE0bQQFrIgNBfHFBBGohESAHIANBAXRBeHFqQRRqIQMLIAQgBTYCCCAEIAE2AgQgBCACNgIAIAQgCTYCaCAURQ0CIAYgEU0NAgNAQQAhBSARIAQoAoABRwRAA0AgBCADIAsgBSAUbEECdGogDiAFQQEQUSAFQQFqIgUgBCgCgAEgEWtJDQALCyADIAMoAgBB////tntxNgIAIAtBBGohCyADQQRqIQMgF0EBaiIXIBRHDQALDAILA0BBACEMA0AgAyERAkACQAJ/AkACQCAGIg0oAgAiBkUEQCABIBAoAgAiAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhByAQIANBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQkgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHIAdFIAobDAELIAIgBkEQdGshAiABQYCAAnFFBEAgAygCBCEHIBAgA0EMQQggASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQMgBi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAKGwwBCyADKAIEC0UEQCAQIQkMBgsgASAIKAIAIgMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQcgCCADQQhBDCABIAZJIgobaigCACIDNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEBIAktAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHIAdFIAobDAELIAIgBkEQdGshAiABQYCAAnFFBEAgAygCBCEHIAggA0EMQQggASAGSSIKG2ooAgAiAzYCAANAAkAgBQ0AIAQoAhAiCUEBaiEFIAktAAEhBiAJLQAAQf8BRgRAIAZBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAZBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAobDAELIAMoAgQLIQogASADKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEHIAggA0EIQQwgASAGSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohCSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgDhsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQcgCCADQQxBCCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIA4bDAELIAMoAgQLIQNBACEGIAghCQJAAkACQAJ/AkACQCADIApBAXRyDgQAAQMFCgsgASALIA0oAgRBEXZBBHEgDUEEayIHKAIAQRN2QQFxciIOQeC5AWotAABBAnRqIgkoAgAiAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhCiAJIANBCEEMIAEgBkkiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQkgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBIbDAELIAIgBkEQdGshAiABQYCAAnFFBEAgAygCBCEKIAkgA0EMQQggASAGSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQMgBi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiASGwwBCyADKAIECyEDIBEgEyAUIAMgDkHguwFqLQAAcyIDGzYCACAHIAcoAgBBIHI2AgAgDSANKAIEQQhyNgIEIANBE3QhWyABIAsgBCgCbC0AAkECdGoiBygCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEJIAcgA0EIQQwgASAGSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohByADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAHNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAHNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAkgCUUgDhsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQkgByADQQxBCCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEHIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAc2AhAgA0EJdCACaiECQQchBQwBCyAEIAc2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAJRSAJIA4bDAELIAMoAgQLIQMgW0EQciIGIANFDQEaCyABIAsgDSgCBEEUdkEEcSANQQRrIgkoAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSAGQQN2QaoBcXJycnIiEkHguQFqLQAAQQJ0aiIKKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCiAHQQhBDCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAKGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAKIAdBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gChsMAQsgBygCBAshAyARIBMgFCADIBJB4LsBai0AAHMiAxs2AoACIAkgCSgCAEGAAnI2AgAgDSANKAIEQcAAcjYCBCAGIANBFnRyQYABcgshBiABIAsgBCgCbCAGQQZ2Qe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQkgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIA4bDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAOGwwBCyAHKAIEC0UNAQsgASALIA0oAgRBF3ZBBHEgDUEEayIJKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgBkEGdkGqAXFycnJyIhJB4LkBai0AAEECdGoiCigCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEOIAogB0EIQQwgASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIA4gDkUgChsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQ4gCiAHQQxBCCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAORSAOIAobDAELIAcoAgQLIQMgESATIBQgAyASQeC7AWotAABzIgMbNgKABCAJIAkoAgBBgBByNgIAIA0gDSgCBEGABHI2AgQgBiADQRl0ckGACHIhBgsgASALIAQoAmwgBkEJdkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQogCSAHQQhBDCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCiAKRSAOGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhCiAJIAdBDEEIIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDhsMAQsgBygCBAtFDQULIAEgCyANKAIEQRp2QQRxIA1BBGsiDigCAEEcdkEBcSAGQRV2QRBxIAZBGXZBwABxIAZBCXZBqgFxcnJyciIKQeC5AWotAABBAnRqIgkoAgAiBygCACIDayEBIAMgAkEQdksEQCAHKAIEIRIgCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgEiASRSAVGwwECyACIANBEHRrIQIgAUGAgAJxDQEgBygCBCESIAkgB0EMQQggASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgEkUgEiAVGwwDCwJAIAZBkICAAXENACABIAsgBCgCbCAGQe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIA4bDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAOGwwBCyAHKAIEC0UNACABIAsgDSgCBEERdkEEcSANQQRrIgooAgBBE3ZBAXEgBkEOdkEQcSAGQRB2QcAAcSAGQaoBcXJycnIiEkHguQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAVGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gFRsMAQsgBygCBAshAyARIBMgFCADIBJB4LsBai0AAHMiAxs2AgAgCiAKKAIAQSByNgIAIA0gDSgCBEEIcjYCBCAGIANBE3RyQRByIQYLAkAgBkGAgYAIcQ0AIAEgCyAEKAJsIAZBA3YiDkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQogCSAHQQhBDCABIANJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCiAKRSASGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhCiAJIAdBDEEIIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogEhsMAQsgBygCBAtFDQAgASALIA0oAgRBFHZBBHEgDUEEayIKKAIAQRZ2QQFxIAZBD3ZBEHEgBkETdkHAAHEgDkGqAXFycnJyIhJB4LkBai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEOIAkgB0EIQQwgASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIA4gDkUgFRsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQ4gCSAHQQxBCCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAORSAOIBUbDAELIAcoAgQLIQMgESATIBQgAyASQeC7AWotAABzIgMbNgKAAiAKIAooAgBBgAJyNgIAIA0gDSgCBEHAAHI2AgQgBiADQRZ0ckGAAXIhBgsCQCAGQYCIgMAAcQ0AIAEgCyAEKAJsIAZBBnYiDkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQogCSAHQQhBDCABIANJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCiAKRSASGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhCiAJIAdBDEEIIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogEhsMAQsgBygCBAtFDQAgASALIA0oAgRBF3ZBBHEgDUEEayIKKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgDkGqAXFycnJyIhJB4LkBai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEOIAkgB0EIQQwgASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIA4gDkUgFRsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQ4gCSAHQQxBCCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAORSAOIBUbDAELIAcoAgQLIQMgESATIBQgAyASQeC7AWotAABzIgMbNgKABCAKIAooAgBBgBByNgIAIA0gDSgCBEGABHI2AgQgBiADQRl0ckGACHIhBgsgBkGAwICABHENAyABIAsgBCgCbCAGQQl2IhJB7wNxai0AAEECdGoiCSgCACIBKAIAIgNrIQcCfyADIAJBEHZLBEAgASgCBCEKIAkgAUEIQQwgAyAHSyIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEHIAogCkUgDhsMAQsgAiADQRB0ayECIAdBgIACcUUEQCABKAIEIQogCSABQQxBCCADIAdLIg4baigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEFIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAHQQF0IgdBgIACSQ0ACyAKRSAKIA4bDAELIAEoAgQLRQRAIAchAQwECyAHIAsgDSgCBEEadkEEcSANQQRrIg4oAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSASQaoBcXJycnIiCkHguQFqLQAAQQJ0aiIJKAIAIgcoAgAiAWshAyABIAJBEHZLBEAgBygCBCESIAkgB0EIQQwgASADSyIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgEiASRSAVGwwDCyACIAFBEHRrIQIgA0GAgAJxRQ0BIAMhAQsgBygCBAwBCyAHKAIEIRIgCSAHQQxBCCABIANLIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgEkUgEiAVGwshAyARIBMgFCADIApB4LsBai0AAHMiAxs2AoAGIA4gDigCAEGAgAFyNgIAIA0gDSgCBEGAIHI2AgQgDSANKAKEAkEEcjYChAIgDSANKAKMAkEBcjYCjAIgDSANKAKIAiADQRJ0ckECcjYCiAIgBiADQRx0ckGAwAByIQYLIA0gBkH///+2e3E2AgALIA1BBGohBiARQQRqIQMgDEEBaiIMQcAARw0ACyANQQxqIQYgEUGEBmohAyAXQTxJIVwgF0EEaiEXIFwNAAsLIAQgBTYCCCAEIAE2AgQgBCACNgIAIAQgCTYCaAsCQCAWQSBxRQ0AIAQgBEHkAGo2AmggBCAEKAIEIAQoAmQiBigCACIBayICNgIEAkAgASAEKAIAIgVBEHZLBEAgBCABNgIEIAQgBkEIQQwgASACSxtqKAIAIgY2AmQgBCgCCCECA0ACQCACDQAgBCgCECIHQQFqIQkgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCECDAILIAQgCTYCECADQQl0IAVqIQVBByECDAELIAQgCTYCEEEIIQIgA0EIdCAFaiEFCyAEIAJBAWsiAjYCCCAEIAVBAXQiBTYCACAEIAFBAXQiATYCBCABQYCAAkkNAAsgASECDAELIAQgBSABQRB0ayIFNgIAIAJBgIACcQ0AIAQgBkEMQQggASACSxtqKAIAIgY2AmQgBCgCCCEBA0ACQCABDQAgBCgCECIBQQFqIQcgAS0AASEDIAEtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCEBDAILIAQgBzYCECADQQl0IAVqIQVBByEBDAELIAQgBzYCEEEIIQEgA0EIdCAFaiEFCyAEIAFBAWsiATYCCCAEIAVBAXQiBTYCACAEIAJBAXQiAjYCBCACQYCAAkkNAAsLIAQgAiAGKAIAIgFrIgI2AgQCQCABIAVBEHZLBEAgBCABNgIEIAQgBkEIQQwgASACSxtqKAIAIgY2AmQgBCgCCCECA0ACQCACDQAgBCgCECIHQQFqIQkgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCECDAILIAQgCTYCECADQQl0IAVqIQVBByECDAELIAQgCTYCEEEIIQIgA0EIdCAFaiEFCyAEIAJBAWsiAjYCCCAEIAVBAXQiBTYCACAEIAFBAXQiATYCBCABQYCAAkkNAAsgASECDAELIAQgBSABQRB0ayIFNgIAIAJBgIACcQ0AIAQgBkEMQQggASACSxtqKAIAIgY2AmQgBCgCCCEBA0ACQCABDQAgBCgCECIBQQFqIQcgAS0AASEDIAEtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCEBDAILIAQgBzYCECADQQl0IAVqIQVBByEBDAELIAQgBzYCEEEIIQEgA0EIdCAFaiEFCyAEIAFBAWsiATYCCCAEIAVBAXQiBTYCACAEIAJBAXQiAjYCBCACQYCAAkkNAAsLIAQgAiAGKAIAIgFrIgI2AgQCQCABIAVBEHZLBEAgBCABNgIEIAQgBkEIQQwgASACSxtqKAIAIgY2AmQgBCgCCCECA0ACQCACDQAgBCgCECIHQQFqIQkgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCECDAILIAQgCTYCECADQQl0IAVqIQVBByECDAELIAQgCTYCEEEIIQIgA0EIdCAFaiEFCyAEIAJBAWsiAjYCCCAEIAVBAXQiBTYCACAEIAFBAXQiATYCBCABQYCAAkkNAAsgASECDAELIAQgBSABQRB0ayIFNgIAIAJBgIACcQ0AIAQgBkEMQQggASACSxtqKAIAIgY2AmQgBCgCCCEBA0ACQCABDQAgBCgCECIBQQFqIQcgAS0AASEDIAEtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgBUGA/gNqIQVBCCEBDAILIAQgBzYCECADQQl0IAVqIQVBByEBDAELIAQgBzYCEEEIIQEgA0EIdCAFaiEFCyAEIAFBAWsiATYCCCAEIAVBAXQiBTYCACAEIAJBAXQiAjYCBCACQYCAAkkNAAsLIAQgAiAGKAIAIgFrIgI2AgQgASAFQRB2SwRAIAQgATYCBCAEIAZBCEEMIAEgAksbaigCADYCZCAEKAIIIQIDQAJAIAINACAEKAIQIgZBAWohByAGLQABIQMgBi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQIMAgsgBCAHNgIQIANBCXQgBWohBUEHIQIMAQsgBCAHNgIQQQghAiADQQh0IAVqIQULIAQgAkEBayICNgIIIAQgBUEBdCIFNgIAIAQgAUEBdCIBNgIEIAFBgIACSQ0ACwwBCyAEIAUgAUEQdGsiBzYCACACQYCAAnENACAEIAZBDEEIIAEgAksbaigCADYCZCAEKAIIIQUDQAJAIAUNACAEKAIQIgNBAWohBiADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCAHQYD+A2ohB0EIIQUMAgsgBCAGNgIQIAFBCXQgB2ohB0EHIQUMAQsgBCAGNgIQQQghBSABQQh0IAdqIQcLIAQgBUEBayIFNgIIIAQgB0EBdCIHNgIAIAQgAkEBdCICNgIEIAJBgIACSQ0ACwsLICcNACAEEFMgBEHAqQE2AmQgBEHgngE2AmAgBEGAnwE2AhwLQQAgH0EBaiIBIAFBA0YiARshHyAZIAFrIRkgJkEBaiImICAoAghPDQEgGUEASg0ACwsgKCAqaiEoIAQoAhggBC8BcDsAACApQQFqIikgGigCLEkNAAsLAkAgK0UNAAJAIAQoAhgiASAEKAIQIgNBAmpLBEAgIUUNASAjIAEgBCgCFCIGazYCOCAjIAMgBms2AjQgIyABIANrQQJrNgIwIB1BAkGg8gAgI0EwahAIDAILIAQoAgwiAUEDSQ0BICEEQCAjIAE2AlAgHUECQek1ICNB0ABqEAgMAgsgIyABNgJAIB1BAkHpNSAjQUBrEAgMAQsgIyABIAQoAhQiBms2AiggIyADIAZrNgIkICMgASADa0ECazYCICAdQQJBoPIAICNBIGoQCAsgGigCPEUNACAEICw2AnQLIDAoAgQhASAaKAIMIV0gGigCCCAwKAIAayEIIDAoAhAiBkEBcQRAIDIoAhwgN0GYAWxqIgdBkAFrKAIAIAhqIAdBmAFrKAIAayEICyBdIAFrIQMgBkECcQRAIDIoAhwgN0GYAWxqIgFBjAFrKAIAIANqIAFBlAFrKAIAayEDCyAaKAI8IgYhAiAGRQRAIAQoAnQhAgsgBCgCgAEhFiAEKAJ8IQ0CQCAvKAKoBiIHRQ0AIBZFIA1FciEBIAdBHkwEQCABDQFBACEQA0AgDSAQbCEEQQAhAQNAIAIgASAEakECdGoiESgCACIJIAlBH3UiBXMgBWsiBSAHdgRAIBFBACAFIC8oAqgGdiIRayARIAlBAEgbNgIACyABQQFqIgEgDUcNAAsgEEEBaiIQIBZHDQALDAELIAENACACQQAgDSAWbEECdBAOGgsgBgRAIA0gFmwhBiAvKAIUQQFGBEAgBkUNBUEAIQEgBkEETwRAIAZBfHEhAUEAIQQDQCACIARBAnRqIgMgA/0AAgAiXv0bAEECbf0RIF79GwFBAm39HAEgXv0bAkECbf0cAiBe/RsDQQJt/RwD/QsCACAEQQRqIgQgAUcNAAsgASAGRg0GCwNAIAIgAUECdGoiAyADKAIAQQJtNgIAIAFBAWoiASAGRw0ACwwFCyAGRQ0EIDAqAiBDAAAAP5QhZkEAIQQCQCAGQQRJBEAgAiEBDAELIAIgBkF8cSIEQQJ0aiEBIGb9EyFeQQAhAwNAIAIgA0ECdGoiByBeIAf9AAIA/foB/eYB/QsCACADQQRqIgMgBEcNAAsgBCAGRg0FCwNAIAEgZiABKAIAspQ4AgAgAUEEaiEBIARBAWoiBCAGRw0ACwwECyA2IDVrIREgLygCFEEBRw0CIBZFDQMgMigCJCIGIAMgEWwiA0ECdGogCEECdGohCSANQXxxIgxBAWsiAUEEcSELIDYgDSA1amtBAnQhGiABQQJ2QQFqQf7///8HcSEdIAMgCGpBAnQgBmogAmshCkEAIQggAUEDRyEUA0BBACEBAkAgDEUNACAIIA1sIQMgCSAIIBFsQQJ0aiEGQQAhByAUBEADQCAGIAFBAnRqIAIgASADakECdGr9AAIAIl79GwBBAm39ESBe/RsBQQJt/RwBIF79GwJBAm39HAIgXv0bA0ECbf0cA/0LAgAgBiABQQRyIgRBAnRqIAIgAyAEakECdGr9AAIAIl79GwBBAm39ESBe/RsBQQJt/RwBIF79GwJBAm39HAIgXv0bA0ECbf0cA/0LAgAgAUEIaiEBIAdBAmoiByAdRw0ACwsgCw0AIAYgAUECdGogAiABIANqQQJ0av0AAgAiXv0bAEECbf0RIF79GwFBAm39HAEgXv0bAkECbf0cAiBe/RsDQQJt/RwD/QsCACABQQRqIQELAkAgASANTw0AIAggDWwhAyAJIAggEWxBAnRqIQcCQCANIAFrIhBBBEkEQCABIQQMAQsgCiAIIBpsakEQSQRAIAEhBAwBCyABIBBBfHEiBWohBEEAIQYDQCAHIAEgBmoiIUECdGogAiADICFqQQJ0av0AAgAiXv0bAEECbf0RIF79GwFBAm39HAEgXv0bAkECbf0cAiBe/RsDQQJt/RwD/QsCACAGQQRqIgYgBUcNAAsgBSAQRg0BCyAEQQFqIQEgDSAEa0EBcQRAIAcgBEECdGogAiADIARqQQJ0aigCAEECbTYCACABIQQLIAEgDUYNAANAIAcgBEECdGogAiADIARqQQJ0aigCAEECbTYCACAHIARBAWoiAUECdGogAiABIANqQQJ0aigCAEECbTYCACAEQQJqIgQgDUcNAAsLIAhBAWoiCCAWRw0ACwwDCyAjIBk2AgAgHUECQdbAACAjEAgLIBAoAgBBADYCAAwBCyAWRQ0AIA1FDQAgMigCJCADIBFsQQJ0aiAIQQJ0aiEHIA1BfHEiA0ECdCEGIDAqAiBDAAAAP5QiZv0TIV5BACEQIA1BBEkhCANAAkACQCAIBEAgAiEJIAchAUEAIQQMAQsgBiAHaiEBIAIgBmohCUEAIQQDQCAHIARBAnQiBWogXiACIAVq/QACAP36Af3mAf0LAgAgBEEEaiIEIANHDQALIAkhAiADIgQgDUYNAQsgCSECA0AgASBmIAIoAgCylDgCACABQQRqIQEgAkEEaiECIARBAWoiBCANRw0ACwsgByARQQJ0aiEHIBBBAWoiECAWRw0ACwsgABAJICNB4ABqJAAL1gQBCX8gACgCLEEITwRAIAAoAighBUEIIQoDQCAAKAIMQQV0IQggACgCACEEIAAoAiQhAwJAIAAoAhQiBiAAKAIQIgFNDQAgBCAIaiEHIAFBAWohAiAGIAFrQQFxBEAgByABQQZ0aiIJIAUgASADbEECdGoiAf0AAgD9CwIAIAkgAf0AAhD9CwIQIAIhAQsgAiAGRg0AA0AgByABQQZ0aiICIAUgASADbEECdGoiCf0AAgD9CwIAIAIgCf0AAhD9CwIQIAcgAUEBaiICQQZ0aiIJIAUgAiADbEECdGoiAv0AAhD9CwIQIAkgAv0AAgD9CwIAIAFBAmoiASAGRw0ACwsCQCAAKAIcIgYgACgCGCIBTQ0AIAQgCGtBIGohByAFIAAoAgggA2xBAnRqIQggAUEBaiECIAYgAWtBAXEEQCAHIAFBBnRqIgQgCCABIANsQQJ0aiIB/QACAP0LAgAgBCAB/QACEP0LAhAgAiEBCyACIAZGDQADQCAHIAFBBnRqIgIgCCABIANsQQJ0aiIE/QACAP0LAgAgAiAE/QACEP0LAhAgByABQQFqIgJBBnRqIgQgCCACIANsQQJ0aiIC/QACEP0LAhAgBCAC/QACAP0LAgAgAUECaiIBIAZHDQALCyAAEBxBACEBIAAoAiAEQANAIAUgACgCJCABbEECdGoiAiAAKAIAIAFBBXRqIgP9AAIA/QsCACACIAP9AAIQ/QsCECABQQFqIgEgACgCIEkNAAsLIAVBIGohBSAKQQhqIgogACgCLE0NAAsLIAAoAgAQCSAAEAkL9w0BJX8gACgCLEEITwRAIAAoAiQiCkEFdCEeIApBB2whFiAKQQZsIRcgCkEFbCEYIApBA2whGSAKQQF0IRogACgCKCIBIApBHGxqIR8gASAKQRhsaiEgIAEgCkEUbGohISABIApBBHRqISIgASAKQQxsaiEjIAEgCkEDdCIkaiElIAEgCkECdCIbaiEmQQghHANAIAAgASAAKAIkQQgQNCAAEBwCQCAAKAIgIgtFDQAgHSAebCEIIAAoAgAhBkEAIQQCQAJAIAtB6AJJDQAgBkEMaiIOIAtBAWsiAkEFdCIDaiAOSQ0AIAZBCGoiDyADaiAPSQ0AIAMgBmogBkkNACAGQQRqIhAgA2ogEEkNACACQf///z9LDQAgASAIICZqIgMgC0ECdCIFaiIMSSADIAEgBWoiB0lxDQAgASAIICVqIgIgBWoiDUkgAiAHSXENACABIAUgCCAjaiIJaiIFSSAHIAlLcQ0AIAYgB0kgASAGIAtBBXRqIhFBHGsiEklxDQAgASARQRhrIhNJIAcgEEtxDQAgASARQRRrIhRJIAcgD0txDQAgByAOSyABIBFBEGsiB0lxDQAgAyANSSACIAxJcQ0AIAMgBUkgCSAMSXENACADIBJJIAYgDElxDQAgAyATSSAMIBBLcQ0AIAMgFEkgDCAPS3ENACADIAdJIAwgDktxDQAgAiAFSSAJIA1JcQ0AIAIgEkkgBiANSXENACACIBNJIA0gEEtxDQAgAiAUSSANIA9LcQ0AIAIgB0kgDSAOS3ENACAJIBJJIAUgBktxDQAgCSATSSAFIBBLcQ0AIAkgFEkgBSAPS3ENACAHIAlLIAUgDktxDQAgC0H8////AHEhBEEAIQMDQCABIANBAnRqIAYgA0EFdGoiAv0JAgAgAioCIP0gASACQUBrKgIA/SACIAIqAmD9IAP9CwIAIAEgAyAKakECdGogAv0JAgQgAioCJP0gASACKgJE/SACIAIqAmT9IAP9CwIAIAEgAyAaakECdGogAv0JAgggAioCKP0gASACKgJI/SACIAIqAmj9IAP9CwIAIAEgAyAZakECdGogAv0JAgwgAioCLP0gASACKgJM/SACIAIqAmz9IAP9CwIAIANBBGoiAyAERw0ACyAEIAtGDQELA0AgASAEQQJ0aiAGIARBBXRqIgMqAgA4AgAgASAEIApqQQJ0aiADKgIEOAIAIAEgBCAaakECdGogAyoCCDgCACABIAQgGWpBAnRqIAMqAgw4AgAgBEEBaiIEIAtHDQALCyAAKAIAIQZBACEEAkAgC0HcAEkNACAGQRxqIg8gC0EBayICQQV0IgNqIA9JDQAgBkEYaiIQIANqIBBJDQAgBkEQaiIRIANqIBFJDQAgBkEUaiISIANqIBJJDQAgAkH///8/Sw0AIAggImoiAyAIICFqIgIgC0ECdCIFaiIMSSACIAMgBWoiB0lxDQAgAyAIICBqIgkgBWoiDUkgByAJS3ENACADIAggH2oiCCAFaiIFSSAHIAhLcQ0AIAMgBiALQQV0aiIOQQxrIhNJIAcgEUtxDQAgAyAOQQhrIhRJIAcgEktxDQAgAyAOQQRrIhVJIAcgEEtxDQAgAyAOSSAHIA9LcQ0AIAIgDUkgCSAMSXENACACIAVJIAggDElxDQAgAiATSSAMIBFLcQ0AIAIgFEkgDCASS3ENACACIBVJIAwgEEtxDQAgAiAOSSAMIA9LcQ0AIAggDUkgBSAJS3ENACAJIBNJIA0gEUtxDQAgCSAUSSANIBJLcQ0AIAkgFUkgDSAQS3ENACAJIA5JIA0gD0txDQAgCCATSSAFIBFLcQ0AIAggFEkgBSASS3ENACAIIBVJIAUgEEtxDQAgCCAOSSAFIA9LcQ0AIAtB/P///wBxIQRBACEDA0AgASADIBtqQQJ0aiAGIANBBXRqIgL9CQIQIAIqAjD9IAEgAioCUP0gAiACKgJw/SAD/QsCACABIAMgGGpBAnRqIAL9CQIUIAIqAjT9IAEgAioCVP0gAiACKgJ0/SAD/QsCACABIAMgF2pBAnRqIAL9CQIYIAIqAjj9IAEgAioCWP0gAiACKgJ4/SAD/QsCACABIAMgFmpBAnRqIAL9CQIcIAIqAjz9IAEgAioCXP0gAiACKgJ8/SAD/QsCACADQQRqIgMgBEcNAAsgBCALRg0BCwNAIAEgBCAbakECdGogBiAEQQV0aiIDKgIQOAIAIAEgBCAYakECdGogAyoCFDgCACABIAQgF2pBAnRqIAMqAhg4AgAgASAEIBZqQQJ0aiADKgIcOAIAIARBAWoiBCALRw0ACwsgHUEBaiEdIAEgJEECdGohASAcQQhqIhwgACgCLE0NAAsLIAAoAgAQCSAAEAkLcwECfyAAKAIcIgFBCGoiAyAAKAIgIgJNBEADQCAAIAAoAhggAUECdGogACgCFEEIECsgAyIBQQhqIgMgACgCICICTQ0ACwsgASACSQRAIAAgACgCGCABQQJ0aiAAKAIUIAIgAWsQKwsgACgCABAJIAAQCQtEACAAKAIcIgEgACgCIEkEQANAIAAgACgCGCAAKAIUIAFsQQJ0ahBWIAFBAWoiASAAKAIgSQ0ACwsgACgCABAJIAAQCQuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGEAsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEEAsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC54FAgZ+BH8gASABKAIAQQdqQXhxIgFBEGo2AgAgACELIAEpAwAhAyABKQMIIQcjAEEgayIIJAAgB0L///////8/gyEEAn4gB0IwiEL//wGDIgWnIgpBgfgAa0H9D00EQCAEQgSGIANCPIiEIQIgCkGA+ABrrSEFAkAgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILQgAgAiACQv////////8HViIAGyECIACtIAV8DAELAkAgAyAEhFANACAFQv//AVINACAEQgSGIANCPIiEQoCAgICAgIAEhCECQv8PDAELQv8PIApB/ocB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JWQpIAAlc30KAAkJIH0KAFtERVZdIER1bXAgYW4gaW1hZ2VfY29tcF9oZWFkZXIgc3RydWN0IHsKAFtERVZdIER1bXAgYW4gaW1hZ2VfaGVhZGVyIHN0cnVjdCB7CgBJbWFnZSBpbmZvIHsKAAkgZGVmYXVsdCB0aWxlIHsKACVzCSBjb21wb25lbnQgJWQgewoACQkgY29tcCAlZCB7CgAJIFRpbGUgaW5kZXg6IHsKAAkgTWFya2VyIGxpc3Q6IHsKAENvZGVzdHJlYW0gaW5kZXggZnJvbSBtYWluIGhlYWRlcjogewoAQ29kZXN0cmVhbSBpbmZvIGZyb20gbWFpbiBoZWFkZXI6IHsKAFN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94CgBGb3VuZCBhIG1pc3BsYWNlZCAnJWMlYyVjJWMnIGJveCBvdXRzaWRlIGpwMmggYm94CgBNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBmaXJzdCBib3ggbXVzdCBiZSBKUEVHIDIwMDAgc2lnbmF0dXJlIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogc2Vjb25kIGJveCBtdXN0IGJlIGZpbGUgdHlwZSBib3gKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBib3gKAE5vdCBlbm91Z2ggbWVtb3J5IHdpdGggRlRZUCBCb3gKAEEgbWFya2VyIElEIHdhcyBleHBlY3RlZCAoMHhmZi0tKSBpbnN0ZWFkIG9mICUuOHgKAAkJIG1jdD0leAoACQkJIGNibGtzdHk9JSN4CgAJCQkgY3N0eT0lI3gKAAkJIHByZz0lI3gKAEludGVnZXIgb3ZlcmZsb3cKAAkgdGR4PSV1LCB0ZHk9JXUKAAkgdHc9JXUsIHRoPSV1CgAJIHR4MD0ldSwgdHkwPSV1CgBJbnZhbGlkIGNvbXBvbmVudCBpbmRleDogJXUKAFN0cmVhbSB0b28gc2hvcnQKAE1hcmtlciBoYW5kbGVyIGZ1bmN0aW9uIGZhaWxlZCB0byByZWFkIHRoZSBtYXJrZXIgc2VnbWVudAoATm90IGVub3VnaCBtZW1vcnkgZm9yIGN1cnJlbnQgcHJlY2luY3QgY29kZWJsb2NrIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudAoARXJyb3IgcmVhZGluZyBTUWNkIG9yIFNRY2MgZWxlbWVudAoAQSBCUENDIGhlYWRlciBib3ggaXMgYXZhaWxhYmxlIGFsdGhvdWdoIEJQQyBnaXZlbiBieSB0aGUgSUhEUiBib3ggKCVkKSBpbmRpY2F0ZSBjb21wb25lbnRzIGJpdCBkZXB0aCBpcyBjb25zdGFudAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBpbGxlZ2FsIHRpbGUgb2Zmc2V0CgBJbnZhbGlkIHByZWNpbmN0CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgYmFuZCBwcmVjaW50cwoARmFpbGVkIHRvIGRlY29kZSBhbGwgdXNlZCBjb21wb25lbnRzCgBTaXplIG9mIGNvZGUgYmxvY2sgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAFNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0cwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIE1DVCBtYXJrZXJzCgBDb3JydXB0ZWQgUFBNIG1hcmtlcnMKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aWxlIHJlc29sdXRpb25zCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgY29sbGVjdGlvbnMKAEludmFsaWQgUENMUiBib3guIFJlcG9ydHMgMCBwYWxldHRlIGNvbHVtbnMKAFdlIGRvIG5vdCBzdXBwb3J0IFJPSSBpbiBkZWNvZGluZyBIVCBjb2RlYmxvY2tzCgBDYW5ub3QgaGFuZGxlIGJveCBvZiB1bmRlZmluZWQgc2l6ZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRob3V0IHNhbWUgbnVtYmVyIG9mIGluZGl4ZXMKAEludmFsaWQgdGlsZWMtPndpbl94eHggdmFsdWVzCgBDYW5ub3QgaGFuZGxlIGJveCBvZiBsZXNzIHRoYW4gOCBieXRlcwoAQ2Fubm90IGhhbmRsZSBYTCBib3ggb2YgbGVzcyB0aGFuIDE2IGJ5dGVzCgBDb21wb25lbnQgaW5kZXggJXUgdXNlZCBzZXZlcmFsIHRpbWVzCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzICVkIGVudHJpZXMKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBUYWctdHJlZSBub2RlcwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG1jdCBkYXRhIHdpdGhpbiBtdWx0aXBsZSBNQ1QgcmVjb3JkcwoAQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3IKAG9wal9qMmtfYXBwbHlfbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uIGVycm9yCgBQcm9ibGVtIHdpdGggc2tpcHBpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3IKAFByb2JsZW0gd2l0aCByZWFkaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBVbmtub3duIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgU09UIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQTFQgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNUIG1hcmtlcgoATm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgU09QIG1hcmtlcgoARXhwZWN0ZWQgU09QIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ08gbWFya2VyCgBFcnJvciByZWFkaW5nIFJHTiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBNIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFRMTSBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExNIG1hcmtlcgoATm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgRVBIIG1hcmtlcgoARXhwZWN0ZWQgRVBIIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDUkcgbWFya2VyCgBVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXIKAFVua25vd24gU2NvZCB2YWx1ZSBpbiBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIENPRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNEIG1hcmtlcgoAQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyCgBFcnJvciByZWFkaW5nIFBPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlcgoARXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DQyBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlcgoAcmVxdWlyZWQgU0laIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAHJlcXVpcmVkIENPRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlcgoARXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBwcmV2aW91cyBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0IChoZWFkZXIpICglZCksIGdpdmluZyB1cAoAdGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvbgoATWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb24KAFByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb24KAEludmFsaWQgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybWF0aW9uCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uCgBUb28gbGFyZ2UgdmFsdWUgZm9yIE5wcG0KAE5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBOcHBtCgBiYWQgcGxhY2VkIGpwZWcgY29kZXN0cmVhbQoACSBNYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbj0lbGxpCgkgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSVsbGkKAE1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGgKAFRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZwoAV3JvbmcgZmxhZwoARXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZQoARXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemUKAEludmFsaWQgcHJlY2luY3Qgc2l6ZQoASW5jb25zaXN0ZW50IG1hcmtlciBzaXplCgBJbnZhbGlkIG1hcmtlciBzaXplCgBFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZQoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZQoARmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGUKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGUKAENhbm5vdCBhbGxvY2F0ZSBUaWVyIDEgaGFuZGxlCgBObyBkZWNvZGVkIGFyZWEgcGFyYW1ldGVycywgc2V0IHRoZSBkZWNvZGVkIGFyZWEgdG8gdGhlIHdob2xlIGltYWdlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHRyZWUKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LiBVbnN1cHBvcnRlZCBNaXhlZCBIVCBjb2RlLWJsb2NrIHN0eWxlIGZvdW5kCgBUaWxlIFkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAFRpbGUgWCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZAoASW1hZ2UgY29vcmRpbmF0ZXMgYWJvdmUgSU5UX01BWCBhcmUgbm90IHN1cHBvcnRlZAoASlBFRzIwMDAgSGVhZGVyIGJveCBub3QgcmVhZCB5ZXQsICclYyVjJWMlYycgYm94IHdpbGwgYmUgaWdub3JlZAoAb3BqX2oya19tZXJnZV9wcHQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkCgBJZ25vcmluZyBpaGRyIGJveC4gRmlyc3QgaWhkciBib3ggYWxyZWFkeSByZWFkCgBacHB0ICV1IGFscmVhZHkgcmVhZAoAWnBwbSAldSBhbHJlYWR5IHJlYWQKAFBURVJNIGNoZWNrIGZhaWx1cmU6ICVkIHN5bnRoZXRpemVkIDB4RkYgbWFya2VycyByZWFkCgAJCQkgY2Jsa3c9Ml4lZAoACQkJIGNibGtoPTJeJWQKAAkJCSBxbnRzdHk9JWQKACVzIGR4PSVkLCBkeT0lZAoACQkJIHJvaXNoaWZ0PSVkCgAJCQkgbnVtZ2JpdHM9JWQKAAkJIG51bWxheWVycz0lZAoAJXMgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogYWNuPSVkLCBudW1jb21wcz0lZAoAb3BqX2pwMl9hcHBseV9jZGVmOiBjbj0lZCwgbnVtY29tcHM9JWQKAAkJCSBudW1yZXNvbHV0aW9ucz0lZAoACQkgdHlwZT0lI3gsIHBvcz0lbGxpLCBsZW49JWQKACVzIHNnbmQ9JWQKAAkJCSBxbWZiaWQ9JWQKACVzIHByZWM9JWQKAAkJIG5iIG9mIHRpbGUtcGFydCBpbiB0aWxlIFslZF09JWQKACVzIHgxPSVkLCB5MT0lZAoAJXMgeDA9JWQsIHkwPSVkCgBGYWlsZWQgdG8gZGVjb2RlIHRpbGUgJWQvJWQKAFNldHRpbmcgZGVjb2RpbmcgYXJlYSB0byAlZCwlZCwlZCwlZAoARmFpbGVkIHRvIGRlY29kZSBjb21wb25lbnQgJWQKAEludmFsaWQgdmFsdWUgZm9yIG51bXJlc29sdXRpb25zIDogJWQsIG1heCB2YWx1ZSBpcyBzZXQgaW4gb3BlbmpwZWcuaCBhdCAlZAoASW52YWxpZCBjb21wb25lbnQgbnVtYmVyOiAlZCwgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyAlZAoAVG9vIG1hbnkgUE9DcyAlZAoASW52YWxpZCB0aWxlIG51bWJlciAlZAoASW52YWxpZCB0aWxlIHBhcnQgaW5kZXggZm9yIHRpbGUgbnVtYmVyICVkLiBHb3QgJWQsIGV4cGVjdGVkICVkCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgaWxsZWdhbCAtPiAlZAoATm90IGVub3VnaCBtZW1vcnkgZm9yIGNpZWxhYgoAQ2Fubm90IGFsbG9jYXRlIGNibGstPmRlY29kZWRfZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQVCBkYXRhCgBGYWlsZWQgdG8gbWVyZ2UgUFBNIGRhdGEKAEludmFsaWQgbnVtYmVyIG9mIGxheWVycyBpbiBDT0QgbWFya2VyIDogJWQgbm90IGluIHJhbmdlIFsxLTY1NTM1XQoAU3RyZWFtIHRvbyBzaG9ydCwgZXhwZWN0ZWQgU09UCgBVbmFibGUgdG8gc2V0IHQxIGhhbmRsZSBhcyBUTFMKAFN0cmVhbSBkb2VzIG5vdCBlbmQgd2l0aCBFT0MKAENhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzIKAG9wal9waV9uZXh0X2xyY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JsY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X2NwcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3BjcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JwY2woKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal90MV9kZWNvZGVfY2JsaygpOiB1bnN1cHBvcnRlZCBicG5vX3BsdXNfb25lID0gJWQgPj0gMzEKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAxLzEKAEluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC4KAE5lZWQgdG8gcmVhZCBhIFBDTFIgYm94IGJlZm9yZSB0aGUgQ01BUCBib3guCgBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guCgBOdW1iZXIgb2YgY2hhbm5lbCBkZXNjcmlwdGlvbiBpcyBlcXVhbCB0byB6ZXJvIGluIENERUYgYm94LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IG5vICdpaGRyJyBib3guCgBOb24gY29uZm9ybWFudCBjb2Rlc3RyZWFtIFRQc290PT1UTnNvdC4KAFN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC4KAEJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC4KAENvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC4KAEluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEludmFsaWQgY29kZWJsb2NrIGxlbmd0aCB2YWx1ZXMuCgBXZSBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMyBjb2RpbmcgcGFzc2VzIGluIGFuIEhUIGNvZGVibG9jazsgVGhpcyBjb2RlYmxvY2tzIGhhcyAlZCBwYXNzZXMuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBUaGVyZSBhcmUgJWQgemVybyBiaXRwbGFuZXMgaW4gJWQgYml0cGxhbmVzLgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9uIHN0YWdlcy4KAFVua25vd24gbWFya2VyIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldF9kZWNvZGVkX2NvbXBvbmVudHMgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldHVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLgoAVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC4KAE51bWJlciBvZiBjb21wb25lbnRzICglZCkgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBNQ1QuIFNraXAgdGhlIE1DVCBzdGVwLgoASlAyIGJveCB3aGljaCBhcmUgYWZ0ZXIgdGhlIGNvZGVzdHJlYW0gd2lsbCBub3QgYmUgcmVhZCBieSB0aGlzIGZ1bmN0aW9uLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gV2hlbiB0aGUgbnVtYmVyIG9mIHplcm8gcGxhbmVzIGJpdHBsYW5lcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJpdHBsYW5lcywgb25seSB0aGUgY2xlYW51cCBwYXNzIG1ha2VzIHNlbnNlLCBidXQgd2UgaGF2ZSAlZCBwYXNzZXMgaW4gdGhpcyBjb2RlYmxvY2suIFRoZXJlZm9yZSwgb25seSB0aGUgY2xlYW51cCBwYXNzIHdpbGwgYmUgZGVjb2RlZC4gVGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZ2Fpbi4KAEltYWdlIGhhcyBsZXNzIGNvbXBvbmVudHMgdGhhbiBjb2Rlc3RyZWFtLgoATmVlZCB0byBkZWNvZGUgdGhlIG1haW4gaGVhZGVyIGJlZm9yZSBiZWdpbiB0byBkZWNvZGUgdGhlIHJlbWFpbmluZyBjb2Rlc3RyZWFtLgoAUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgd2UgYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLgoAQSBtYWxmb3JtZWQgY29kZWJsb2NrIHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUgY29kaW5nIHBhc3MsIGJ1dCB6ZXJvIGxlbmd0aCBmb3IgMm5kIGFuZCBwb3RlbnRpYWxseSB0aGUgM3JkIHBhc3MgaW4gYW4gSFQgY29kZWJsb2NrLgoACQkJIHRpbGUtcGFydFslZF06IHN0YXJfcG9zPSVsbGksIGVuZF9oZWFkZXI9JWxsaSwgZW5kX3Bvcz0lbGxpLgoAVGlsZSAldSBoYXMgVFBzb3QgPT0gMCBhbmQgVE5zb3QgPT0gMCwgYnV0IG5vIG90aGVyIHRpbGUtcGFydHMgd2VyZSBmb3VuZC4gRU9DIGlzIGFsc28gbWlzc2luZy4KAENvbXBvbmVudCAlZCBkb2Vzbid0IGhhdmUgYSBtYXBwaW5nLgoAQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS4KAFRoZSBzaWduYXR1cmUgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSAgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSBmdHlwIGJveCBtdXN0IGJlIHRoZSBzZWNvbmQgYm94IGluIHRoZSBmaWxlLgoARmFpbGVkIHRvIGRlY29kZS4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEluY29ycmVjdCBNRUwgc2VnbWVudCBzZXF1ZW5jZS4KAENvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuCgBPbmx5IG9uZSBDTUFQIGJveCBpcyBhbGxvd2VkLgoAYXBwbHlfY29sb3JfdHJhbnNmb3JtcyA9IE9QSl9UUlVFIGlzIG5vdCBzdXBwb3J0ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAABBQAADQUAAAAUgAAAAAAAAgUAAAwFAAAAFIAAABAAAAMFAAANBQAAABOAAAAAAAAEBQAADAUAAAATgAAAEAAABQUAAA0FAAAAEwAAAAAAAAYFAAACBRAAABMAAAAQAAAHBQAAAwUQAAASQAAAAAAACAUAAAQFEAAAEkAAABAAAAkFAAAFBRAAABHAAAAAAAAKBQAACAUQAAARwAAAEAAACwUAAAkFEAAAEWAAAAAAAAoFIAAKBRAAABFgAAAQAAALBSAACwUQAAAVYAAAAAAADgUAAA0FAAAAFWAAABAAAA8FAAAMBQAAABVAAAAAAAAABRAADAUAAAAVQAAAEAAAAQUQAA0FAAAAFRAAAAAAAAIFEAAOBQAAABUQAAAQAAADBRAADwUAAAAUgAAAAAAABAUQAAAFEAAAFIAAABAAAAUFEAABBRAAABOAAAAAAAAGBRAAAgUQAAATgAAAEAAABwUQAAMFEAAAE0AAAAAAAAgFEAAEBRAAABNAAAAQAAAJBRAABQUQAAATAAAAAAAACgUQAAYFEAAAEwAAABAAAAsFEAAHBRAAABKAAAAAAAAMBRAABgUQAAASgAAAEAAADQUQAAcFEAAAEkAAAAAAAA4FEAAIBRAAABJAAAAQAAAPBRAACQUQAAASIAAAAAAAAAUgAAoFEAAAEiAAABAAAAEFIAALBRAAABHAAAAAAAACBSAADAUQAAARwAAAEAAAAwUgAA0FEAAAEYAAAAAAAAQFIAAOBRAAABGAAAAQAAAFBSAADwUQAAARYAAAAAAABgUgAAAFIAAAEWAAABAAAAcFIAABBSAAABFAAAAAAAAIBSAAAgUgAAARQAAAEAAACQUgAAMFIAAAESAAAAAAAAoFIAAEBSAAABEgAAAQAAALBSAABQUgAAAREAAAAAAADAUgAAYFIAAAERAAABAAAA0FIAAHBSAADBCgAAAAAAAOBSAACAUgAAwQoAAAEAAADwUgAAkFIAAMEJAAAAAAAAAFMAAKBSAADBCQAAAQAAABBTAACwUgAAoQgAAAAAAAAgUwAAwFIAAKEIAAABAAAAMFMAANBSAAAhBQAAAAAAAEBTAADgUgAAIQUAAAEAAABQUwAA8FIAAEEEAAAAAAAAYFMAAABTAABBBAAAAQAAAHBTAAAQUwAAoQIAAAAAAACAUwAAIFMAAKECAAABAAAAkFMAADBTAAAhAgAAAAAAAKBTAABAUwAAIQIAAAEAAACwUwAAUFMAAEEBAAAAAAAAwFMAAGBTAABBAQAAAQAAANBTAABwUwAAEQEAAAAAAADgUwAAgFMAABEBAAABAAAA8FMAAJBTAACFAAAAAAAAAABUAACgUwAAhQAAAAEAAAAQVAAAsFMAAEkAAAAAAAAAIFQAAMBTAABJAAAAAQAAADBUAADQUwAAJQAAAAAAAABAVAAA4FMAACUAAAABAAAAUFQAAPBTAAAVAAAAAAAAAGBUAAAAVAAAFQAAAAEAAABwVAAAEFQAAAkAAAAAAAAAgFQAACBUAAAJAAAAAQAAAJBUAAAwVAAABQAAAAAAAACgVAAAQFQAAAUAAAABAAAAsFQAAFBUAAABAAAAAAAAAKBUAABgVAAAAQAAAAEAAACwVAAAcFQAAAFWAAAAAAAAwFQAAMBUAAABVgAAAQAAANBUAADQVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHpuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQam8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB6bwBCwcBAAEAAQABAEH5vAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGYvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGQwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHQwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAHhiAEGQwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHhwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBm8IBCwEMAEGnwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABB1cIBCwEQAEHhwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBj8MBCwESAEGbwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB0sMBCw4aAAAAGhoaAAAAAAAACQBBg8QBCwEUAEGPxAELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBvcQBCwEWAEHJxAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB8cQBCwhsAQAAAAAABQBBhMUBCwFpAEGcxQELDmoAAABrAAAA+GcAAAAEAEG0xQELAQEAQcTFAQsF/////wo="; + var f = "data:application/octet-stream;base64,AGFzbQEAAAABzgEaYAN/f38Bf2AEf39/fwF/YAF/AGACf38AYAF/AX9gA39/fwBgAn9/AX9gBH9/f38AYAN/fn8BfmAFf39/f38Bf2ACfn8Bf2ACfn8BfmAFf39/f38AYAN/fn8Bf2AAAX9gB39/f39/f38Bf2AJf39/f39/f39/AX9gC39/f39/f39/f39/AX9gBn9/f39/fwF/YAZ/fH9/f38Bf2AIf39/f39/f38AYAh/f39/f39/fwF/YAAAYAZ/f39/f38AYAd/f39/f39/AGACfH8BfAJbDwFhAWEAAgFhAWIAAQFhAWMABQFhAWQAAgFhAWUADAFhAWYABwFhAWcAAwFhAWgABwFhAWkABQFhAWoACQFhAWsABAFhAWwABgFhAW0ABgFhAW4ABAFhAW8AAwPAAb4BBwIFAAYEAAUGBAUBBAwFFAYCAgICAAYQEQQCChICBQIEBwQCDgICDQYCFQMHAAAEAwEWCQkDAAkGAQQEBQUODwEBAwADBgIQBBcYAgcGAwcHAQECAAQZBAYHBA8MAAQCAgIABgAGAQEBAQEBAQEAAAAAAAYDAgICAwMDAwMAAxMIBA4EAAgDAwkECAoLCAAAAQEBAQEBAQENAQAEBAUJDwESEQEAAAYDAwEFBQUFBQUFBQELAQEBAQEBAQEBCgQFAXABbm4FBwEBggKAgAIGCAF/AUGQ2QULBxsGAXACAAFxAEEBcgCYAQFzABABdAEAAXUAlwEJvQEBAEEBC21RzAHCAXNzNqcBnAGZAYsBigGJAYgBhwGGAYUBhAFSgQGAAX9+fXx7enl4d3Z1ywHKAckByAHHAcYBQMUBxAFAQMMBwQHAAb8BvgG9AbwBuwG6AbkBswGoAaYBpQGkAaMBogGhAaABnwGeAZ0BmwGaAUlKTFJIgwFTOFCCAU9FRk4rJ6sBqgGsAbQBuAG1Aa8BqQGtAa4BtgG3AXCwAbEBsgFRlgGVAYwBjgGNAZIBkwGUAZABjwEKkZoOvgGCAgEDfyMAQZAEayIEJAACQCAARQ0AAkACQAJAAkAgAUEBaw4EAAEEAgQLIABBDGohAQwCCyAAQRBqIQEgAEEEaiEADAELIABBFGohASAAQQhqIQALIAEoAgAiBUUNACACRQ0AIAAoAgAhBiAEQQBBgAQQFSIBIAM2AowEIwBBoAFrIgAkACAAIAE2ApQBIABB/wM2ApgBIABBAEGQARAVIgBBfzYCTCAAQeYANgIkIABBfzYCUCAAIABBnwFqNgIsIAAgAEGUAWo2AlQgAUEAOgAAIAAgAiADQecAQegAEGsgAEGgAWokACABQQA6AP8DIAEgBiAFEQMACyAEQZAEaiQAC9ACAQV/IAAEQCAAQQRrIgMoAgAiBCEBIAMhAiAAQQhrKAIAIgAgAEF+cSIARwRAIAIgAGsiAigCBCIBIAIoAggiBTYCCCAFIAE2AgQgACAEaiEBCyADIARqIgAoAgAiAyAAIANqQQRrKAIARwRAIAAoAgQiBCAAKAIIIgA2AgggACAENgIEIAEgA2ohAQsgAiABNgIAIAIgAUF8cWpBBGsgAUEBcjYCACACAn8gAigCAEEIayIAQf8ATQRAIABBA3ZBAWsMAQsgAGchAyAAQR0gA2t2QQRzIANBAnRrQe4AaiAAQf8fTQ0AGkE/IABBHiADa3ZBAnMgA0EBdGtBxwBqIgAgAEE/TxsLIgFBBHQiAEGgxwFqNgIEIAIgAEGoxwFqIgAoAgA2AgggACACNgIAIAIoAgggAjYCBEGozwFBqM8BKQMAQgEgAa2GhDcDAAsLyQIBBH8gAUEANgIAAkAgAkUNACABIAJqIQMCQCACQRBJBEAgACEBDAELAkAgACACaiABTQ0AIAAgA08NACAAIQEMAQsgA0EQayEGIAAgAkFwcSIFaiEBIAMgBWshAwNAIAYgBGsgACAEav0AAAD9DAAAAAAAAAAAAAAAAAAAAAD9DQ8ODQwLCgkIBwYFBAMCAQD9CwAAIARBEGoiBCAFRw0ACyACIAVGDQELAkAgAkEDcSIGRQRAIAUhBAwBC0EAIQAgBSEEA0AgA0EBayIDIAEtAAA6AAAgBEEBaiEEIAFBAWohASAAQQFqIgAgBkcNAAsLIAUgAmtBfEsNAANAIANBAWsgAS0AADoAACADQQJrIAEtAAE6AAAgA0EDayABLQACOgAAIANBBGsiAyABLQADOgAAIAFBBGohASAEQQRqIgQgAkcNAAsLC4AEAQN/IAJBgARPBEAgACABIAIQAiAADwsgACACaiEDAkAgACABc0EDcUUEQAJAIABBA3FFBEAgACECDAELIAJFBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECUiAARAIABBACABEBUaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECUL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLIAALJwEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBAEEAEGsgA0EQaiQAC+gFAQl/IAFFBEBBAA8LAn8gAEUE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ACAEIE5BCmpBAiAFEBpBAkcEQCAFQQFBAiAAKAK4ARtBlhJBABAPIAAoArgBRSFnDAELIE5BCmogTkEMakECEBEgTigCDCIBQZD/A0YNACABQdn/A0YEQCAAQYACNgIIIABBADYCzAEMAQsgBCkDCCKGAVAEfkIABSCGASAEKQM4fQtQBEAgAEHAADYCCCAFQQJBrD9BABAPDAELQQAhZyAFQQFB7D5BABAPCyBOQRBqJAAgZwsLACAABEAgABAQCwu0AQEBfyAAKAIMRQRAIAIgACgCJCABEQMADwsCQEEIEBQiA0UNACADIAI2AgQgAyABNgIAQQgQFCIBRQRAIAMQEA8LIAEgAzYCACAAIAAoAgRB5ABsIgI2AigDQCAAKAIYIAJKDQALIAEgACgCFDYCBCAAIAE2AhQgACAAKAIYQQFqNgIYIAAoAhwiAUUNACABKAIAQQA2AgggACABKAIENgIcIAAgACgCIEEBazYCICABEBALC/oCAQR/AkAgAEUNACAAKAKsKCIBBEAgACgCqCgiAgRAQQAhAQNAIAAoAqwoIAFBA3RqKAIAIgMEQCADEBAgACgCqCghAgsgAUEBaiIBIAJJDQALIAAoAqwoIQELIABBADYCqCggARAQIABBADYCrCgLIAAoArQoIgEEQCABEBAgAEEANgK0KAsgACgC0CsiAQRAIAEQECAAQQA2AtArCyAAKALsKyIBBEAgARAQIABBADYC7CsLIAAoAugrIgEEQCABEBAgAEEANgLoKwsgACgC/CsiAQRAIAEQECAAQQA2AoQsIABCADcC/CsLIAAoAvArIgEEQCAAKAL0KyIDBH9BACECA0AgASgCDCIEBEAgBBAQIAFBADYCDCAAKAL0KyEDCyABQRRqIQEgAkEBaiICIANJDQALIAAoAvArBSABCxAQIABBADYC8CsLIAAoAuQrIgEEQCABEBAgAEEANgLkKwsgACgC3CsiAUUNACABEBAgAEIANwLcKwsLyAcCEX8BfiAAKAIQIghBIE8EQCAAKQMIpw8LAkAgACgCFCIDQQROBEAgACgCACICQQNrKAIAIQEgACADQQRrIgM2AhQgACACQQRrNgIADAELIANBAEwEQAwBCyADQQFxIQ0gACgCACECAkAgA0EBRgRAQRghBAwBCyADQf7///8HcSEJQRghBANAIAAgAkEB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IABBADYCiAEgACgCZBAQIABBADYCZCAALQC8AUECcUUEQCAAKAKoARAQCyAAQdAAakEAQfAAEBUaIAAoAsABEDIgAEEANgLAASAAKALEARAyIABBADYCwAEgACgCyAEiAQRAIAEoAhwiAgRAIAIQECABQQA2AhwLIAEoAigiAgRAIAEoAiQEQANAIAIgBUEobCIDaigCJCIEBEAgBBAQIAEoAigiAiADakEANgIkCyACIANqKAIQIgQEQCAEEBAgASgCKCICIANqQQA2AhALIAIgA2ooAhgiBARAIAQQECABKAIoIgIgA2pBADYCGAsgBUEBaiIFIAEoAiRJDQALCyACEBAgAUEANgIoCyABEBALIABBADYCyAEgACgCSBAhIABBADYCSCAAKAJMECEgAEEANgJMIAAoAtQBIgMEQAJAIAMoAghFDQAgAygCDARAIANBADYCKANAIAMoAhhBAEoNAAsLIANBATYCECADKAIAEBAgAygCHCICRQ0AA0AgAigCBCEBIAIQECADIAE2AhwgASICDQALCyADKAIkIgIEQCACKAIEIgVBAEoEQEEAIQEDQCACKAIAIAFBDGxqIgQoAggiBgRAIAQoAgQgBhECACACKAIEIQULIAFBAWoiASAFSA0ACwsgAigCABAQIAIQEAsgAxAQCyAAQQA2AtQBIAAQEAsL5gMCCH8EfiAAKAIUKAIAKAIUIAFBzABsaiIJKAIMIgggACgCGCgCGCABQTRsaiIKNQIEIhBCAX0iEiAANQI8fCAQgKciCyAIIAtJGyEMIAkoAggiCCAKNQIAIhFCAX0iEyAANQI4fCARgKciCiAIIApJGyEKIAkoAgQiCCASIAA1AjR8IBCApyILIAggC0sbIQsgCSgCACIIIBMgADUCMHwgEYCnIg0gCCANSxshDUEAIQggACgCICgC0CsgAUG4CGxqKAIUIQ4CQCAJKAIUQQAgAmtBfyACG2oiAkUEQCAKIQAgDSEIIAshAQwBCyADQQFxIAJBAWsiD3QiCSANSQRAIA0gCWutQn8gAq0iEIZCf4V8IBCIpyEIC0EAIQBBACEBIANBAXYgD3QiAyALSQRAIAsgA2utQn8gAq0iEIZCf4V8IBCIpyEBCyAJIApJBEAgCiAJa61CfyACrSIQhkJ/hXwgEIinIQALIAMgDE8EQEEAIQwMAQsgDCAD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IABBADYCPCAAQucHNwI0IABBADYCLCAAQucHNwIkIABBADYCHCAAQucHNwIUIABBADYCDCAAQucHNwIEIABBQGshACACQQRqIgIgA0cNAAsLIAFBA3EiAUUNAEEAIQIDQCAAQQA2AgwgAELnBzcCBCAAQRBqIQAgAkEBaiICIAFHDQALCwv7BQEQfyMAQYACayIIJAACf0EBQRQQEyIGRQRAIAJBAUH0MEEAEA9BAAwBCyAGIAE2AgQgBiAANgIAIAggATYCACAIIAA2AoABA0AgCCAFIg1BAWoiBUECdCIHaiABQQFqQQJtIgM2AgAgCEGAAWogB2ogAEEBakECbSIHNgIAIAQgACABbCIJaiEEIAMhASAHIQAgCUEBSw0ACyAGIAQ2AgggBEUEQCAGEBBBAAwBCyAGIARBEBATIgM2AgwgA0UEQCACQQFB2hpBABAPIAYQEEEADAELIAYgBigCCCILQQR0NgIQIAMhACANBEAgAyAGKAIEIAYoAgBsQQR0aiIEIQEDQAJAIAggDkECdCICaigCACIJQQBMDQAgCUEBayEMQQAhBwJAIAhBgAFqIAJqKAIAIgJBAEwEQEEAIQUgCUEBRwRAIAlB/v///wdxIQoDQCAFIAxGIQ8gBUECaiEFIAEgBCAPGyIEIQEgB0ECaiIHIApHDQALCyAJQQFxDQEgBCEBDAILA0AgBCEFIAIhBANAAkAgACABNgIAIARBAUYEQCAAQRBqIQAgAUEQaiEBDAELIAAgATYCECABQRBqIQEgAEEgaiEAIARBAkohECAEQQJrIQQgEA0BCwsgASAFIAJBBHRqIAcgByAMRnJBAXEiChshBCABIAUgChshASAHQQFqIgcgCUcNAAsMAQsgASAEIAJBBHRqIAUgBSAMRnJBAXEiBRshESABIAQgBRshASARIQQLIA5BAWoiDiANRw0ACwsgAEEANgIAAkAgC0UNACALQQRPBEAgC0F8cSEAQQAhAQNAIANBADYCPCADQucHNwI0IANBADYCLCADQucHNwIkIANBADYCHCADQucHNwIUIANBADYCDCADQucHNwIEIANBQGshAyABQQRqIgEgAEcNAAsLIAtBA3EiAEUNAEEAIQEDQCADQQA2AgwgA0LnBzcCBCADQRBqIQMgAUEBaiIBIABHDQALCyAGCyESIAhBgAJqJAAgEgtTAQF/An8gAC0ADEH/AUYEQCAAQoD+g4DwADcCDEEAIAAoAggiASAAKAIETw0BGiAAIAFBAWo2AgggACABLQAAQYD+A3I2AgwLIABBADYCEEEBCwt+AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARBlIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLSQEBfwJAQQFBLBATIgEEQCABQQA2AhACQCAAQQBMBEAgAUEBQQgQEyIANgIkIABFDQEMAwsgAUEANgIMCyABEBALQQAhAQsgAQuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGU0AEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTHAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASEGIAQhAiAFIQMgBkEwayIBQQpJDQALIAILtBQCFX8BfiMAQUBqIggkACAIIAE2AjwgCEEnaiEWIAhBKGohEQJAAkACQAJAA0BBACEHA0AgASENIAcgDkH/////B3NKDQIgByAOaiEOAkACQAJAAkAgASIHLQAAIgsEQANAAkACQCALQf8BcSIBRQRAIAchAQwBCyABQSVHDQEgByELA0AgCy0AAUElRwRAIAshAQwCCyAHQQFqIQcgCy0AAiEZIAtBAmoiASELIBlBJUYNAAsLIAcgDWsiByAOQf////8HcyIXSg0JIAAEQCAAIA0gBxAZCyAHDQcgCCABNgI8IAFBAWohB0F/IRACQCABLAABQTBrIglBCUsNACABLQACQSRHDQAgAUEDaiEHQQEhEiAJIRALIAggBzYCPEEAIQwCQCAHLAAAIgtBIGsiAUEfSwRAIAchCQwBCyAHIQlBASABdCIBQYnRBHFFDQADQCAIIAdBAWoiCTYCPCABIAxyIQwgBywAASILQSBrIgFBIE8NASAJIQdBASABdCIBQYnRBHENAAsLAkAgC0EqRgRAAn8CQCAJLAABQTBrIgFBCUsNACAJLQACQSRHDQACfyAARQRAIAQgAUECdGpBCjYCAEEADAELIAMgAUEDdGooAgALIQ8gCUEDaiEBQQEMAQsgEg0GIAlBAWohASAARQRAIAggATYCPEEAIRJBACEPDAMLIAIgAigCACIHQQRqNgIAIAcoAgAhD0EACyESIAggATYCPCAPQQBODQFBACAPayEPIAxBgMAAciEMDAELIAhBPGoQaSIPQQBIDQogCCgCPCEBC0EAIQdBfyEKAn9BACABLQAAQS5HDQAaIAEtAAFBKkYEQAJ/AkAgASwAAkEwayIJQQlLDQAgAS0AA0EkRw0AIAFBBGohAQJ/IABFBEAgBCAJQQJ0akEKNgIAQQAMAQsgAyAJQQN0aigCAAsMAQsgEg0GIAFBAmohAUEAIABFDQAaIAIgAigCACIJQQRqNgIAIAkoAgALIQogCCABNgI8IApBAE4MAQsgCCABQQFqNgI8IAhBPGoQaSEKIAgoAjwhAUEBCyETA0AgByEUQRwhCSABIhgsAAAiB0H7AGtBRkkNCyABQQFqIQEgByAUQTpsakG/wAFqLQAAIgdBAWtBCEkNAAsgCCABNgI8AkAgB0EbRwRAIAdFDQwgEEEATgRAIABFBEAgBCAQQQJ0aiAHNgIADAwLIAggAyAQQQN0aikDADcDMAwCCyAARQ0IIAhBMGogByACIAYQaAwBCyAQQQBODQtBACEHIABFDQgLIAAtAABBIHENCyAMQf//e3EiCyAMIAxBgMAAcRshDEEAIRBBsAghFSARIQkCQAJAAn8CQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIBgsAAAiB0FTcSAHIAdBD3FBA0YbIAcgFBsiB0HYAGsOIQQWFhYWFhYWFhAWCQYQEBAWBhYWFhYCBQMWFgoWARYWBAALAkAgB0HBAGsOBxAWCxYQEBAACyAHQdMARg0LDBULIAgpAzAhHEGwCAwFC0EAIQcCQAJAAkACQAJAAkACQCAUQf8BcQ4IAAECAwQcBQYcCyAIKAIwIA42AgAMGwsgCCgCMCAONgIADBoLIAgoAjAgDqw3AwAMGQsgCCgCMCAOOwEADBgLIAgoAjAgDjoAAAwXCyAIKAIwIA42AgAMFgsgCCgCMCAOrDcDAAwVC0EIIAogCkEITRshCiAMQQhyIQxB+AAhBwsgESEBIAgpAzAiHEIAUgRAIAdBIHEhDQNAIAFBAWsiASAcp0EPcUHQxAFqLQAAIA1yOgAAIBxCD1YhGiAcQgSIIRwgGg0ACwsgASENIAgpAzBQDQMgDEEIcUUNAyAHQQR2QbAIaiEVQQIhEAwDCyARIQEgCCkDMCIcQgBSBEADQCABQQFrIgEgHKdBB3FBMHI6AAAgHEIHViEbIBxCA4ghHCAbDQALCyABIQ0gDEEIcUUNAiAKIBEgAWsiAUEBaiABIApIGyEKDAILIAgpAzAiHEIAUwRAIAhCACAcfSIcNwMwQQEhEEGwCAwBCyAMQYAQcQRAQQEhEEGxCAwBC0GyCEGwCCAMQQFxIhAbCyEVIBwgERAqIQ0LIBMgCkEASHENESAMQf//e3EgDCATGyEMAkAgCCkDMCIcQgBSDQAgCg0AIBEhDUEAIQoMDgsgCiAcUCARIA1raiIBIAEgCkgbIQoMDQsgCCkDMCEcDAsLAn9B/////wcgCiAKQf////8HTxsiDCIHQQBHIQkCQAJAAkAgCCgCMCIBQYQMIAEbIg0iAUEDcUUNACAHRQ0AA0AgAS0AAEUNAiAHQQFrIgdBAEchCSABQQFqIgFBA3FFDQEgBw0ACwsgCUUNAQJAIAEtAABFDQAgB0EESQ0AA0BBgIKECCABKAIAIglrIAlyQYCBgoR4cUGAgYKEeEcNAiABQQRqIQEgB0EEayIHQQNLDQALCyAHRQ0BCwNAIAEgAS0AAEUNAhogAUEBaiEBIAdBAWsiBw0ACwtBAAsiASANayAMIAEbIgEgDWohCSAKQQBOBEAgCyEMIAEhCgwMCyALIQwgASEKIAktAAANDwwLCyAIKQMwIhxCAFINAUIAIRwMCQsgCgRAIAgoAjAMAgtBACEHIABBICAPQQAgDBAcDAILIAhBADYCDCAIIBw+AgggCCAIQQhqIgc2AjBBfyEKIAcLIQtBACEHA0ACQCALKAIAIg1FDQAgCEEEaiANEGciDUEASA0PIA0gCiAHa0sNACALQQRqIQsgByANaiIHIApJDQELC0E9IQkgB0EASA0MIABBICAPIAcgDBAcIAdFBEBBACEHDAELQQAhCSAIKAIwIQsDQCALKAIAIg1FDQEgCEEEaiIKIA0QZyINIAlqIgkgB0sNASAAIAogDRAZIAtBBGohCyAHIAlLDQALCyAAQSAgDyAHIAxBgMAAcxAcIA8gByAHIA9IGyEHDAgLIBMgCkEASHENCUE9IQkgACAIKwMwIA8gCiAMIAcgBRETACIHQQBODQcMCgsgBy0AASELIAdBAWohBwwACwALIAANCSASRQ0DQQEhBwNAIAQgB0ECdGooAgAiAARAIAMgB0EDdGogACACIAYQaEEBIQ4gB0EBaiIHQQpHDQEMCwsLQQEhDiAHQQpPDQkDQCAEIAdBAnRqKAIADQEgB0EBaiIHQQpHDQALDAkLQRwhCQwGCyAIIBw8ACdBASEKIBYhDSALIQwLIAogCSANayILIAogC0obIgogEEH/////B3NKDQNBPSEJIA8gCiAQaiIBIAEgD0gbIgcgF0oNBCAAQSAgByABIAwQHCAAIBUgEBAZIABBMCAHIAEgDEGAgARzEBwgAEEwIAogC0EAEBwgACANIAsQGSAAQSAgByABIAxBgMAAcxAcIAgoAjwhAQwBCwsLQQAhDgwDC0E9IQkLQZTHASAJNgIAC0F/IQ4LIAhBQGskACAOC6gCAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEBUaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEEGpBAEgNACAAKAJMQQBIIQggACAAKAIAIgdBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABA+DQEaCyAAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEGoLIQEgBgR/IABBAEEAIAAoAiQRAAAaIABBADYCMCAAIAY2AiwgAEEANgIcIAAoAhQaIABCADcDEEEABSABCxogACAAKAIAIAdBIHFyNgIAIAgNAAsgBUHQAWokAAsnAQF/QRwhAyABQQNxBH9BHAUgACABIAIQJSIANgIAQQBBMCAAGwsL/QMBBX8Cf0HgxAEoAgAiAiAAQQdqQXhxIgFBB2pBeHEiA2ohAAJAIANBACAAIAJNG0UEQCAAPwBBEHRNDQEgABAKDQELQZTHAUEwNgIAQX8MAQtB4MQBIAA2AgAgAgsiAkF/RwRAIAEgAmoiAEEEa0EQNgIAIABBEGsiA0EQNgIAAkACf0GgzwEoAgAiAQR/IAEoAggFQQALIAJGBEAgAiACQQRrKAIAQX5xayIEQQRrKAIAIQUgASAANgIIIAQgBUF+cWsiACAAKAIAakEEay0AAEEBcQRAIAAoAgQiASAAKAIIIgQ2AgggBCABNgIEIAAgAyAAayIBNgIADAMLIAJBEGsMAQsgAkEQNgIAIAIgADYCCCACIAE2AgQgAkEQNgIMQaDPASACNgIAIAJBEGoLIgAgAyAAayIBNgIACyAAIAFBfHFqQQRrIAFBAXI2AgAgAAJ/IAAoAgBBCGsiAUH/AE0EQCABQQN2QQFrDAELIAFBHSABZyIDa3ZBBHMgA0ECdGtB7gBqIAFB/x9NDQAaQT8gAUEeIANrdkECcyADQQF0a0HHAGoiASABQT9PGwsiAUEEdCIDQaDHAWo2AgQgACADQajHAWoiAygCADYCCCADIAA2AgAgACgCCCAANgIEQajPAUGozwEpAwBCASABrYaENwMACyACQX9HC70BAQJ/AkAgACgCTCIBQQBOBEAgAUUNAUHMzwEoAgAgAUH/////A3FHDQELAkAgACgCUEEKRg0AIAAoAhQiASAAKAIQRg0AIAAgAUEBajYCFCABQQo6AAAPCyAAEG8PCyAAQcwAaiIBIAEoAgAiAkH/////AyACGzYCAAJAAkAgACgCUEEKRg0AIAAoAhQiAiAAKAIQRg0AIAAgAkEBajYCFCACQQo6AAAMAQsgABBvCyABKAIAGiABQQA2AgALfAECfyMAQRBrIgEkACABQQo6AA8CQAJAIAAoAhAiAgR/IAIFIAAQPg0CIAAoAhALIAAoAhQiAkYNACAAKAJQQQpGDQAgACACQQFqNgIUIAJBCjoAAAwBCyAAIAFBD2pBASAAKAIkEQAAQQFHDQAgAS0ADxoLIAFBEGokAAuwAgECfyAABEAgACgCABA4IABBADYCACAAKAJIIgEEQCABEBAgAEEANgJICyAAKAJEIgEEQCABEBAgAEEANgJECyAAKAJsIgEEQCABEBAgAEEANgJsCyAAKAJ0IgEEQCABKAIAIgIEQCACEBAgACgCdCIBQQA2AgALIAEQECAAQQA2AnQLIAAoAngiAQRAIAEoAgwiAgRAIAIQECAAKAJ4IgFBADYCDAsgASgCBCICBEAgAhAQIAAoAngiAUEANgIECyABKAIIIgIEQCACEBAgACgCeCIBQQA2AggLIAEoAgAiAgRAIAIQECAAKAJ4IgFBADYCAAsgARAQIABBADYCeAsgACgCBCIBBEAgARAyIABBADYCBAsgACgCCCIBBEAgARAyIABBADYCCAsgABAQCwuLGwIefwV7IwBB8AFrIgkkAEEBIQ4CQCAAKAIAKAI8DQAgACgCgAENAAJAAkAgACgCdCIIRQRAIAAoAnghBAwBCyABKAIQIQMgCC8BBCEGAkAgACgCeCIERQ0AIAQoAgxFDQAgBC0AEiEDCwJAIAYEQCAIKAIAIQgDQCAIIAVBBmxqIgovAQAiByADTwRAIAkgAzYCtAEgCSAHNgKwASACQQFBoOYAIAlBsAFqEA9BACEODAYLAkAgCi8BBCIKRQ0AIApB//8DRg0AIApBAWsiCiADSQ0AIAkgAzYCpAEgCSAKNgKgASACQQFBoOYAIAlBoAFqEA9BACEODAYLIAVBAWoiBSAGRw0ACwwBCyADDQIMAQsDQCADQQFrIQNBACEFA0AgCCAFQQZsai8BACADRwRAIAVBAWoiBSAGRw0BDAQLCyADDQALCwJAIARFDQAgBCgCDCIKRQ0AAkACQCAELQASIggEQEEAIQVBASEHA0AgASgCECIDIAogBUECdGovAQAiBE0EQCAJIAM2ApQBIAkgBDYCkAEgAkEBQaDmACAJQZABahAPQQAhBwsgBUEBaiIFIAhHDQALIAhBBBATIgNFDQFBACEFA0ACQCAKIAVBAnRqIgQtAAIiBkECTwRAIAkgBjYCRCAJIAU2AkAgAkEBQcvZACAJQUBrEA9BACEHDAELIAggBC0AAyIETQRAIAkgBDYCgAEgAkEBQZPZACAJQYABahAPQQAhBwwBCyADIARBAnRqIQsCQCAGQQFHIgwNACALKAIARQ0AIAkgBDYCUCACQQFBvNUAIAlB0ABqEA9BACEHDAELAkAgBg0AIARFDQAgCSAENgJkIAkgBTYCYCACQQFBitgAIAlB4ABqEA9BACEHDAELAkAgDA0AIAQgBUYNACAJIAQ2AnggCSAFNgJ0IAkgBTYCcCACQQFBrtgAIAlB8ABqEA9BACEHDAELIAtBATYCAAsgBUEBaiIFIAhHDQALQQAhBQNAAkACQCADIAVBAnQiBGooAgBFBEAgBCAKai0AAg0BCyAFQQFqIgUgCEcNAiAHRQ0BIAEoAhBBAUcNBUEAIQUDQCADIAVBAnRqKAIABEAgCCAFQQFqIgVHDQEMBwsLQQAhByACQQJB7sUAQQAQDyAIQRBPBEAgCEHwAXEhB0EAIQQDQCAKIARBAnRqIgZBAToAAiAGIAQ6AAMgBkEBOgA+IAZBAToAOiAGQQE6ADYgBkEBOgAyIAZBAToALiAGQQE6ACogBkEBOgAmIAZBAToAIiAGQQE6AB4gBkEBOgAaIAZBAToAFiAGQQE6ABIgBkEBOgAOIAZBAToACiAGQQE6AAYgBiAEQQFyOgAHIAYgBEEPcjoAPyAGIARBDnI6ADsgBiAEQQ1yOgA3IAYgBEEMcjoAMyAGIARBC3I6AC8gBiAEQQpyOgArIAYgBEEJcjoAJyAGIARBCHI6ACMgBiAEQQdyOgAfIAYgBEEGcjoAGyAGIARBBXI6ABcgBiAEQQRyOgATIAYgBEEDcjoADyAGIARBAnI6AAsgBEEQaiIEIAdHDQALIAcgCEYNBgsDQCAKIAdBAnRqIgQgBzoAAyAEQQE6AAIgB0EBaiIHIAhHDQALDAULIAkgBTYCMCACQQFByNIAIAlBMGoQD0EAIQcgBUEBaiIFIAhHDQELCyADEBBBACEODAULIAhBBBATIgMNAQtBACEOIAJBAUGK2wBBABAPDAMLIAMQEAsCQCAAKAJ4IgNFDQAgAygCDCIPRQRAIAMoAgQQECAAKAJ4KAIIEBAgACgCeCgCABAQIAAoAngiAygCDCIEBH8gBBAQIAAoAngFIAMLEBAgAEEANgJ4DAELIAEoAhghDQJAAkAgAy0AEiIKBEAgAygCACEUIAMoAgQhBiADKAIIIQhBACEFAkADQCANIA8gBUECdGovAQBBNGxqKAIsBEAgCiAFQQFqIgVHDQEMAgsLIAkgBTYCICACQQFBwucAIAlBIGoQD0EAIQ4MBgsgCkE0bBAUIgtFDQFBACEFA0AgDyAFQQJ0aiIDLwEAIQcgCyADLQACBH8gAy0AAwUgBQtBNGxqIgQgDSAHQTRsaiID/QACAP0LAgAgBCADKAIwNgIwIAQgA/0AAiD9CwIgIAQgA/0AAhD9CwIQIAsgBUE0bGoiBCADKAIIIAMoAgxsQQJ0EBgiAzYCLCADRQRAIAUEQCAFQf//A3EhAANAIABBNGwgC2pBCGsoAgAQECAAQQFrIgANAAsLIAsQEEEAIQ4gAkEBQY7nAEEAEA8MBwsgBCAFIAhqLQAANgIYIAQgBSAGai0AADYCICAFQQFqIgUgCkcNAAsgACgCeC8BECIQQQFrIRIDQCALIBNBNGxqIgMoAgwgAygCCGwhBiANIA8gE0ECdGoiBC8BAEE0bGooAiwhCAJAIAQtAAJFBEAgBkUNASADKAIsIQVBACEHQQAhBAJAIAZBBEkNACAFIAhrQRBJDQAgBkF8cSEEQQAhAwNAIAUgA0ECdCIMaiAIIAxq/QACAP0LAgAgA0EEaiIDIARHDQALIAQgBkYNAgsgBCEDIAZBA3EiDARAA0AgBSADQQJ0IhFqIAggEWooAgA2AgAgA0EBaiEDIAdBAWoiByAMRw0ACwsgBCAGa0F8Sw0BA0AgBSADQQJ0IgRqIAQgCGooAgA2AgAgBSAEQQRqIgdqIAcgCGooAgA2AgAgBSAEQQhqIgdqIAcgCGooAgA2AgAgBSAEQQxqIgRqIAQgCGooAgA2AgAgA0EEaiIDIAZHDQALDAELIAZFDQAgFCAELQADIgNBAnRqIQQgCyADQTRsaigCLCEFQQAhAyAGQQFHBEAgBkF+cSEVQQAhDANAIAUgA0ECdCIHaiAEIAcgCGooAgAiESASIBAgEUobQQAgEUEAThsgCmxBAnRqKAIANgIAIAUgB0EEciIHaiAEIAcgCGooAgAiByASIAcgEEgbQQAgB0EAThsgCmxBAnRqKAIANgIAIANBAmohAyAMQQJqIgwgFUcNAAsLIAZBAXFFDQAgBSADQQJ0IgNqIAQgAyAIaigCACIDIBIgAyAQSBtBACADQQBOGyAKbEECdGooAgA2AgALIBNBAWoiEyAKRw0ACwwCCyAKQTRsEBQiCw0BC0EAIQ4gAkEBQY7nAEEAEA8MAwsgASgCECIDBEBBACEFA0AgDSAFQTRsaigCLCIEBEAgBBAQCyAFQQFqIgUgA0cNAAsLIA0QECABIAo2AhAgASALNgIYCyAAKAJ0IgVFDQEgBSgCACEHIAUvAQQiCwRAIAdBKmohEiAHQSRqIRMgB0EeaiERIAdBGGohFCAHQRJqIRUgB0EMaiEWIAdBBmohFyALQQJrIRhBACEFQQEhBANAAkAgASgCECIDIAcgBUEGbGoiDS8BACIGTQRAIAkgAzYCFCAJIAY2AhAgAkECQcw3IAlBEGoQDwwBCyANLwEEIghBAWpB//8DcUEBTQRAIAEoAhggBkE0bGogDS8BAjsBMAwBCyAIQQFrIgpB//8DcSIPIANPBEAgCSADNgIEIAkgDzYCACACQQJBozcgCRAPDAELAkAgBiAPRg0AIA0vAQINACAJIAEoAhgiCCAGQTRsaiIDKAIwNgLoASAJIAP9AAIg/QsD2AEgCSAD/QACEP0LA8gBIAkgA/0AAgD9CwO4ASADIAggD0E0bCIMaiIIKQIINwIIIAMgCCkCEDcCECADIAgpAhg3AhggAyAIKQIgNwIgIAMgCCkCKDcCKCADIAgoAjA2AjAgAyAIKQIANwIAIAEoAhggDGoiAyAJ/QADuAH9CwIAIAMgCf0AA9gB/QsCICADIAn9AAPIAf0LAhAgAyAJKALoATYCMCAFQQFqIAtPDQAgBCEIIBggBWtB//8DcSIDQQdPBEAgBCADQQFqIhlB+P8HcSIQaiEIIAr9ECEkIAb9ECEjQQAhDANAICMgJCASIAQgDGpBBmwiA2oiGiADIBNqIhsgAyARaiIcIAMgFGoiHSADIBVqIh4gAyAWaiIfIAMgF2oiICADIAdqIgP9CAEA/VUBAAH9VQEAAv1VAQAD/VUBAAT9VQEABf1VAQAG/VUBAAciISAj/S4gISAk/S0iJf1O/VIhIiAhICP9LSAl/VAiIf0ZAEEBcQRAIAMgIv1ZAQAACyAh/RkBQQFxBEAgICAi/VkBAAELICH9GQJBAXEEQCAfICL9WQEAAgsgIf0ZA0EBcQRAIB4gIv1ZAQADCyAh/RkEQQFxBEAgHSAi/VkBAAQLICH9GQVBAXEEQCAcICL9WQEABQsgIf0ZBkEBcQRAIBsgIv1ZAQAGCyAh/RkHQQFxBEAgGiAi/VkBAAcLIAxBCGoiDCAQRw0ACyAQIBlGDQELA0AgCiEDAkAgBiAHIAhBBmxqIgwvAQAiEEcEQCAGIQMgDyAQRw0BCyAMIAM7AQALIAsgCEEBaiIIQf//A3FHDQALCyABKAIYIAZBNGxqIA0vAQI7ATALIARBAWohBCAFQQFqIgUgC0cNAAsgACgCdCIFKAIAIQcLIAcEfyAHEBAgACgCdAUgBQsQECAAQQA2AnQMAQtBACEOIAJBAUGhxgBBABAPCyAJQfABaiQAIA4L6QEBBn8jAEEgayIEJAACfwJAIAAoAjwiAwRAQQEhBQNAIAAoAkwoAhggACgCQCACQQJ0aigCACIGQTRsaigCLEUEQCAEIAY2AhAgAUECQdo5IARBEGoQD0EAIQUgACgCPCEDCyACQQFqIgIgA0kNAAsMAQtBASEFQQEgACgCTCIDKAIQRQ0BGgNAIAMoAhggAkE0bGooAixFBEAgBCACNgIAIAFBAkHaOSAEEA9BACEFIAAoAkwhAwsgAkEBaiICIAMoAhBJDQALC0EBIAUNABogAUEBQb8VQQAQD0EACyEHIARBIGokACAHCwQAQX8LhgcCFn8CfiAAKAIYIhAoAhBFBEBBAQ8LIBAoAhghDSAAKAIUKAIAKAIUIQsDQCABIA0oAiQiAjYCJCALKAIcIgYgAkGYAWxqIQMCQAJAAn8gACgCQCIRBEAgBiALKAIYQZgBbGoiAkGQAWsoAgAgAkGYAWsoAgBrIQwgA0EMaiEGIANBBGohBCADKAIIIQIgAygCACEFQSQMAQsgA0GUAWohBiADQYwBaiEEIAMoApABIgIgAygCiAEiBWshDEE0CyALaigCACISRQ0AIAQoAgAhByAGKAIAIQkgAiAFayEGIAEoAggiA0J/IAE1AigiGIZCf4UiGSABNQIQfCAYiKciCGohBAJ/IAUgCEsEQCAFIAhrIQ5BACEIQQAgAiAETQ0BGiAGIAQgBWsiBmsMAQsgCCAFayEIIAIgBE0EQCAGIAhrIQZBACEOQQAMAQtBACEOIAMhBiACIARrCyEVIAkgB2shAiABKAIMIgQgGSABNQIUfCAYiKciCmohBQJ/IAcgCksEQCAHIAprIQ9BACEKQQAgBSAJTw0BGiACIAUgB2siAmsMAQsgCiAHayEKIAUgCU8EQCACIAprIQJBACEPQQAMAQtBACEPIAQhAiAJIAVrCyEHQQAhBSAIQQBIDQEgCkEASA0BIBVBAEgNASAHQQBIDQEgBkEASA0BIAJBAEgNASADIA9sIA5qIQcgCiAMbCAIaiEJAkACQAJAIAEoAiwiCA0AIAkNACAHDQAgAyAMRw0AIAMgBkcNACACIARHDQEgASALQSRBNCARG2oiAigCADYCLCACQQA2AgAMAwsgCA0BCyAERQ0CIAStIAOtfkIgiKcNAiADIARsIgNB/////wNLDQIgASADQQJ0EBgiAzYCLCADRQ0CIAYgASgCCCIERiABKAIMIgUgAkZxDQAgA0EAIAQgBWxBAnQQFRoLIAJFDQAgAkEBcSEXIAZBAnQhBiABKAIsIAdBAnRqIQQgEiAJQQJ0aiEFIAJBAUcEQCACQf7///8HcSEHQQAhAgNAIAQgBSAGEBIhFiAFIAxBAnQiCWoiCCAJaiEFIBYgASgCCEECdGogCCAGEBIgASgCCEECdGohBCACQQJqIgIgB0cNAAsLIBdFDQAgBCAFIAYQEhoLIAtBzABqIQsgDUE0aiENIAFBNGohAUEBIQUgFEEBaiIUIBAoAhBJDQELCyAFC9USAgl/DH4jAEGgAWsiBSQAAkAgAkEjTQRAQQAhAiADQQFBti5BABAPDAELIAJBJGsiAiACQQNuIglBA2xHBEBBACECIANBAUG2LkEAEA8MAQsgACgCSCEGIAEgBUGcAWoiAkECEBEgACAFKAKcATsBUCABQQJqIAZBCGpBBBARIAFBBmogBkEMakEEEBEgAUEKaiAGQQQQESABQQ5qIAZBBGpBBBARIAFBEmogAEHcAGpBBBARIAFBFmogAEHgAGpBBBARIAFBGmogAEHUAGpBBBARIAFBHmogAEHYAGpBBBARIAFBImogAkECEBECQAJAAkAgBSgCnAEiAkGAgAFNBEAgBiACNgIQIAIgCUcEQCAFIAk2AoQBIAUgAjYCgAEgA0EBQZHwACAFQYABahAPQQAhAgwFCyAGKAIEIgIgBigCDCIISSAGKAIIIgsgBigCACIES3FFBEAgBSAIrSACrX03A3ggBSALrSAErX03A3AgA0EBQdvsACAFQfAAahAPQQAhAgwFCyAAKAJcIgdBACAAKAJgIgobRQRAIAUgCjYCBCAFIAc2AgAgA0EBQYPxACAFEA9BACECDAULAkACQCAAKAJUIgwgBEsNAEF/IAcgDGoiByAHIAxJGyAETQ0AIAAoAlgiByACSw0AQX8gByAKaiIKIAcgCksbIAJLDQELQQAhAiADQQFB1hRBABAPDAULAkAgACgC4AENACAAKALYASIHRQ0AIAAoAtwBIgpFDQAgCyAEayIEIAdGIAggAmsiAiAKRnENACAFIAI2AmwgBSAENgJoIAUgCjYCZCAFIAc2AmAgA0EBQcPoACAFQeAAahAPQQAhAgwFCyAGIAlBNBATIgQ2AhggBEUNAQJAIAYoAhBFDQAgAUEkaiAFQZgBaiICQQEQESAEIAUoApgBIglBB3YiCjYCICAEIAlB/wBxQQFqIgw2AhggACgC4AEhCyABQSVqIAJBARARIAQgBSgCmAE2AgAgAUEmaiACQQEQESAEIAUoApgBIgg2AgRBACECIAQoAgAiB0GAAmtBgX5JBEBBACEJDAULQQAhCSAIQYACa0GBfkkNBCAEKAIYIghBH0sNAyAEQQA2AiQgBCAAKAKgATYCKEEBIQkgBigCEEEBTQ0AQQAgCiALGyEKQQAgDCALGyELIAFBJ2ohAQNAIAEgBUGYAWpBARARIAQgBSgCmAEiB0EHdiIINgJUIAQgB0H/AHFBAWoiBzYCTAJAIAAoAuABDQAgAC0AvAFBBHENACAHIAtGIAggCkZxDQAgBSAINgJUIAUgBzYCUCAFIAk2AkwgBSAKNgJIIAUgCzYCRCAFIAk2AkAgA0ECQcfuACAFQUBrEA8LIAFBAWogBUGYAWoiCEEBEBEgBCAFKAKYATYCNCABQQJqIAhBARARIAQgBSgCmAEiCDYCOCAEKAI0IgdBgAJrQYF+SQ0FIAhBgAJrQYB+TQ0FIAQoAkwiCEEgTw0EIAFBA2ohASAEQQA2AlggBCAAKAKgATYCXCAEQTRqIQQgCUEBaiIJIAYoAhBJDQALC0EAIQIgACgCXCIIRQ0EIAAoAmAiC0UNBCAAIAitIg1CAX0iDyAGKAIIIAAoAlQiB2utfCANgKciATYCaCAAIAutIg5CAX0iECAGKAIMIAAoAlgiCmutfCAOgKciBDYCbAJAAkAgAUUNACAERQ0AQf//AyAEbiABTw0BCyAFIAQ2AhQgBSABNgIQIANBAUG16QAgBUEQahAPDAULIAEgBGwhCQJAIAAtAERBAnEEQCAAIAAoAhwgB2sgCG42AhwgACAAKAIgIAprIAtuNgIgIAAgDyAAKAIkIAdrrXwgDYA+AiQgACAQIAAoAiggCmutfCAOgD4CKAwBCyAAIAQ2AiggACABNgIkIABCADcCHAsgACAJQYwsEBMiATYCnAEgAUUEQCADQQFBzR1BABAPDAULIAYoAhBBuAgQEyEBIAAoAgwgATYC0CsgACgCDCgC0CtFBEAgA0EBQc0dQQAQDwwFC0EKQRQQEyEBIAAoAgwgATYC8CsgACgCDCIBKALwK0UEQCADQQFBzR1BABAPDAULIAFBCjYC+CtBCkEUEBMhASAAKAIMIAE2AvwrIAAoAgwiASgC/CtFBEAgA0EBQc0dQQAQDwwFCyABQQo2AoQsAkAgBigCECIERQ0AIAYoAhghCEEAIQEgBEEBRwRAIARBfnEhCwNAIAggAUE0bGoiBygCIEUEQCAAKAIMKALQKyABQbgIbGpBASAHKAIYQQFrdDYCtAgLIAggAUEBciIHQTRsaiIKKAIgRQRAIAAoAgwoAtArIAdBuAhsakEBIAooAhhBAWt0NgK0CAsgAUECaiEBIAJBAmoiAiALRw0ACwsgBEEBcUUNACAIIAFBNGxqIgIoAiANACAAKAIMKALQKyABQbgIbGpBASACKAIYQQFrdDYCtAgLIAkEQCAAKAKcASEBQQAhAgNAIAEgBigCEEG4CBATIgQ2AtArIARFBEBBACECIANBAUHNHUEAEA8MBwsgAUGMLGohASACQQFqIgIgCUkNAAsLIABBBDYCCCAGKAIQIgMEQEF/IAAoAlgiASAAKAJgIgIgACgCbEEBa2xqIgQgAmoiAiACIARJGyICIAYoAgwiBCACIARJG60hEEF/IAAoAlQiAiAAKAJcIgQgACgCaEEBa2xqIgAgBGoiBCAAIARLGyIAIAYoAggiBCAAIARJG60hESABIAYoAgQiACAAIAFJG60hEiACIAYoAgAiACAAIAJJG60hEyAGKAIYIQBBACEBA0AgACAANQIEIg1CAX0iFCASfCANgCIVPgIUIAAgADUCACIOQgF9IhYgE3wgDoAiFz4CECAAQn8gADUCKCIPhkJ/hSIYIBAgFHwgDYAgFX1C/////w+DfCAPiD4CDCAAIBEgFnwgDoAgF31C/////w+DIBh8IA+IPgIIIABBNGohACABQQFqIgEgA0cNAAsLQQEhAgwECyAFIAI2ApABIANBAUH2OyAFQZABahAPQQAhAgwDC0EAIQIgBkEANgIQIANBAUHNHUEAEA8MAgsgBSAINgI0IAUgCTYCMCADQQFBt/MAIAVBMGoQDwwBCyAFIAg2AiggBSAHNgIkIAUgCTYCICADQQFBkesAIAVBIGoQDwsgBUGgAWokACACC54DAQd/IwBBEGsiBiQAAn8gAiACQQFBAiAAKAJIKAIQIghBgQJJGyIHQQF0QQVqIgRuIgUgBGxGIAIgBE9xRQRAIANBAUGKI0EAEA9BAAwBCwJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIQRBACEAIAQtAIgsIgJBBHEEQCAEKAKkA0EBaiEACyAAIAVqIgVBIE8EQCAGIAU2AgAgA0EBQYs7IAYQD0EADAELIAQgAkEEcjoAiCwgACAFSQRAIAQgAEGUAWxqQagDaiECA0AgASACQQEQESABQQFqIgEgAkEEaiAHEBEgASAHaiIBIAJBCGpBAhARIAIgAigCCCIDIAQoAggiCSADIAlJGzYCCCABQQJqIAJBDGpBARARIAFBA2oiASACQRBqIAcQESABIAdqIgEgBkEMakEBEBEgAiAGKAIMNgIkIAIgAigCECIDIAggAyAISRs2AhAgAkGUAWohAiABQQFqIQEgAEEBaiIAIAVHDQALCyAEIAVBAWs2AqQDQQELIQogBkEQaiQAIAoL7AEBBH8jAEEQayIEJAACfwJAIAEgBEEIagJ/IAAoAkgoAhBBgAJNBEAgAgRAQX8hBUEBDAILIANBAUG+I0EAEA9BAAwDCyACQQFNDQFBfiEFQQILIgYQESAEIAIgBWo2AgwgBCgCCCICIAAoAkgoAhAiBU8EQCAEIAU2AgQgBCACNgIAIANBAUHGOiAEEA9BAAwCCyAAIAIgASAGaiAEQQxqIAMQQkUEQCADQQFBviNBABAPQQAMAgtBASAEKAIMRQ0BGiADQQFBviNBABAPQQAMAQsgA0EBQb4jQQAQD0EACyEHIARBEGokACAHC9kBAQR/IwBBEGsiBCQAIAQgAjYCDAJAAkAgAEEAIAEgBEEMaiADEEJFDQAgBCgCDA0AAn8gACgCCEEQRgRAIAAoApwBIAAoAswBQYwsbGoMAQsgACgCDAshB0EBIQUgACgCSCgCEEECSQ0BIAcoAtArIgJBHGohBkEBIQEgAiEDA0AgAyACKAIYNgLQCCADIAIoAqQGNgLcDiADQdQIaiAGQYgGEBIaIANBuAhqIQMgAUEBaiIBIAAoAkgoAhBJDQALDAELIANBAUHWIkEAEA8LIARBEGokACAFC9YBAQN/IwBBEGsiBCQAAkAgAkEBQQIgACgCSCgCECIGQYECSRsiBUECakcEQEEAIQAgA0EBQYogQQAQDwwBCwJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIQIgASAEQQxqIAUQEUEBIQAgASAFaiIFIARBCGpBARARIAYgBCgCDCIBTQRAIAQgBjYCBCAEIAE2AgAgA0EBQdjvACAEEA9BACEADAELIAVBAWogAigC0CsgAUG4CGxqQagGakEBEBELIARBEGokACAAC4QCAQV/IwBBEGsiBCQAAn8gACgCCEEQRgRAIAAoApwBIAAoAswBQYwsbGoMAQsgACgCDAshBgJAIAJBAUECIAAoAkgiBygCEEGBAkkbIgVNBEBBACECIANBAUGkI0EAEA8MAQsgBCAFQX9zIAJqNgIMIAEgBEEIaiAFEBEgBCgCCCIIIAcoAhBPBEBBACECIANBAUGA6QBBABAPDAELQQEhAiABIAVqIgEgBigC0CsgCEG4CGxqQQEQESAAIAQoAgggAUEBaiAEQQxqIAMQQ0UEQEEAIQIgA0EBQaQjQQAQDwwBCyAEKAIMRQ0AQQAhAiADQQFBpCNBABAPCyAEQRBqJAAgAgusBgEHfyMAQRBrIgYkACAGIAI2AgwgACgCSCEJAn8gACgCCEEQRgRAIAAoApwBIAAoAswBQYwsbGoMAQsgACgCDAsiBCAELQCILEEBcjoAiCwCQCACQQRNBEAgA0EBQbwiQQAQDwwBCyABIARBARARIAQoAgBBCE8EQCADQQFBmiJBABAPDAELIAFBAWogBkEIakEBEBEgBCAGKAIIIgI2AgQgAkEFTgRAIANBAUHxIUEAEA8gBEF/NgIECyABQQJqIARBCGpBAhARIAQoAggiB0GAgARrQYCAfE0EQCAGIAc2AgAgA0EBQak9IAYQDwwBCyAEIAAoAqQBIgIgByACGzYCDCABQQRqIARBEGpBARARIAQoAhBBAk8EQCADQQFBhypBABAPDAELIAFBBWohAiAGIAYoAgxBBWs2AgwCQCAJKAIQIgdFDQAgBCgCAEEBcSEIIAQoAtArIQRBACEJIAdBCE8EQCAHQXhxIQEDQCAEIAVBuAhsaiAINgIAIAQgBUEBckG4CGxqIAg2AgAgBCAFQQJyQbgIbGogCDYCACAEIAVBA3JBuAhsaiAINgIAIAQgBUEEckG4CGxqIAg2AgAgBCAFQQVyQbgIbGogCDYCACAEIAVBBnJBuAhsaiAINgIAIAQgBUEHckG4CGxqIAg2AgAgBUEIaiEFIApBCGoiCiABRw0ACwsgB0EHcSIBRQ0AA0AgBCAFQbgIbGogCDYCACAFQQFqIQUgCUEBaiIJIAFHDQALC0EAIQUgAEEAIAIgBkEMaiADEENFBEAgA0EBQbwiQQAQDwwBCyAGKAIMBEAgA0EBQbwiQQAQDwwBCwJ/IAAoAghBEEYEQCAAKAKcASAAKALMAUGMLGxqDAELIAAoAgwLIQEgACgCSCgCEEECTwRAIAEoAtArIgEoAgRBAnQhByABQbAHaiEKIAFBrAZqIQNBASEJIAEhAgNAIAIgAf0AAgT9CwK8CCACIAEoAhQ2AswIIAJB5A5qIAMgBxASGiACQegPaiAKIAcQEhogAkG4CGohAiAJQQFqIgkgACgCSCgCEEkNAAsLQQEhBQsgBkEQaiQAIAUL7AkBBn8jAEHwAGsiBCQAIARBADYCaAJAIAJBCEcEQCADQQFBvR5BABAPIANBAUG9HkEAEA8MAQsgASAAQcwBakECEBEgAUECaiAEQewAakEEEBEgAUEGaiAEQeQAakEBEBEgAUEHaiAEQegAakEBEBEgACgCzAEiAiAAKAJoIgggACgCbGxPBEAgBCACNgJgIANBAUGdOyAEQeAAahAPDAELIAAoApwBIAJBjCxsaiEFIAIgCG4hByAEKAJkIQECQCAAKAIsIgZBAE4gAiAGR3ENACAFKALUK0EBaiIGIAFGDQAgBCAGNgJYIAQgATYCVCAEIAI2AlAgA0EBQbU7IARB0ABqEA9BACEFDAELIAUgATYC1CsCQAJAIAQoAmwiAUEBa0EMTQR/IAFBDEcNASAEQQw2AjAgA0ECQeXXACAEQTBqEA8gBCgCbAUgAQtFBEAgA0EEQbLPAEEAEA8gAEEBNgI4CwJAAkACQAJAIAUoAtgrIgEEQCAEKAJkIgYgAUkNASAEIAE2AiQgBCAGNgIgIANBAUGFJyAEQSBqEA8gAEEBNgI4QQAhBQwHCyAEKAJoIgYNAQwDCyAEKAJoIgZFDQELIAQgBiAALQBEQQR2QQFxaiIBNgJoIAQoAmQiBiAFKALYKyIJQQFrSwRAIAQgCTYCBCAEIAY2AgAgA0EBQaImIAQQDyAAQQE2AjhBACEFDAULIAEgBk0EQCAEIAE2AhQgBCAGNgIQIANBAUHpJyAEQRBqEA8gAEEBNgI4QQAhBQwFCyAFIAE2AtgrCyABIAQoAmRBAWpHDQAgACAALQBEQQFyOgBECyAEKAJsIQEgAEEQNgIIIABBACABQQxrIAAoAjgbNgIYAkAgACgCLCIBQX9GBEBBBCEFIAIgByAIbGsiASAAKAIcSQ0BIAEgACgCJE8NASAHIAAoAiBJDQEgByAAKAIoT0ECdCEFDAELIAAoAswBIAFHQQJ0IQULIAAgAC0AREH7AXEgBXI6AERBASEFIAAoAsgBIgFFDQIgASgCKCIGIAAoAswBIgJBKGxqIgcgAjYCACAHIAQoAmQiCDYCDCAEKAJoIgEEQCAHIAE2AgQgByAEKAJoIgE2AgggBygCECICRQRAIAFBGBATIQEgACgCyAEoAiggACgCzAFBKGxqIAE2AhAgAQ0EQQAhBSADQQFByTRBABAPDAQLIAIgAUEYbBAXIQEgACgCyAEoAiggACgCzAFBKGxqIQIgAUUEQCACKAIQEBBBACEFIAAoAsgBKAIoIAAoAswBQShsakEANgIQIANBAUHJNEEAEA8MBAsgAiABNgIQDAMLIAcoAhAiAUUEQCAHQQo2AghBCkEYEBMhASAAKALIASgCKCIGIAAoAswBIgJBKGxqIgcgATYCECABRQ0CIAQoAmQhCAsgCCAGIAJBKGxqIgIoAghJDQIgAiAIQQFqIgI2AgggASACQRhsEBchASAAKALIASgCKCAAKALMAUEobGohAiABRQRAIAIoAhAQEEEAIQUgACgCyAEoAiggACgCzAFBKGxqIgBBADYCCCAAQQA2AhAgA0EBQck0QQAQDwwDCyACIAE2AhAMAgsgBCABNgJAIANBAUHy2QAgBEFAaxAPQQAhBQwBC0EAIQUgB0EANgIIIANBAUHJNEEAEA8LIARB8ABqJAAgBQurBwEIfyMAQdAAayIEJAAgBEEBNgJMAkACQCAAKALIASIFKAIoIgMNACAFIAAoAmwgACgCaGwiAzYCJCADQSgQEyEDIAAoAsgBIgUgAzYCKCADRQRAQQAhBQwCCyAFKAIkRQ0AA0BBACEFIAMgBkEobCIHaiIDQQA2AhQgA0HkADYCHEHkAEEYEBMhCSAHIAAoAsgBIggoAigiA2ogCTYCGCAJRQ0CIAZBAWoiBiAIKAIkSQ0ACwsgACgCLCEJAkAgAygCEEUNAAJAIAMgCUEobGoiAygCBEUEQCABIAApAzBCAnwgAhA2DQFBACEFIAJBAUGnKUEAEA8MAwsgASADKAIQKQMAQgJ8IAIQNg0AQQAhBSACQQFBpylBABAPDAILIAAoAghBgAJHDQAgAEEINgIICwJAIAAoAmwgACgCaGwiB0UNACAAKAKcASEFQQAhAyAHQQhPBEAgB0F4cSEIQQAhBgNAIAUgA0GMLGxqQX82AtQrIAUgA0EBckGMLGxqQX82AtQrIAUgA0ECckGMLGxqQX82AtQrIAUgA0EDckGMLGxqQX82AtQrIAUgA0EEckGMLGxqQX82AtQrIAUgA0EFckGMLGxqQX82AtQrIAUgA0EGckGMLGxqQX82AtQrIAUgA0EHckGMLGxqQX82AtQrIANBCGohAyAGQQhqIgYgCEcNAAsLIAdBB3EiBkUNAANAIAUgA0GMLGxqQX82AtQrIANBAWohAyAKQQFqIgogBkcNAAsLQQAhBSAAIARByABqQQAgBEHEAGogBEFAayAEQTxqIARBOGogBEE0aiAEQcwAaiABIAIQJ0UNACAJQQFqIQcDQAJAIAQoAkxFDQAgACAEKAJIIgNBAEEAIAEgAhArRQ0CIAAoAmghCCAAKAJsIQogBCADQQFqIgY2AiAgBCAIIApsNgIkIAJBBEGg1wAgBEEgahAPIAAoAtABIAAoAkwoAhgQdEUNAiAAKAKcASADQYwsbGoiBSgC3CsiCARAIAgQECAFQgA3AtwrCyAEIAY2AhAgAkEEQeb8ACAEQRBqEA8gAyAJRgRAIAEgACgCyAEpAwhCAnwgAhA2DQFBACEFIAJBAUGnKUEAEA8MAwsgBCAHNgIEIAQgBjYCACACQQJB3eUAIAQQD0EAIQUgACAEQcgAakEAIARBxABqIARBQGsgBEE8aiAEQThqIARBNGogBEHMAGogASACECcNAQwCCwsgACACEHIhBQsgBEHQAGokACAFC8gGAgd/AX4jAEHQAGsiAyQAIANBATYCTAJAAkAgACgCaCIEQQFHDQAgACgCbEEBRw0AIAAoAlQNACAAKAJYDQAgACgCTCIFKAIADQAgBSgCBA0AIAUoAgggACgCXEcNACAFKAIMIAAoAmBHDQBBACEEIAAgA0HIAGpBACADQcQAaiADQUBrIANBPGogA0E4aiADQTRqIANBzABqIAEgAhAnRQ0BAkAgACADKAJIQQBBACABIAIQKwRAIAAoAkwiASgCEA0BQQEhBAwDCyACQQFBkcIAQQAQDwwCCyABKAIYIQFBACECA0AgASACQTRsIgRqKAIsEBAgACgCTCIFKAIYIgEgBGoiBiAAKALQASIHKAIUKAIAKAIUIAJBzABsaiIIKAIkNgIsIAYgBygCGCgCGCAEaigCJDYCJCAIQQA2AiRBASEEIAJBAWoiAiAFKAIQSQ0ACwwBCwNAAkACfwJAIARBAUcNACAAKAJsQQFHDQAgACgCnAEoAtwrRQ0AIANBADYCSCAAQQA2AswBIAAgACgCCEGAAXI2AghBAAwBC0EAIQQgACADQcgAakEAIANBxABqIANBQGsgA0E8aiADQThqIANBNGogA0HMAGogASACECdFDQMgAygCTEUNASADKAJICyIHQQFqIQQgACAHQQBBACABIAIQKyEJIAAoAmggACgCbGwhBSAJRQRAIAMgBTYCBCADIAQ2AgAgAkEBQZc5IAMQD0EAIQQMAwsgAyAFNgIkIAMgBDYCICACQQRBoNcAIANBIGoQDyAAKALQASAAKAJMKAIYEHRFBEBBACEEDAMLAkACQCAAKAJoQQFHDQAgACgCbEEBRw0AIAAoAkwiBSgCACAAKAJIIgYoAgBHDQEgBSgCBCAGKAIERw0BIAUoAgggBigCCEcNASAFKAIMIAYoAgxHDQELIAAoApwBIAdBjCxsaiIFKALcKyIGRQ0AIAYQECAFQgA3AtwrCyADIAQ2AhAgAkEEQeb8ACADQRBqEA8gASkDCCIKUAR+QgAFIAogASkDOH0LUARAIAAoAghBwABGDQELIAhBAWoiCCAAKAJoIgQgACgCbGxHDQELCyAAIAIQciEECyADQdAAaiQAIAQLtQYBDH8gACgCSCEJAkAgACgCaCAAKAJsbCIMBEAgCSgCECIBQbgIbCENIAEgAWxBAnQhCiAAKAIMIQQgACgCnAEhAwNAIAMoAtArIQsgAyAEQYwsEBIiAUEANgLoKyABQX82AtQrIAFBADYCsCggAUEANgKELCABQQA2AvArIAFCADcC+CsgASALNgLQKyABIAEtAIgsQfwBcToAiCwgBCgC6CsEQCABIAoQFCIDNgLoKyADRQRAQQAPCyADIAQoAugrIAoQEhoLIAEgBCgC+CtBFGwiBRAUIgM2AvArQQAhCCADRQ0CIAMgBCgC8CsgBRASGiAEKAL0KyIGBEAgBCgC8CshAyABKALwKyEFQQAhBwNAIAMoAgwEQCAFIAMoAhAQFCIGNgIMIAZFBEBBAA8LIAYgAygCDCADKAIQEBIaIAQoAvQrIQYLIAEgASgC+CtBAWo2AvgrIAVBFGohBSADQRRqIQMgB0EBaiIHIAZJDQALCyABIAQoAoQsQRRsIgUQFCIDNgL8KyADRQ0CIAMgBCgC/CsgBRASGiABIAQoAoQsIgg2AoQsIAgEQCAEKAL8KyEDIAEoAvwrIQVBACEHA0AgAygCCCIGBEAgBSABKALwKyAGIAQoAvAra2o2AggLIAMoAgwiBgRAIAUgASgC8CsgBiAEKALwK2tqNgIMCyAFQRRqIQUgA0EUaiEDIAdBAWoiByAIRw0ACwsgCyAEKALQKyANEBIaIAFBjCxqIQMgDkEBaiIOIAxHDQALC0EBIQggAAJ/QQBBAUHIABATIgFFDQAaIAEgAS0AKEH+AXFBAXI6ACggAUEBQQQQEyIENgIUIAEgBA0AGiABEBBBAAsiATYC0AEgAUUEQEEADwsgACgC1AEhBUEAIQQgASAAQdAAajYCHCABIAk2AhhBAUHQBhATIQMgASgCFCADNgIAAkAgA0UNACAJKAIQQcwAEBMhAyABKAIUKAIAIgcgAzYCFCADRQ0AIAcgCSgCEDYCECAAKAKkASEEIAEgBTYCLCABIAQ2AgBBASEECyAEDQAgACgC0AEQVUEAIQggAEEANgLQASACQQFBwhtBABAPCyAIC9USAwx/AX0BfiMAQTBrIggkACAAQQE2AggCfwJAAkAgASAIQShqIgVBAiACEBpBAkcNACAFIAhBLGpBAhARIAgoAixBz/4DRw0AIABBAjYCCCAAKALIASABKQM4QgJ9IhA3AwAgCCAQNwMQIAJBBEHu3gAgCEEQahAPIAAoAsgBIgMpAwAhECADKAIYIgdBAWoiBSADKAIgIgRNBEAgAygCHCEEDAILIAMCfyAEs0MAAMhCkiIPQwAAgE9dIA9DAAAAAGBxBEAgD6kMAQtBAAsiBTYCICADKAIcIAVBGGwQFyIEBEAgAyAENgIcIAMoAhgiB0EBaiEFDAILIAMoAhwQECADQQA2AiAgA0IANwMYIAJBAUGpHUEAEA8LIAJBAUG19QBBABAPQQAMAQsgBCAHQRhsaiIEQQI2AhAgBCAQxDcDCCAEQc/+AzsBACADIAU2AhggASAAKAIQQQIgAhAaQQJHBEAgAkEBQZYSQQAQD0EADAELIAAoAhAgCEEoakECEBECQAJAIAgoAigiBEGQ/wNHBEADQEHgvQEhByAEQf/9A00EQCAIIAQ2AgAgAkEBQcoQIAgQD0EADAULA0AgByIFKAIAIgMEQCAFQQxqIQcgAyAERw0BCwsCQAJAIAMNAEECIQYgAkECQfUcQQAQD0GWEiEHAkACQCABIAAoAhBBAiACEBpBAkcNAANAIAAoAhAgCEEsakECEBFB4L0BIQMgCCgCLCIEQYD+A08EQANAIAMiBSgCACIMBEAgA0EMaiEDIAQgDEcNAQsLIAUoAgQgACgCCHFFBEBB/CghBwwDCyAMBEAgDEGQ/wNGBEAgCEGQ/wM2AigMBwsgASkDOCEQIAAoAsgBIgMoAhgiBUEBaiIEIAMoAiAiB00EQCADKAIcIQcMBQsgAwJ/IAezQwAAyEKSIg9DAACAT10gD0MAAAAAYHEEQCAPqQwBC0EACyIFNgIgIAMoAhwgBUEYbBAXIgcEQCADIAc2AhwgAygCGCIFQQFqIQQMBQsgAygCHBAQIANBADYCICADQgA3AxhBqR0hBwwDCyAGQQJqIQYLIAEgACgCEEECIAIQGkECRg0ACwsgAkEBIAdBABAPIAJBAUH9yABBABAPQQAMBwsgByAFQRhsaiIFIAY2AhAgBSAQpyAGa6w3AwggBUEAOwEAIAMgBDYCGCAIIAw2AihB4L0BIQQDQCAEIgUoAgAiA0UNASAEQQxqIQQgAyAMRw0ACwsgBSgCBCAAKAIIcUUEQCACQQFB/ChBABAPQQAMBgsgASAAKAIQQQIgAhAaQQJHBEAgAkEBQZYSQQAQD0EADAYLIAAoAhAgCEEkakECEBEgCCgCJCIEQQFNBEAgAkEBQaEuQQAQD0EADAYLIAggBEECayIHNgIkIAAoAhAhBCAAKAIUIAdJBEAgBCAHEBciBEUEQCAAKAIQEBAgAEIANwMQIAJBAUHUJUEAEA9BAAwHCyAAIAQ2AhAgACAIKAIkIgc2AhQLIAEgBCAHIAIQGiIEIAgoAiRHBEAgAkEBQZYSQQAQD0EADAYLIAAgACgCECAEIAIgBSgCCBEBAEUEQCACQQFBqBJBABAPQQAMBgsgASkDOCEQIAgoAiQhDAJAIAAoAsgBIgUoAhgiBkEBaiIHIAUoAiAiBE0EQCAFKAIcIQQMAQsgBQJ/IASzQwAAyEKSIg9DAACAT10gD0MAAAAAYHEEQCAPqQwBC0EACyIENgIgIAUoAhwgBEEYbBAXIgRFDQUgBSAENgIcIAUoAhgiBkEBaiEHCyAEIAZBGGxqIgQgDEEEajYCECAEIBCnIAxrQQRrrDcDCCAEIAM7AQAgBSAHNgIYIAEgACgCEEECIAIQGkECRwRAIAJBAUGWEkEAEA9BAAwGC0EBIAogA0Hc/gNGGyEKQQEgCyADQdL+A0YbIQtBASANIANB0f4DRhshDSAAKAIQIAhBKGpBAhARIAgoAigiBEGQ/wNHDQELCyANDQELIAJBAUGYJEEAEA9BAAwCCyALRQRAIAJBAUHGJEEAEA9BAAwCCyAKRQRAIAJBAUH0JEEAEA9BAAwCC0EAIQNBACENIwBBEGsiBCQAQQEhBwJAIAAtALwBQQFxRQ0AAkAgACgCcCILRQ0AAkADQCAAKAJ0IA1BA3RqIgUoAgAiCgRAIAMgBSgCBCIGayIFQQAgAyAFTxshBSADIAZJBEAgBiADayELIAMgCmohCgNAIAtBBEkEQEGOKyEDDAULIAogBEEMakEEEBEgBCgCDCIDQX9zIAlJBEBB9CohAwwFCyADIAtBBGsiBmsgBSADIAZLIgwbIQUgAyAJaiEJIAYgA2shCyAKQQAgAyAMG2pBBGohCiADIAZJDQALIAAoAnAhCwsgBSEDCyANQQFqIg0gC0kNAAsgA0UNAUEAIQcgAkEBQekWQQAQDwwCC0EAIQcgAkEBIANBABAPDAELIAAgCRAUIgM2AogBIANFBEBBACEHIAJBAUG+IEEAEA8MAQsgACAJNgJ8IAAoAnQhBgJAIAAoAnAiCgRAQQAhCUEAIQNBACEFA0AgBiAFQQN0Ig1qIgwoAgAiCwRAIAAoAogBIANqIQoCfyAMKAIEIgYgCU0EQCAKIAsgBhASGiADIAZqIQMgCSAGawwBCyAKIAsgCRASGiADIAlqIQMgBiAJayIGBEAgCSALaiEJA0AgBkEESQ0GIAkgBEEIakEEEBEgCUEEaiEJIAAoAogBIANqIQogBkEEayIGIAQoAggiC0kEQCAKIAkgBhASGiADIAZqIQMgBCgCCCAGawwDCyAKIAkgCxASGiAEKAIIIgogA2ohAyAJIApqIQkgBiAKayIGDQALC0EACyEJIAAoAnQgDWooAgAQECAAKAJ0IgYgDWpCADcCACAAKAJwIQoLIAVBAWoiBSAKSQ0ACyAAKAJ8IQkgACgCiAEhAwsgACAJNgKQASAAIAM2AnggAEEANgJwIAYQECAAQQA2AnQMAQtBACEHIAJBAUGOK0EAEA8LIARBEGokACAHRQRAIAJBAUGPPUEAEA9BAAwCCyACQQRB99YAQQAQDyAAKALIASABKQM4Qv7///8PfEL/////D4M3AwggAEEINgIIQQEMAQsgBSgCHBAQIAVBADYCICAFQgA3AxggAkEBQakdQQAQD0EACyEOIAhBMGokACAOCxwAIAAoAghFIAAoAsABQQBHIAAoAsQBQQBHcXELBABBAAsPACAABEAgACABNgK4AQsLjwEBBH8gACgCGCIBBEAgACgCHCIDQTRuIQQgA0E0TwR/QQAhAwNAIAEoAgAiAgRAIAJBAWsQECABQQA2AgALIAEoAgQiAgRAIAIQECABQQA2AgQLIAEoAggiAgRAIAIQECABQQA2AggLIAFBNGohASADQQFqIgMgBEcNAAsgACgCGAUgAQsQECAAQQA2AhgLC4YBAQR/IAAoAhgiAQRAIAAoAhwiAkHAAE8EfyACQQZ2IQRBACECA0AgASgCACIDBEAgAxAQIAFBADYCAAsgASgCBCIDBEAgAxAQIAFBADYCBAsgASgCPBAQIAFBADYCPCABQUBrIQEgAkEBaiICIARHDQALIAAoAhgFIAELEBAgAEEANgIYCws/AQF/IAAEQCAAKAJ0IgEEQCABEBAgAEEANgJ0CyAAKAJ4IgEEQCABEBAgAEEANgJ4CyAAKAKUARAQIAAQEAsLwaYFBFx/AnsGfgF9IwBB4ABrIiMkACAAKAIIIRoCQAJAAkACQCAAKAIARQRAIBogGigCECAaKAIIayAaKAIUIBooAgxrbEECdCIGEBgiAzYCPCADRQRAIAAoAiQaIAAoAiBBAUHRPEEAEA8gACgCJBogAEEcaiEQDAMLIANBACAGEBUaDAELIBooAjwiA0UNACADEBAgGkEANgI8CyAAKAIQIjIoAhwgMigCGEGYAWxqIgNBmAFrKAIAITUgA0GQAWsoAgAhNiAAKAIUIS8gACgCDCEwIAAoAgQhNyAAKAIcKAIARQ0CIABBHGohEAJAAn9BACABKAIEIgNBAEwNABogASgCACEGAkADQCAGIAdBDGxqIgQoAgBFDQEgB0EBaiIHIANHDQALQQAMAQsgBCgCBAsiBA0AQQFBnAEQEyIERQRAIAAoAiBBAUGQMEEAEA8MAgsgBEEANgKMASABKAIEIgNB/////wdHBH8CfyABKAIAIQYgA0EASgRAA0AgBiAJQQxsaiIHKAIARQRAIAcoAggiAwR/IAcoAgQgAxECACABKAIABSAGCyAJQQxsaiIBQQ82AgggASAENgIEQQEMAwsgCUEBaiIJIANHDQALC0EAIAYgA0EMbEEMahAXIgNFDQAaIAEgAzYCACADIAEoAgQiBkEMbGoiA0EPNgIIIAMgBDYCBCADQQA2AgAgASAGQQFqNgIEQQELBUEACw0AIAAoAiBBAUGMP0EAEA8gBCgCdCIBBEAgARAQIARBADYCdAsgBCgCeCIBBEAgARAQIARBADYCeAsgBCgClAEQECAEEBAMAQsgBCAAKAIYNgKQASAAKAIoISsgACgCJCEhIAAoAiAhHSAvKAKoBiERIDAoAhAhAQJAAkAgLygCECIWQcAAcQRAIBYhCiMAQbACayIPJAACQCARBEAgIQRAQQAhByAdQQFBgRhBABAPDAILQQAhByAdQQFBgRhBABAPDAELIAQoAnQhBwJAAkAgGigCFCAaKAIMayIDIBooAhAgGigCCGsiBmwiASAEKAKEAUsEQCAHEBAgBCABQQJ0IhEQGCIHNgJ0IAdFBEBBACEHDAQLIAQgATYChAEMAQsgB0UNASABQQJ0IRELIAdBACAREBUaCyAEKAJ4IQcCQCAEKAKIAUHPFEsNACAHEBAgBEHA0gAQGCIHNgJ4IAcNAEEAIQcMAQsgBEHQFDYCiAEgB0EAQcDSABAVGiAEIAM2AoABIAQgBjYCfCAaKAIYIgJFBEBBASEHDAELIBooAhwhDUEBIQcCQAJAAkACQAJAIBooAjQiAwRAIBooAgQhCUEAIQdBACEBAkAgA0EETwRAIANBfHEhAQNAIAkgCEEDdGoiBkEcaiAGQRRqIAZBDGogBv0JAgT9VgIAAf1WAgAC/VYCAAMgXv2uASFeIAhBBGoiCCABRw0ACyBeIF4gXv0NCAkKCwwNDg8AAQIDAAECA/2uASJeIF4gXv0NBAUGBwABAgMAAQIDAAECA/2uAf0bACEHIAEgA0YNAQsDQCAJIAFBA3RqKAIEIAdqIQcgAUEBaiIBIANHDQALCyADQQFGBEAgBCgCkAFFDQULIAcgBCgCmAFNDQEgBCgClAEgBxAXIhENAkEAIQcMBgsgBCgCkAFFDQULIAQoApQBIhENAUEAIQcMBAsgBCAHNgKYASAEIBE2ApQBCyAaKAI0RQRAQQAhBwwCCyAaKAIEIQhBACEHQQAhAQNAIAcgEWogCCABQQN0IgNqIgYoAgAgBigCBBASGiAaKAIEIgggA2ooAgQgB2ohByABQQFqIgEgGigCNEkNAAsMAQsgGigCBCgCACERC0EAIQFBACEIAn9BACAaKAIoIgNFDQAaIBooAgAiBigCCCEIQQAgA0EBRg0AGiAGKAIgCyEDIAIgDWshRQJAIAMgCGoiCEUEQEEAIQkMAQtBASEBIBooAgAiAygCACEFQQAhCSAIQQFGBEBBACEBDAELIAMoAhghCQsgRUEBaiEWIAQoAnQhDiAEKAJ4IRQgGigCDCESIBooAhQhGCAaKAIIISQgGigCECErAkACQAJAAkACQAJAAkACQAJAIAFFDQAgCQ0AICFFDQEgHUECQaHQAEEAEA9BASEIDAILIAhBBEkNASAhBEAgDyAINgJwIB1BAUH8xgAgD0HwAGoQDwwICyAPIAg2AmAgHUEBQfzGACAPQeAAahAPQQAhBwwICyAdQQJBodAAQQAQDyAaKAIYIgFBHksNAUEBIQwgASAWTw0DDAULIBooAhgiAUEeTQ0BICFFDQAgDyABNgIgIB1BAUGb2wAgD0EgahAPDAULIA8gATYCACAdQQFBm9sAIA8QD0EAIQcMBQsgASAWSQ0BIAhBAkkEQCAIIQwMAQsgASAWRwRAIAghDAwBC0EBIQxBkMcBLQAADQAgIUUEQEGQxwFBAToAACAPIAg2AkAgHUECQabMACAPQUBrEA8MAQtBkMcBLQAARQRAQZDHAUEBOgAAIA8gCDYCUCAdQQJBpswAIA9B0ABqEA8LCwJAAkAgBUECSQ0AIAUgB0sNACAFIAlqIAdNDQELICEEQEEAIQcgHUEBQcLGAEEAEA8MBQtBACEHIB1BAUHCxgBBABAPDAQLAkACQCAFIBFqIhNBAWstAABBBHQgE0ECay0AAEEPcXIiBkECSQ0AIAUgBkgNACAGQfAfSQ0BCyAhBEBBACEHIB1BAUHW8gBBABAPDAULQQAhByAdQQFB1vIAQQAQDwwECyAaKAIcISYgD0EANgKQAiAPQQA2ApgCIA9CADcDiAIgD0IANwOoAiAPQgA3ApwCIA8gBkEBayIHNgKUAiAPIAUgEWogBmsiATYCgAJC/wEhYCAGQQJPBEAgATEAACFgC0EIIQMgD0EINgKQAiAPIAZBAmsiCDYClAIgDyBgQg+EIGAgB0EBRhsiYDcDiAIgDyABIAZBAUpqIgc2AoACIA8gYEL/AVEiDTYCmAICfwJAIAFBA3EiAkEDRg0AQv8BIWEgDQRAQQAgBy0AAEGPAUsNAhoLIAZBA04EQCAHMQAAIWELIA8gBkEDayINNgKUAiAPQQ9BECBgQv8BUSILGyIDNgKQAiAPIAcgBkECSmoiATYCgAIgDyBhQg+EIGEgCEEBRhsiYUL/AVE2ApgCIA8gYEIHQgggCxuGIGGEImA3A4gCIAJBAkYNACBhQv8BUQRAQQAgAS0AAEGPAUsNAhoLQv8BIWIgBkEETgRAIAExAAAhYgsgDyAGQQRrIgc2ApQCIA8gASAGQQNKaiIBNgKAAiAPIGJCD4QgYiANQQFGGyJiQv8BUTYCmAIgDyADQQdBCCBhQv8BUSIIG2oiAzYCkAIgDyBgQgdCCCAIG4YgYoQiYDcDiAIgAkEBRg0AQv8BIWEgYkL/AVEEQEEAIAEtAABBjwFLDQIaCyAGQQVOBEAgATEAACFhCyAPIAZBBWs2ApQCIA8gASAGQQRKajYCgAIgDyBhQg+EIGEgB0EBRhsiYUL/AVE2ApgCIA8gA0EHQQggYkL/AVEiARtqIgM2ApACIA8gYEIHQgggARuGIGGEImA3A4gCCyAPIGBBwAAgA2uthjcDiAJBAQtFBEAgIQRAQQAhByAdQQFBg9UAQQAQDwwFC0EAIQcgHUEBQYPVAEEAEA8MBAsgKyAkayEVIA8gBkECayILNgL0ASAPIAUgEWoiAkEDayIDNgLgASAPIAJBAmstAAAiGUGPAUsiDTYC+AEgDyAZQQR2rSJgNwPoASAPQQNBBCBgQgeDQgdRGyIBNgLwASADQQNxQQFqIgcgCyAHIAtIGyEIAkACQCAGQQJMBEAgDyALIAhrIgI2AvQBDAELIA8gAkEEayIHNgLgASAPIAMtAAAiF0GPAUsiDTYC+AEgDyAXrSJhIAGthiBghCJgNwPoASAPQQhBB0EIIGFC/wCDQv8AURsgGUGPAU0bIAFqIgE2AvABAkAgCEEBRgRAIAchAwwBCyAPIAJBBWsiAzYC4AEgDyAHLQAAIhlBjwFLIg02AvgBIA8gGa0iYSABrYYgYIQiYDcD6AEgD0EIQQdBCCBhQv8Ag0L/AFEbIBdBjwFNGyABaiIBNgLwASAIQQJGDQAgDyACQQZrIgc2AuABIA8gAy0AACIXQY8BSyINNgL4ASAPIBetImEgAa2GIGCEImA3A+gBIA9BCEEHQQggYUL/AINC/wBRGyAZQY8BTRsgAWoiATYC8AEgCEEDRgRAIAchAwwBCyAPIAJBB2siAzYC4AEgDyAHMQAAImFCjwFWIg02AvgBIA8gYSABrYYgYIQiYDcD6AEgD0EIQQdBCCBhQv8Ag0L/AFEbIBdBjwFNGyABaiIBNgLwAQsgDyALIAhrIgI2AvQBIAFBIEsNAQsCQCACQQROBEAgA0EDaygCACEHIA8gAkEEazYC9AEgDyADQQRrNgLgAQwBCyACQQBMBEBBACEHDAELIAJBAXEhRwJAIAJBAUYEQEEYIQhBACEHDAELIAJB/v///wdxIRdBGCEIQQAhB0EAIQsDQCAPIANBAWsiHzYC4AEgAy0AACFGIA8gA0ECayIDNgLgASAPIAJBAWs2AvQBIB8tAAAhHyAPIAJBAmsiAjYC9AEgRiAIdCAHciAfIAhBCGt0ciEHIAhBEGshCCALQQJqIgsgF0cNAAsLIEdFDQAgDyADQQFrNgLgASADLQAAIUggDyACQQFrNgL0ASBIIAh0IAdyIQcLIA8gB0H/AXEiA0GPAUs2AvgBIA9BB0EIIAdBgICA+AdxQYCAgPgHRhtBCCANGyICQQhBB0EIIAdBgID8A3FBgID8A0YbIAdB/////3hNG2oiCEEIQQdBCCAHQYD+AXFBgP4BRhsgB0EQdkH/AXEiDUGPAU0baiILQQhBB0EIIAdB/wBxQf8ARhsgB0EIdkH/AXEiGUGPAU0bIAFqajYC8AEgDyANIAJ0IAdBGHZyIBkgCHRyIAMgC3RyrSABrYYgYIQ3A+gBCyAPQcABaiARIAUgBmtB/wEQWwJ/QQAgDEECSQ0AGiAPQaABaiATIAlBABBbQQAgDEECRg0AGkIAIWBCACFiIA9BATYCmAEgD0EANgKQASAPQgA3A4gBIA8gCUEBayIGNgKUASAPIAUgEWogCWoiA0EBayIBNgKAASABQQNxIQUCQCAJQQBMBEAgASEDDAELIA8gA0ECayIDNgKAASABMQAAIWALIA8gYDcDiAEgDyBgQo8BViIRNgKYASAPQQdBCCBgQv8Ag0L/AFEbIg02ApABAkAgBUUNACAPIAlBAmsiAjYClAECQCAJQQJIBEAgAyEHDAELIA8gA0EBayIHNgKAASADMQAAIWILIA8gYkKPAVYiETYCmAEgDyBiIA2thiBghCJhNwOIASAPQQhBB0EIIGJC/wCDQv8AURsgYEKPAVgbIA1qIg02ApABIAVBAUYEQCAHIQMgYSFgIAYhCSACIQYMAQsgDyAJQQNrIgg2ApQBAkAgCUEDSARAIAchAQwBCyAPIAdBAWsiATYCgAEgBzEAACFjCyAPIGNCjwFWIhE2ApgBIA8gYyANrYYgYYQiYDcDiAEgD0EIQQdBCCBjQv8Ag0L/AFEbIGJCjwFYGyANaiINNgKQASAFQQJGBEAgASEDIAIhCSAIIQYMAQsgDyAJQQRrIgY2ApQBQgAhYgJAIAlBBEgEQCABIQMMAQsgDyABQQFrIgM2AoABIAExAAAhYgsgDyBiQo8BViIRNgKYASAPIGIgDa2GIGCEImA3A4gBIA9BCEEHQQggYkL/AINC/wBRGyBjQo8BWBsgDWoiDTYCkAEgCCEJCyANQSBNBEACQCAJQQVOBEAgA0EDaygCACEHIA8gCUEFazYClAEgDyADQQRrNgKAAQwBC0EAIQcgCUECSA0AQRghCQNAIA8gA0EBayIBNgKAASADLQAAIUkgDyAGQQFrIgI2ApQBIEkgCXQgB3IhByAGQQFLIUogASEDIAlBCGshCSACIQYgSg0ACwsgDyAHQf8BcSIBQY8BSzYCmAEgD0EHQQggB0GAgID4B3FBgICA+AdGG0EIIBEbIgNBCEEHQQggB0GAgPwDcUGAgPwDRhsgB0H/////eE0baiIGQQhBB0EIIAdBgP4BcUGA/gFGGyAHQRB2Qf8BcSIJQY8BTRtqIgJBCEEHQQggB0H/AHFB/wBGGyAHQQh2Qf8BcSIIQY8BTRsgDWpqNgKQASAPIAkgA3QgB0EYdnIgCCAGdHIgASACdHKtIA2thiBghDcDiAELQQELITEgGCASayEfIBZBAWohLCAUQQA6AMAQIBRBwBBqIQsgD0GAAmoQKCECIBVBAEoEQCAmQQFrIRMgFCEDIAshCEEAIREgDiEGQQAhDQNAIA0hBSARQQh0IA9B4AFqEC9B/wBxQQF0ckGg/QBqLwEAIQECQCARDQAgAUEAIAJBAmsiB0F/RhshASACQQFKBEAgByECDAELIA9BgAJqECghAgsgDykD6AEhZCAPKALwASFLIAMgAygCACABQQR2IhhBA3EgAUECdkEwcXIgInRyIhY2AgAgAUEFdkEHcSABQRBxIh5BBHZyIREgSyABQQdxIgdrIQ0gZCAHrYgiYKchCUEAIQcgFSAFQQJySgRAIBFBCHQgCUH/AHFBAXRyQaD9AGovAQAhBwJAIBENACAHQQAgAkECayIJQX9GGyEHIAJBAUoEQCAJIQIMAQsgD0GAAmoQKCECCyAHQQR2QQFxIAdBBXZBB3FyIREgDSAHQQdxIglrIQ0gYCAJrYgiYKchCQsgAyAHQQJ0QYAGcSAHQTBxciAiQQRqdCAWcjYCAAJAIAdBAnZBAnEgAUEDdkEBcXIiF0EDRw0AQQRBAyACQQJrIhZBf0YbIRcgAkEBSgRAIBYhAgwBCyAPQYACahAoIQILAn8gF0UEQCAPQoGAgIAQNwJ4QQAMAQsgF0ECTQRAIA9BASAJQQdxQdSdAWotAAAiFkEFdkF/IBZBAnZBB3EiGXRBf3MgCSAWQQNxIgl2cWpBAWoiFiAXQQFGIhcbNgJ8IA8gFkEBIBcbNgJ4IAkgGWoMAQsgCSAJQQdxQdSdAWotAAAiFkEDcSIZdiEJIBdBA0YEQCAWQQV2QQFqIRcgGUEDRgRAIA8gCUEBcUECcjYCfCAPIBdBfyAWQQJ2QQdxIhZ0QX9zIAlBAXZxajYCeCAWQQRqDAILIA8gFyAJIAlBB3FB1J0Bai0AACIJQQNxIhJ2IiBBfyAWQQJ2QQdxIhZ0QX9zcWo2AnggD0F/IAlBAnZBB3EiF3RBf3MgICAWdnEgCUEFdmpBAWo2AnwgFiAZaiASaiAXagwBCyAPIAkgCUEHcUHUnQFqLQAAIglBA3EiEnYiIEF/IBZBAnZBB3EiF3RBf3NxIBZBBXZqQQNqNgJ4IA9BfyAJQQJ2QQdxIhZ0QX9zICAgF3ZxIAlBBXZqQQNqNgJ8IBIgGWogF2ogFmoLIQkCQCAsIA8oAngiGU8EQCAPKAJ8IhIgLE0NAQsgIQRAQQAhByAdQQFBmfYAQQAQDwwHC0EAIQcgHUEBQZn2AEEAEA8MBgsgDyANIAlrNgLwASAPIGAgCa2INwPoASAHQfABcSAYQQ9xckH/AUH/ASAFQQRqIg0gFWtBAXR2IA0gFUwbIgkgCUHVAHEgH0EBShsiCUF/c3EEQCAhBEBBACEHIB1BAUGv2gBBABAPDAcLQQAhByAdQQFBr9oAQQAQDwwGCwJAAkAgHgRAIA9BwAFqEBshFyAPIA8oAtABIBkgAUETdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASAXQX8gFnRBf3NxIAFBCHZBAXEgFnRyQQFyQQJqIBN0IBdBH3RyIRYMAQtBACEWIAlBAXFFDQELIAYgFjYCAAsCQCABQSBxBEAgD0HAAWoQGyEXIA8gDygC0AEgGSABQRJ0QR91aiIWazYC0AEgDyAPKQPIASAWrYg3A8gBIAYgFUECdGogF0F/IBZ0QX9zcSABQQl2QQFxIBZ0ckEBciIWQQJqIBN0IBdBH3RyNgIAIAhBICAWZ2siFiAILQAAQf8AcSIXIBYgF0sbQYABcjoAAAwBCyAJQQJxRQ0AIAYgFUECdGpBADYCAAsgBkEEaiEXAkACQCABQcAAcQRAIA9BwAFqEBshGCAPIA8oAtABIBkgAUERdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASAYQX8gFnRBf3NxIAFBCnZBAXEgFnRyQQFyQQJqIBN0IBhBH3RyIRYMAQtBACEWIAlBBHFFDQELIBcgFjYCAAsgCEEAOgABAkAgAUGAAXEEQCAPQcABahAbIRggDyAPKALQASAZIAFBEHRBH3VqIhZrNgLQASAPIA8pA8gBIBatiDcDyAEgFyAVQQJ0aiAYQX8gFnRBf3NxIAFBC3ZBAXEgFnRyQQFyIgFBAmogE3QgGEEfdHI2AgAgCEGgfyABZ2s6AAEMAQsgCUEIcUUNACAXIBVBAnRqQQA2AgALIAZBCGohAQJAAkAgB0EQcQRAIA9BwAFqEBshGSAPIA8oAtABIBIgB0ETdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASAZQX8gFnRBf3NxIAdBCHZBAXEgFnRyQQFyQQJqIBN0IBlBH3RyIRcMAQtBACEXIAlBEHFFDQELIAEgFzYCAAsCQCAHQSBxBEAgD0HAAWoQGyEZIA8gDygC0AEgEiAHQRJ0QR91aiIWazYC0AEgDyAPKQPIASAWrYg3A8gBIAEgFUECdGogGUF/IBZ0QX9zcSAHQQl2QQFxIBZ0ckEBciIBQQJqIBN0IBlBH3RyNgIAIAhBICABZ2siASAILQABQf8AcSIWIAEgFksbQYABcjoAAQwBCyAJQSBxRQ0AIAEgFUECdGpBADYCAAsgBkEMaiEBAkACQCAHQcAAcQRAIA9BwAFqEBshGSAPIA8oAtABIBIgB0ERdEEfdWoiFms2AtABIA8gDykDyAEgFq2INwPIASAZQX8gFnRBf3NxIAdBCnZBAXEgFnRyQQFyQQJqIBN0IBlBH3RyIRcMAQtBACEXIAlBwABxRQ0BCyABIBc2AgALIAhBAmoiCEEAOgAAAkAgB0GAAXEEQCAPQcABahAbIRYgDyAPKALQASASIAdBEHRBH3VqIglrNgLQASAPIA8pA8gBIAmtiDcDyAEgASAVQQJ0aiAWQX8gCXRBf3NxIAdBC3ZBAXEgCXRyQQFyIgFBAmogE3QgFkEfdHI2AgAgCEGgfyABZ2s6AAAMAQsgCUGAAUkNACABIBVBAnRqQQA2AgALICJBEHMhIiADIAVBBHFqIQMgBkEQaiEGIA0gFUgNAAsLIApBCHEhOCAUQbAMaiEoIBRBoAhqISkgFEGQBGohJSAfQQNOBEAgFUEDbCE5IBVBAXQhOiAmQQFrISBBAyAmQQJrIgF0IS1BASABdCEuIBVBB2pBAXZB/P///wdxQQRqIT0gKyAkQX9zaiIBQQN2IgNBAnQiPkEEaiE7IANBAWoiP0H8////A3EiHEECdCE8IBxBA3QhEiABQRhJIUBBAiEZA0AgGSETIAstAAAhFiALQQA6AAAgIkFvcUECcyEiAkAgFUEATARAIBNBAmohGQwBCyAlIBQgE0EEcRshESATQQJqIRkgDiATIBVsQQJ0aiEIQQAhCiALIQZBACENA0AgDSEFIAYtAAFBBXZBBHEgCiAWQQd2cnIiA0EIdCAPQeABahAvQf8AcUEBdHJBoI0Bai8BACEBAkAgAw0AIAFBACACQQJrIgNBf0YbIQEgAkEBSgRAIAMhAgwBCyAPQYACahAoIQILIA8pA+gBIWUgDygC8AEhTCARIBEoAgAgAUEEdkEDcSABQQJ2QTBxciAidHIiCTYCACABQcAAcSIqQQV2IAFBgAFxIidBBnZyIQogTCABQQdxIgNrIRcgZSADrYgiYKchDUEAIRgCQCAVIAVBAnJMBEBBACEHDAELIAogBi0AAkEFdkEEcSAGLQABQQd2cnIiA0EIdCANQf8AcUEBdHJBoI0Bai8BACEHAkAgAw0AIAdBACACQQJrIgNBf0YbIQcgAkEBSgRAIAMhAgwBCyAPQYACahAoIQILIAdBBXYgB0EGdnJBAnEhCiAXIAdBB3EiA2shFyBgIAOtiCJgpyENCyARIAdBAnRBgAZxIAdBMHFyICJBBGp0IAlyNgIAQQEhCUEBIQMCQCAHQQJ2QQJxIAFBA3ZBAXFyIh5FDQAgDSANQQdxQdSdAWotAAAiA0EDcSINdiEJIB5BA0cEQEEBIAlBfyADQQJ2QQdxIhh0QX9zcSADQQV2akEBaiIDIB5BAUYiHhshCSADQQEgHhshAyANIBhqIRgMAQsgCUEHcUHUnQFqLQAAIh5BA3EiMyANIANBAnZBB3EiG2pqIB5BAnZBB3EiDWohGCAJIDN2IglBfyAbdEF/c3EgA0EFdmpBAWohA0F/IA10QX9zIAkgG3ZxIB5BBXZqQQFqIQkLIA8gFyAYazYC8AEgDyBgIBitiDcD6AEgAUHwAXEiDSANQQFrcQRAIAMgFkH/AHEiFiAGLQABQf8AcSIXIBYgF0sbIhZBAmsiF0EAIBYgF08baiEDCyAHQfABcSIXIBdBAWtxBEAgCSAGLQABQf8AcSIWIAYtAAJB/wBxIhggFiAYSxsiFkECa0EAIBZBAksbaiEJCyADICxNIAkgLE1xRQRAICEEQEEAIQcgHUEBQf32AEEAEA8MCQtBACEHIB1BAUH99gBBABAPDAgLIAYtAAIhFiAGQQA7AAEgFyANQQR2ckH/AUH/ASAFQQRqIg0gFWtBAXR2IA0gFUwbIhdB1QBxIBcgGSAfShsiGEF/c3EEQCAhBEBBACEHIB1BAUGv2gBBABAPDAkLQQAhByAdQQFBr9oAQQAQDwwICwJAAkAgAUEQcQRAIA9BwAFqEBshHiAPIA8oAtABIAMgAUETdEEfdWoiF2s2AtABIA8gDykDyAEgF62INwPIASAeQX8gF3RBf3NxIAFBCHZBAXEgF3RyQQFyQQJqICB0IB5BH3RyIRcMAQtBACEXIBhBAXFFDQELIAggFzYCAAsCQCABQSBxBEAgD0HAAWoQGyEeIA8gDygC0AEgAyABQRJ0QR91aiIXazYC0AEgDyAPKQPIASAXrYg3A8gBIAggFUECdGogHkF/IBd0QX9zcSABQQl2QQFxIBd0ckEBciIXQQJqICB0IB5BH3RyNgIAIAZBICAXZ2siFyAGLQAAQf8AcSIeIBcgHksbQYABcjoAAAwBCyAYQQJxRQ0AIAggFUECdGpBADYCAAsgCEEEaiEeAkACQCAqBEAgD0HAAWoQGyEbIA8gDygC0AEgAyABQRF0QR91aiIXazYC0AEgDyAPKQPIASAXrYg3A8gBIBtBfyAXdEF/c3EgAUEKdkEBcSAXdHJBAXJBAmogIHQgG0EfdHIhFwwBC0EAIRcgGEEEcUUNAQsgHiAXNgIACwJAICcEQCAPQcABahAbIRcgDyAPKALQASADIAFBEHRBH3VqIgNrNgLQASAPIA8pA8gBIAOtiDcDyAEgHiAVQQJ0aiAXQX8gA3RBf3NxIAFBC3ZBAXEgA3RyQQFyIgFBAmogIHQgF0EfdHI2AgAgBkGgfyABZ2s6AAEMAQsgGEEIcUUNACAeIBVBAnRqQQA2AgALIAhBCGohAQJAAkAgB0EQcQRAIA9BwAFqEBshFyAPIA8oAtABIAkgB0ETdEEfdWoiA2s2AtABIA8gDykDyAEgA62INwPIASAXQX8gA3RBf3NxIAdBCHZBAXEgA3RyQQFyQQJqICB0IBdBH3RyIQMMAQtBACEDIBhBEHFFDQELIAEgAzYCAAsCQCAHQSBxBEAgD0HAAWoQGyEXIA8gDygC0AEgCSAHQRJ0QR91aiIDazYC0AEgDyAPKQPIASADrYg3A8gBIAEgFUECdGogF0F/IAN0QX9zcSAHQQl2QQFxIAN0ckEBciIBQQJqICB0IBdBH3RyNgIAIAZBICABZ2siASAGLQABQf8AcSIDIAEgA0sbQYABcjoAAQwBCyAYQSBxRQ0AIAEgFUECdGpBADYCAAsgCEEMaiEBAkACQCAHQcAAcQRAIA9BwAFqEBshFyAPIA8oAtABIAkgB0ERdEEfdWoiA2s2AtABIA8gDykDyAEgA62INwPIASAXQX8gA3RBf3NxIAdBCnZBAXEgA3RyQQFyQQJqICB0IBdBH3RyIQMMAQtBACEDIBhBwABxRQ0BCyABIAM2AgALIAZBAmohBgJAIAdBgAFxBEAgD0HAAWoQGyEXIA8gDygC0AEgCSAHQRB0QR91aiIDazYC0AEgDyAPKQPIASADrYg3A8gBIAEgFUECdGogF0F/IAN0QX9zcSAHQQt2QQFxIAN0ckEBciIBQQJqICB0IBdBH3RyNgIAIAZBoH8gAWdrOgAADAELIBhBgAFJDQAgASAVQQJ0akEANgIACyAiQRBzISIgESAFQQRxaiERIAhBEGohCCANIBVIDQALCwJAIAxBAkkNACATQQJxRQ0AIBlBBHEhAwJAAn8CQAJAIDEEQCAUICUgAxshFkEAIRggFUEATA0BIA4gE0ECayAVbEECdGohEQNAIA9BgAFqEC8hB0EAIQEgFigCACIIBEAgESAYQQJ0aiEBQQAhCUEPIQYDQAJAIAYgCHFFDQAgBkGRosSIAXEiDSAIcQRAIAEgASgCACAHQX9zQQFxICB0cyAucjYCACAHQQF2IQcLIA1BAXQgCHEEQCABIBVBAnRqIgUgBSgCACAHQX9zQQFxICB0cyAucjYCACAHQQF2IQcLIA1BAnQgCHEEQCABIDpBAnRqIgUgBSgCACAHQX9zQQFxICB0cyAucjYCACAHQQF2IQcLIA1BA3QgCHFFDQAgASA5QQJ0aiINIA0oAgAgB0F/c0EBcSAgdHMgLnI2AgAgB0EBdiEHCyABQQRqIQEgBkEEdCEGIAlBAWoiCUEIRw0ACyAIaSEBCyAWQQRqIRYgDyAPKAKQASABazYCkAEgDyAPKQOIASABrYg3A4gBIBhBCGoiGCAVSA0ACwsgKSAoIAMbIQUgFCAlIAMbIRYgA0UhGCAVQQBMDQNBACEDIEANASAFIBYgO2pJIBYgBSA7aiIHSXENAUEAIAUiASAWIgYgPmpBCGpJIAZBBGogB0lxDQIaIAYgPGohBiABIDxqIQH9DAAAAAAAAAAAAAAAAAAAAAAhXkEAIQcDQCAFIAdBAnQiA2oiCSADIBZqIgP9AAIAIl9BBP2tASBfQQT9qwEgXiBf/Q0MDQ4PEBESExQVFhcYGRobQRz9rQH9UP1QIF/9UCJe/QsCACAJIF4gA/0AAgRBHP2rAf1QIl5BAf2tAf0Md3d3d3d3d3d3d3d3d3d3d/1OIF5BAf2rAf0M7u7u7u7u7u7u7u7u7u7u7v1O/VAgXv1QIF/9T/0LAgAgXyFeIAdBBGoiByAcRw0ACyAcID9GDQMgEiEDIF79GwMMAgsgA0UhGCApICggAxshBQwCCyAFIQEgFiEGQQALIQcDQCAHQRx2IQkgASAGKAIAIgdBBHYgCSAHQQR0cnIgB3IiCTYCACABIAkgBigCBEEcdHIiCUEBdkH37t27B3EgCUEBdEHu3bv3fnFyIAlyIAdBf3NxNgIAIAFBBGohASAGQQRqIQYgA0EIaiIDIBVIDQALCyATQQZJDQBBACEJQQAhESAWIQEgKSAoIBgbIhshByAUICUgGBsiFyEGAkAgFUEATCINDQADQCABQQRqIQMgBygCACEIIAEoAgAhASAHIDgEfyAIBSABQQR0IBFBHHZyIAFBBHZyIAMoAgBBHHRyIAFyQQN0QYiRosR4cSAIcgsgBigCAEF/c3E2AgAgBkEEaiEGIAdBBGohByABIREgAyEBIAlBCGoiCSAVSA0ACyANDQAgDiATQQZrIBVsQQJ0aiFBQQAhHiAXIREDQEEAIQMgGygCACIBBEAgFSAeayFCQQAhB0EAIQoDQCAHIU0gD0GgAWoQGyEHAkAgCiAKQQRqIgYgQiAGIB5qIBVIGyIzTiJDBEBBACEGDAELIBEoAgBBf3MhKiBBIAogHnJBAnRqIRhBACEGQQ8gCiIJQQJ0IkR0Ig0hCANAAkAgASAIcUUNACAIQZGixIgBcSInIAFxBEAgB0EBcQRAIAMgJ3IhA0EyIAlBAnR0ICpxIAFyIQELIAdBAXYhByAGQQFqIQYLIAEgJ0EBdCI0cQRAIAdBAXEEQCADIDRyIQMgAUH0ACAJQQJ0dCAqcXIhAQsgB0EBdiEHIAZBAWohBgsgASAnQQJ0IjRxBEAgB0EBcQRAIAMgNHIhAyABQegBIAlBAnR0ICpxciEBCyAHQQF2IQcgBkEBaiEGCyABICdBA3QiJ3FFDQAgB0EBcQRAIAMgJ3IhAyABQcABIAlBAnR0ICpxciEBCyAGQQFqIQYgB0EBdiEHCyAIQQR0IQggCUEBaiIJIDNIDQALIAMgRHZB//8DcUUNACBDDQADQAJAIAMgDXFFDQAgDUGRosSIAXEiCSADcQRAIBggGCgCACAHQR90ciAtcjYCACAHQQF2IQcgBkEBaiEGCyAJQQF0IANxBEAgGCAVQQJ0aiIIIAgoAgAgB0EfdHIgLXI2AgAgB0EBdiEHIAZBAWohBgsgCUECdCADcQRAIBggOkECdGoiCCAIKAIAIAdBH3RyIC1yNgIAIAdBAXYhByAGQQFqIQYLIAlBA3QgA3FFDQAgGCA5QQJ0aiIJIAkoAgAgB0EfdHIgLXI2AgAgBkEBaiEGIAdBAXYhBwsgDUEEdCENIBhBBGohGCAKQQFqIgogM0gNAAsLIA8gDygCsAEgBms2ArABIA8gDykDqAEgBq2INwOoAUEBIQdBBCEKIE1BAXFFDQALIBsgGygCBCADQRt2QQ5xIANBHXZyIANBHHZyIBEoAgRBf3NxcjYCBAsgESgCACADciIDQQN2QZGixIgBcSIBQQR2IAFBBHRyIAFyIQYgHgRAIAVBBGsiByAHKAIAIBZBBGsoAgBBf3MgAUEcdHFyNgIACyAFIAUoAgAgBiAWKAIAQX9zcXI2AgAgBSAFKAIEIBYoAgRBf3MgA0EfdnFyNgIEIBtBBGohGyARQQRqIREgBUEEaiEFIBZBBGohFiAeQQhqIh4gFUgNAAsLIBdBACA9EBUaCyAZIB9IDQALCwJAIAxBAkkNAAJAIB9BA3FBAWsiFkECSSAxcQRAIBVBAEwNAUEBICZBAmt0IQIgDiAfQfz//wdxIBVsQQJ0aiERICUgFCAfQQRxGyEFICZBAWshCEEAIQogFUEMbCEMIBVBA3QhCwNAIA9BgAFqEC8hB0EAIQEgBSgCACIDBEAgESAKQQJ0aiEBQQ8hBkEAIQkDQAJAIAMgBnFFDQAgBkGRosSIAXEiDSADcQRAIAEgASgCACAHQX9zQQFxIAh0cyACcjYCACAHQQF2IQcLIA1BAXQgA3EEQCABIBVBAnRqIh0gHSgCACAHQX9zQQFxIAh0cyACcjYCACAHQQF2IQcLIA1BAnQgA3EEQCABIAtqIh0gHSgCACAHQX9zQQFxIAh0cyACcjYCACAHQQF2IQcLIA1BA3QgA3FFDQAgASAMaiINIA0oAgAgB0F/c0EBcSAIdHMgAnI2AgAgB0EBdiEHCyABQQRqIQEgBkEEdCEGIAlBAWoiCUEIRw0ACyADaSEBCyAFQQRqIQUgDyAPKAKQASABazYCkAEgDyAPKQOIASABrYg3A4gBIApBCGoiCiAVSA0ACwsgFkEBSw0AIBVBAEwNACAlIBQgH0EEcSIBGyEJICggKSABGyECQQAhAwJ/AkAgKyAkQX9zaiIBQThJDQAgAiAJIAFBAXZB/P///wdxIgZBBGoiB2pJIAkgAiAHaiIHSXENACACIAYgCWpBCGpJIAlBBGogB0lxDQAgAUEDdkEBaiINQfz///8DcSIIQQN0IQMgCSAIQQJ0IgFqIQYgASACaiEB/QwAAAAAAAAAAAAAAAAAAAAAIV5BACEHA0AgAiAHQQJ0IhZqIhEgCSAWaiIW/QACACJfQQT9rQEgX0EE/asBIF4gX/0NDA0ODxAREhMUFRYXGBkaG0Ec/a0B/VD9UCBf/VAiXv0LAgAgESBeIBb9AAIEQRz9qwH9UCJeQQH9rQH9DHd3d3d3d3d3d3d3d3d3d3f9TiBeQQH9qwH9DO7u7u7u7u7u7u7u7u7u7u79Tv1QIF79UCBf/U/9CwIAIF8hXiAHQQRqIgcgCEcNAAsgCCANRg0CIF79GwMMAQsgAiEBIAkhBkEACyEHA0AgB0EcdiEJIAEgBigCACIHQQR2IAkgB0EEdHJyIAdyIgk2AgAgASAJIAYoAgRBHHRyIglBAXZB9+7duwdxIAlBAXRB7t27935xciAJciAHQX9zcTYCACABQQRqIQEgBkEEaiEGIANBCGoiAyAVSA0ACwsgHyAfQQFqQQNxa0EDa0EAIB9BBkobIhEgH04NAEEDICZBAmt0IRkgKyAkQX9zaiIBQQN2IgNBAnQiK0EEaiEdIANBAWoiA0H8////A3EiEkECdCEhIBJBA3QhFiAVQQxsISwgFUEDdCEtIAFBGEkhJiADIBJGIRsDQAJAAkACQAJAAn8CQCAfIBFrIgFBAWsiA0EDTwRAQX8hFyABQQVIDQUgFUEATA0GICUgFCARQQRxIgEbIQIgKCApIAEbIQkgOARAQQAhBiAmDQQgAiAJIB1qSSACIB1qIAlLcQ0EIAIgIWohASAJICFqIQcDQCAJIAZBAnQiA2oiCCAI/QACACACIANq/QACAP1P/QsCACAGQQRqIgYgEkcNAAsgFiEGIBsNBgwFCyAUICUgARshDUEAIQMgJg0BIAkgDSAdakkgDSAJIB1qIgFJcQ0BIAkgDSArakEIakkgDUEEaiABSXENASAJIAIgHWpJIAEgAktxDQEgAiAhaiEIIAkgIWohASANICFqIQf9DAAAAAAAAAAAAAAAAAAAAAAhXkEAIQYDQCAJIAZBAnQiA2oiBSADIA1qIgz9AAIAIl9BBP2tASBfQQT9qwEgXiBf/Q0MDQ4PEBESExQVFhcYGRobQRz9rQH9UP1QIAz9AAIEQRz9qwH9UCBf/VBBA/2rAf0MiIiIiIiIiIiIiIiIiIiIiP1OIAX9AAIA/VAgAiADav0AAgD9T/0LAgAgXyFeIAZBBGoiBiASRw0ACyAbDQUgFiEDIF79GwMMAgsgA0ECdEHcnQFqKAIAIRcMBAsgDSEHIAkhASACIQhBAAshBgNAIAZBHHYhCSABIAEoAgAgBygCACIGQQR2IAkgBkEEdHJyIAcoAgRBHHRyIAZyQQN0QYiRosR4cXIgCCgCAEF/c3E2AgAgCEEEaiEIIAFBBGohASAHQQRqIQcgA0EIaiIDIBVIDQALDAILIAkhByACIQELA0AgByAHKAIAIAEoAgBBf3NxNgIAIAFBBGohASAHQQRqIQcgBkEIaiIGIBVIDQALCyAVQQBMDQAgJSAUIBFBBHEiARshCiAoICkgARshAiAUICUgARshEyApICggARshHiAOIBEgFWxBAnRqIS5BACEFA0BBACEDIAIoAgAgF3EiAQRAIBUgBWshKkEAIQdBACENA0AgByFOIA9BoAFqEBshBwJAIA0gDUEEaiIGICogBSAGaiAVSBsiJE4iJwRAQQAhBgwBCyAXIAooAgBBf3NxIRggLiAFIA1yQQJ0aiELQQAhBkEPIA0iCUECdCIcdCIgIQgDQAJAIAEgCHFFDQAgCEGRosSIAXEiIiABcQRAIAdBAXEEQCADICJyIQNBMiAJQQJ0dCAYcSABciEBCyAHQQF2IQcgBkEBaiEGCyABICJBAXQiMXEEQCAHQQFxBEAgAyAxciEDIAFB9AAgCUECdHQgGHFyIQELIAdBAXYhByAGQQFqIQYLIAEgIkECdCIxcQRAIAdBAXEEQCADIDFyIQMgAUHoASAJQQJ0dCAYcXIhAQsgB0EBdiEHIAZBAWohBgsgASAiQQN0IiJxRQ0AIAdBAXEEQCADICJyIQMgAUHAASAJQQJ0dCAYcXIhAQsgBkEBaiEGIAdBAXYhBwsgCEEEdCEIIAlBAWoiCSAkSA0ACyADIBx2Qf//A3FFDQAgJw0AA0ACQCADICBxRQ0AICBBkaLEiAFxIgkgA3EEQCALIAsoAgAgB0EfdHIgGXI2AgAgB0EBdiEHIAZBAWohBgsgCUEBdCADcQRAIAsgFUECdGoiCCAIKAIAIAdBH3RyIBlyNgIAIAdBAXYhByAGQQFqIQYLIAlBAnQgA3EEQCALIC1qIgggCCgCACAHQR90ciAZcjYCACAHQQF2IQcgBkEBaiEGCyAJQQN0IANxRQ0AIAsgLGoiCSAJKAIAIAdBH3RyIBlyNgIAIAZBAWohBiAHQQF2IQcLICBBBHQhICALQQRqIQsgDUEBaiINICRIDQALCyAPIA8oArABIAZrNgKwASAPIA8pA6gBIAatiDcDqAFBASEHQQQhDSBOQQFxRQ0ACyACIAIoAgQgA0EbdkEOcSADQR12ciADQRx2ciAKKAIEQX9zcXI2AgQLIAooAgAgA3IiA0EDdkGRosSIAXEiAUEEdiABQQR0ciABciEGIAUEQCAeQQRrIgcgBygCACATQQRrKAIAQX9zIAFBHHRxcjYCAAsgHiAeKAIAIAYgEygCAEF/c3FyNgIAIB4gHigCBCATKAIEQX9zIANBH3ZxcjYCBCACQQRqIQIgCkEEaiEKIB5BBGohHiATQQRqIRMgBUEIaiIFIBVIDQALCyARQQRqIhEgH0gNAAsLQQEhByAfQQBMDQMgFUEATA0DIBVB/P///wdxIgZBAnQhAiAVQQRJIQhBACEJA0AgDiAJIBVsQQJ0aiEDAkACQCAIBEAgAyEHQQAhAQwBCyACIANqIQdBACEBA0AgAyABQQJ0aiINIA39AAIAIl79DP///3////9/////f////3/9TiJf/aEBIF8gXv0MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAIAFBBGoiASAGRw0ACyAGIgEgFUYNAQsDQCAHQQAgBygCACIDQf////8HcSINayANIANBAEgbNgIAIAdBBGohByABQQFqIgEgFUcNAAsLQQEhByAJQQFqIgkgH0cNAAsMAwsgIUUNACAPIBooAhg2AjQgDyAWNgIwIB1BAUHcxwAgD0EwahAPDAELIA8gATYCFCAPIBY2AhAgHUEBQdzHACAPQRBqEA9BACEHDAELQQAhBwsgD0GwAmokACAHDQEMAwsgBCABQQl0QdCpAWo2AmwCfyAEKAJ0IQECQAJAIBooAhAgGigCCGsiBSAaKAIUIBooAgxrIglsIgMgBCgChAFLBEAgARAQIAQgA0ECdBAYIgE2AnRBACABRQ0DGiAEIAM2AoQBDAELIAFFDQELIAFBACADQQJ0EBUaCyAEKAJ4IQECQCAFQQJqIgYgCUEDakECdiIMQQJqbCIDIAQoAogBTQRAIANBAnQhCAwBCyABEBAgBCADQQJ0IggQGCIBNgJ4IAENAEEADAELIAQgAzYCiAEgAUEAIAgQFRoCQCAGRQ0AIAQoAngiByEBAkAgBkEETwRAIAcgBkF8cSINQQJ0aiEBQQAhCANAIAcgCEECdGr9DAAAIEkAACBJAAAgSQAAIEn9CwIAIAhBBGoiCCANRw0ACyAGIA1GDQELA0AgAUGAgIDJBDYCACABQQRqIQEgDUEBaiINIAZHDQALCyAHIAxBAWogBmxBAnRqIQNBACENAkACQCAGQQRJBEAgAyEBDAELIAMgBkF8cSINQQJ0aiEBQQAhCANAIAMgCEECdGr9DAAAIEkAACBJAAAgSQAAIEn9CwIAIAhBBGoiCCANRw0ACyAGIA1GDQELA0AgAUGAgIDJBDYCACABQQRqIQEgDUEBaiINIAZHDQALCyAJQQNxIgFFDQAgBkUNAEGAgIDIBEGAgIDABEGAgICABCABQQJGGyABQQFGGyELIAcgBiAMbEECdGohA0EAIQ0CQCAGQQRJBEAgAyEBDAELIAMgBkF8cSINQQJ0aiEBIAv9ESFfQQAhCANAIAMgCEECdGogX/0LAgAgCEEEaiIIIA1HDQALIAYgDUYNAQsDQCABIAs2AgAgAUEEaiEBIA1BAWoiDSAGRw0ACwsgBCAJNgKAASAEIAU2AnxBAQtFDQIgGigCHCARaiIZQR9OBEAgIUUNAiAjIBk2AhAgHUECQdXBACAjQRBqEA8MAwsgBBBaQQAhASAEQbCpATYCZCAEQdCeATYCYCAEQfCeATYCHAJAAkACQAJAIBooAjQiB0EBSw0AIAQoApABRQ0CIAcNAAwBCyAaKAIEIQMgB0EETwRAIAdBfHEhAkEAIQYDQCADIAZBA3RqIgFBHGogAUEUaiABQQxqIAH9CQIE/VYCAAH9VgIAAv1WAgADIF79rgEhXiAGQQRqIgYgAkcNAAsgXiBeIF79DQgJCgsMDQ4PAAECAwABAgP9rgEiXiBeIF79DQQFBgcAAQIDAAECAwABAgP9rgH9GwAhASACIAdGDQELA0AgAyACQQN0aigCBCABaiEBIAJBAWoiAiAHRw0ACwsgAUECaiIDIAQoApgBSwRAIAQoApQBIAMQFyIGRQ0FIAQgBjYClAEgASAGakEAOwAAIAQgAzYCmAEgGigCNCEHCyAEKAKUASEeIAdFDQEgGigCBCEGQQAhAkEAIQEDQCACIB5qIAYgAUEDdCIDaiIGKAIAIAYoAgQQEhogGigCBCIGIANqKAIEIAJqIQIgAUEBaiIBIBooAjRJDQALDAELIAdBAUcNASAaKAIEKAIAIR4LIBooAjwiAQRAIAQoAnQhLCAEIAE2AnQLIBooAiwEQCAWQQhxISUgBEEcaiEPIBZBAXEhLSAWQQJxRSEuQQIhHwNAIB4gKGohASAaKAIAIClBGGxqIiAoAgAhAwJAIC0gH0ECSSAZIBooAhxBBGtMcXEiIgRAIAQgATYCFCAEIAEgA2oiAzYCGCAEIAMvAAA7AXAgA0H/AToAACAEKAIYQf8BOgABIARBADYCCCAEQQA2AgAgBCABNgIQDAELIAQgATYCFCAEIAEgA2oiBjYCGCAEIAYvAAA7AXAgBkH/AToAACAEKAIYQf8BOgABIAQgBEEcajYCaCAEIAE2AhAgBEEANgIMIAQgAwR/IAEtAABBEHQFQYCA/AcLIgM2AgBBASEGIAFBAWohCSABLQABIQcCfyABLQAAQf8BRgRAIAdBkAFPBEAgBEEBNgIMIANBgP4DcgwCCyAEIAk2AhBBACEGIAdBCXQgA2oMAQsgBCAJNgIQIAdBCHQgA3ILIQEgBCAGNgIIIARBgIACNgIEIAQgAUEHdDYCAAsgICgCACEqAkAgGUEATA0AICAoAghFDQAgIiAuciEnQQAhJgNAAkACQAJAAkACQCAfQQFrDgIBAgALICIEQEEBIBl0IgFBAXYgAXIhESAEKAJ8IgVBAnQiDSAEKAJ4akEMaiEBIAQoAnQhBkEAIQggBCgCgAEiA0EETwRAIAVFDQUgBUEDbCECIAVBAXQhDEEAIBFrIQkDQCAMQQJ0IQtBACEDA0ACQCABIgcoAgAiAUUNAAJAIAFBkICAAXENACABQe8DcUUNACAEKAIAIQECQCAEKAIIIhANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIAkAgASAQdkEBcUUNAAJAIBANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIAYgCSARIAEgEHZBAXEiEBs2AgAgBCgCfCEBIAdBBGsiCiAKKAIAQSByNgIAIAcgBygCBEEIcjYCBCAHIAcoAgAgEEETdHJBEHI2AgAgJQ0AIAdBfiABa0ECdGoiASABKAIEQYCAAnI2AgQgASABKAIAIBBBH3RyQYCABHI2AgAgAUEEayIBIAEoAgBBgIAIcjYCAAsgByAHKAIAQYCAgAFyIgE2AgALAkAgAUGAgYAIcQ0AIAFB+B5xRQ0AIAQoAgAhAQJAIAQoAggiEA0AIAFB/wFGIQogBCgCECIQLQAAIQECQCAKRQRAIAQgATYCACAEIBBBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAQQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIhA2AgggBwJ/IAEgEHZBAXFFBEAgBygCAAwBCwJAIBANACABQf8BRiEKIAQoAhAiEC0AACEBAkAgCkUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIAYgDWogCSARIAEgEHZBAXEiARs2AgAgB0EEayIQIBAoAgBBgAJyNgIAIAcgBygCBEHAAHI2AgQgBygCACABQRZ0ckGAAXILQYCAgAhyIgE2AgALAkAgAUGAiIDAAHENACABQcD3AXFFDQAgBCgCACEBAkAgBCgCCCIQDQAgAUH/AUYhCiAEKAIQIhAtAAAhAQJAIApFBEAgBCABNgIAIAQgEEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIBBBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiEDYCCCAHAn8gASAQdkEBcUUEQCAHKAIADAELAkAgEA0AIAFB/wFGIQogBCgCECIQLQAAIQECQCAKRQRAIAQgATYCACAEIBBBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAQQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIhA2AgggBiALaiAJIBEgASAQdkEBcSIBGzYCACAHQQRrIhAgECgCAEGAEHI2AgAgByAHKAIEQYAEcjYCBCAHKAIAIAFBGXRyQYAIcgtBgICAwAByIgE2AgALIAFBgMCAgARxDQAgAUGAvA9xRQ0AIAQoAgAhAQJAIAQoAggiEA0AIAFB/wFGIQogBCgCECIQLQAAIQECQCAKRQRAIAQgATYCACAEIBBBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAQQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIhA2AgggASAQdkEBcQRAIAYgAkECdGohTwJAIBANACABQf8BRiEUIAQoAhAiEC0AACEBAkAgFEUEQCAEIAE2AgAgBCAQQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgEEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIQNgIIIE8gCSARIAEgEHZBAXEiEBs2AgAgBCgCfCEBIAdBBGsiCiAKKAIAQYCAAXI2AgAgByAHKAIEQYAgcjYCBCAHIAcoAgAgEEEcdHJBgMAAcjYCACAHIAFBAnRqIgEgASgCBEEEcjYCBCABIAEoAgxBAXI2AgwgASABKAIIIBBBEnRyQQJyNgIICyAHIAcoAgBBgICAgARyNgIACyAGQQRqIQYgB0EEaiEBIANBAWoiAyAFRw0ACyAHQQxqIQEgBiACQQJ0aiEGIAhBBGoiCCAEKAKAASIDQXxxSQ0ACwsgAyAITQ0DIAVFDQNBACETQQAgEWshCyADIRADQAJAIAggEEYEQCAIIRAMAQsgAUEEayEMIAEoAgAhDUEAIQIDQAJAIA0gAkEDbCIHdiIJQZCAgAFxDQAgCUHvA3FFDQAgBCgCACEDAkAgBCgCCCIJDQAgA0H/AUchECAEKAIQIgktAAAhAwJAIBBFBEAgA0GQAU8EQEH/ASEDIARB/wE2AgAMAgsgBCADNgIAIAQgCUEBajYCEEEHIQkMAgsgBCADNgIAIAQgCUEBajYCEAtBCCEJCyAEIAlBAWsiCTYCCAJAIAMgCXZBAXFFDQAgBiACIAVsQQJ0aiFQAkAgCQ0AIANB/wFHIQ0gBCgCECIJLQAAIQMCQCANRQRAIANBkAFPBEBB/wEhAyAEQf8BNgIADAILIAQgAzYCACAEIAlBAWo2AhBBByEJDAILIAQgAzYCACAEIAlBAWo2AhALQQghCQsgBCAJQQFrIgk2AgggUCALIBEgAyAJdkEBcSIJGzYCACAEKAJ8IRAgDCAMKAIAQSAgB3RyNgIAIAEgASgCACAJQRN0QRByIAd0cjYCACABIAEoAgRBCCAHdHI2AgQgAiAlckUEQCABQX4gEGtBAnRqIgMgAygCBEGAgAJyNgIEIAMgAygCACAJQR90ckGAgARyNgIAIANBBGsiAyADKAIAQYCACHI2AgALIAJBA0cNACABIBBBAnRqIgMgAygCBEEEcjYCBCADIAMoAgxBAXI2AgwgAyADKAIIIAlBEnRyQQJyNgIICyABIAEoAgBBgICAASAHdHIiDTYCACAEKAKAASEDCyADIRAgAkEBaiICIAMgCGtJDQALCyAGQQRqIQYgAUEEaiEBIBNBAWoiEyAFRw0ACwwDC0EAIQdBACENQQAhFwJAAkACQAJAIAQoAnwiEEHAAEcNACAEKAKAAUHAAEcNAEEAQQEgGXQiAUEBdiABciIRayEFIARBHGohECAEKAJ4QYwCaiEGIAQoAgghCCAEKAIEIQMgBCgCACECIAQoAmghDCAEKAJ0IQEgFkEIcQ0BA0BBACEXA0AgASEJIAYiBygCACIGBEACQCAGQZCAgAFxDQAgBkHvA3EiAUUNACADIBAgBCgCbCABai0AAEECdGoiDCgCACILKAIAIgFrIQMCfyABIAJBEHZLBEAgCygCBCEKIAwgC0EIQQwgASADSyIUG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIAogCkUgFBsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIQogDCALQQxBCCABIANLIhQbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAKRSAKIBQbDAELIAsoAgQLBH8gAyAQIAcoAgRBEXZBBHEgB0EEayIKKAIAQRN2QQFxIAZBDnZBEHEgBkEQdkHAAHEgBkGqAXFycnJyIhRB0LkBai0AAEECdGoiDCgCACILKAIAIgFrIQMgFEHQuwFqLQAAIRMgCSAFIBECfyABIAJBEHZLBEAgCygCBCEUIAwgC0EIQQwgASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBQgFEUgDhsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIRQgDCALQQxBCCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAURSAUIA4bDAELIAsoAgQLIBNzIgEbNgIAIAogCigCAEEgcjYCACAHIAcoAgRBCHI2AgQgB0GMAmsiCyALKAIAQYCACHI2AgAgB0GEAmsiCyALKAIAQYCAAnI2AgAgB0GIAmsiCyALKAIAIAFBH3RyQYCABHI2AgAgBiABQRN0ckEQcgUgBgtBgICAAXIhBgsCQCAGQYCBgAhxDQAgBkH4HnFFDQAgAyAQIAQoAmwgBkEDdiIUQe8DcWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBMbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiATGwwBCyALKAIECwR/IAMgECAHKAIEQRR2QQRxIAdBBGsiCigCAEEWdkEBcSAGQQ92QRBxIAZBE3ZBwABxIBRBqgFxcnJyciIUQdC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB0LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCgAIgCiAKKAIAQYACcjYCACAHIAcoAgRBwAByNgIEIAYgAUEWdHJBgAFyBSAGC0GAgIAIciEGCwJAIAZBgIiAwABxDQAgBkHA9wFxRQ0AIAMgECAEKAJsIAZBBnYiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEXdkEEcSAHQQRrIgooAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAUQaoBcXJycnIiFEHQuQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQdC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoAEIAogCigCAEGAEHI2AgAgByAHKAIEQYAEcjYCBCAGIAFBGXRyQYAIcgUgBgtBgICAwAByIQYLAkAgBkGAwICABHENACAGQYC8D3FFDQAgAyAQIAQoAmwgBkEJdiIUQe8DcWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBMbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiATGwwBCyALKAIECwR/IAMgECAHKAIEQRp2QQRxIAdBBGsiCigCAEEcdkEBcSAGQRV2QRBxIAZBGXZBwABxIBRBqgFxcnJyciIUQdC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB0LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCgAYgCiAKKAIAQYCAAXI2AgAgByAHKAIEQYAgcjYCBCAHIAcoAoQCQQRyNgKEAiAHIAcoAowCQQFyNgKMAiAHIAcoAogCIAFBEnRyQQJyNgKIAiAGIAFBHHRyQYDAAHIFIAYLQYCAgIAEciEGCyAHIAY2AgALIAdBBGohBiAJQQRqIQEgF0EBaiIXQcAARw0ACyAHQQxqIQYgCUGEBmohASANQTxJIVEgDUEEaiENIFENAAsMAgtBASAZdCIBQQF2IAFyIQ0gBCgCeCIJIBBBAnRqQQxqIQYgBCgCgAEhASAEKAIIIQggBCgCBCEDIAQoAgAhAiAEKAJoIQwgBCgCdCERAkAgFkEIcQRAAkAgAUEESQ0AIBAEQEEAIA1rIRQgBEEcaiEFIBBBDGwhEyAQQQN0IRUDQEEAIQsDQCAGIgkoAgAiBgRAAkAgBkGQgIABcQ0AIAZB7wNxIgFFDQAgAyAFIAQoAmwgAWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siEhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gEhsMAQsgCigCBCEOIAwgCkEIQQwgASADSyISG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgEhsLBH8gAyAFIAkoAgRBEXZBBHEgCUEEayIOKAIAQRN2QQFxIAZBDnZBEHEgBkEQdkHAAHEgBkGqAXFycnJyIhJB0LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHQuwFqLQAAIRggESAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiARs2AgAgDiAOKAIAQSByNgIAIAkgCSgCBEEIcjYCBCAGIAFBE3RyQRByBSAGC0GAgIABciEGCwJAIAZBgIGACHENACAGQfgecUUNACADIAUgBCgCbCAGQQN2IhJB7wNxai0AAEECdGoiDCgCACIKKAIAIgFrIQMCfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCEOIAwgCkEMQQggASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgDkUgDiAYGwwBCyAKKAIEIQ4gDCAKQQhBDCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgDiAORSAYGwsEfyADIAUgCSgCBEEUdkEEcSAJQQRrIg4oAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSASQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAyASQdC7AWotAAAhGCARIBBBAnRqIBQgDQJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIRIgDCAKQQxBCCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyASRSASIBsbDAELIAooAgQhEiAMIApBCEEMIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyASIBJFIBsbCyAYcyIBGzYCACAOIA4oAgBBgAJyNgIAIAkgCSgCBEHAAHI2AgQgBiABQRZ0ckGAAXIFIAYLQYCAgAhyIQYLAkAgBkGAiIDAAHENACAGQcD3AXFFDQAgAyAFIAQoAmwgBkEGdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBF3ZBBHEgCUEEayIOKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgEkGqAXFycnJyIhJB0LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHQuwFqLQAAIRggESAVaiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiARs2AgAgDiAOKAIAQYAQcjYCACAJIAkoAgRBgARyNgIEIAYgAUEZdHJBgAhyBSAGC0GAgIDAAHIhBgsCQCAGQYDAgIAEcQ0AIAZBgLwPcUUNACADIAUgBCgCbCAGQQl2IhJB7wNxai0AAEECdGoiDCgCACIKKAIAIgFrIQMCfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCEOIAwgCkEMQQggASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgDkUgDiAYGwwBCyAKKAIEIQ4gDCAKQQhBDCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgDiAORSAYGwsEfyADIAUgCSgCBEEadkEEcSAJQQRrIg4oAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSASQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAyASQdC7AWotAAAhGCARIBNqIBQgDQJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIRIgDCAKQQxBCCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyASRSASIBsbDAELIAooAgQhEiAMIApBCEEMIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyASIBJFIBsbCyAYcyIKGzYCACAOIA4oAgBBgIABcjYCACAJIAkoAgRBgCByNgIEIAQoAnxBAnQgCWoiASABKAIEQQRyNgIEIAEgASgCDEEBcjYCDCABIAEoAgggCkESdHJBAnI2AgggBiAKQRx0ckGAwAByBSAGC0GAgICABHIhBgsgCSAGNgIACyAJQQRqIQYgEUEEaiERIAtBAWoiCyAQRw0ACyAJQQxqIQYgESATaiERIAdBBGoiByAEKAKAASIBQXxxSQ0ACwwBC0EEIAFBfHEiBiAGQQRNG0EBayIGQXxxQQRqIQcgCSAGQQF0QXhxakEUaiEGCyAEIAg2AgggBCADNgIEIAQgAjYCACAEIAw2AmggEEUNASABIAdNDQEDQCABIAdGIVJBACEIIAchASBSRQRAA0AgBCAGIBEgCCAQbEECdGogDSAIIAQoAnxBAmpBARBZIAhBAWoiCCAEKAKAASIBIAdrSQ0ACwsgBkEEaiEGIBFBBGohESAXQQFqIhcgEEcNAAsMAQsCQCABQQRJDQAgEARAQQAgDWshFCAEQRxqIQUgEEEMbCETIBBBA3QhFQNAQQAhCwNAIAYiCSgCACIGBEACQCAGQZCAgAFxDQAgBkHvA3EiAUUNACADIAUgBCgCbCABai0AAEECdGoiDCgCACIKKAIAIgFrIQMCfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCEOIAwgCkEMQQggASADSyISG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgDkUgDiASGwwBCyAKKAIEIQ4gDCAKQQhBDCABIANLIhIbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgDiAORSASGwsEfyADIAUgCSgCBEERdkEEcSAJQQRrIg4oAgBBE3ZBAXEgBkEOdkEQcSAGQRB2QcAAcSAGQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAyASQdC7AWotAAAhGCARIBQgDQJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIRIgDCAKQQxBCCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyASRSASIBsbDAELIAooAgQhEiAMIApBCEEMIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyASIBJFIBsbCyAYcyIKGzYCACAOIA4oAgBBIHI2AgAgCSAJKAIEQQhyNgIEIAlBfiAEKAJ8a0ECdGoiASABKAIEQYCAAnI2AgQgASABKAIAIApBH3RyQYCABHI2AgAgAUEEayIBIAEoAgBBgIAIcjYCACAGIApBE3RyQRByBSAGC0GAgIABciEGCwJAIAZBgIGACHENACAGQfgecUUNACADIAUgBCgCbCAGQQN2IhJB7wNxai0AAEECdGoiDCgCACIKKAIAIgFrIQMCfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCEOIAwgCkEMQQggASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgDkUgDiAYGwwBCyAKKAIEIQ4gDCAKQQhBDCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgDiAORSAYGwsEfyADIAUgCSgCBEEUdkEEcSAJQQRrIg4oAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSASQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAyASQdC7AWotAAAhGCARIBBBAnRqIBQgDQJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIRIgDCAKQQxBCCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyASRSASIBsbDAELIAooAgQhEiAMIApBCEEMIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyASIBJFIBsbCyAYcyIBGzYCACAOIA4oAgBBgAJyNgIAIAkgCSgCBEHAAHI2AgQgBiABQRZ0ckGAAXIFIAYLQYCAgAhyIQYLAkAgBkGAiIDAAHENACAGQcD3AXFFDQAgAyAFIAQoAmwgBkEGdiISQe8DcWotAABBAnRqIgwoAgAiCigCACIBayEDAn8gASACQRB2TQRAIAIgAUEQdGshAiADQYCAAnEEQCAKKAIEDAILIAooAgQhDiAMIApBDEEIIAEgA0siGBtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEBIAgtAABB/wFHBEAgBCAKNgIQQQghCCABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIA5FIA4gGBsMAQsgCigCBCEOIAwgCkEIQQwgASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQMgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIANBCHQgAmohAgwBCyADQY8BTQRAIAQgCjYCECADQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIA4gDkUgGBsLBH8gAyAFIAkoAgRBF3ZBBHEgCUEEayIOKAIAQRl2QQFxIAZBEnZBEHEgBkEWdkHAAHEgEkGqAXFycnJyIhJB0LkBai0AAEECdGoiDCgCACIKKAIAIgFrIQMgEkHQuwFqLQAAIRggESAVaiAUIA0CfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCESIAwgCkEMQQggASADSyIbG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgEkUgEiAbGwwBCyAKKAIEIRIgDCAKQQhBDCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgEiASRSAbGwsgGHMiARs2AgAgDiAOKAIAQYAQcjYCACAJIAkoAgRBgARyNgIEIAYgAUEZdHJBgAhyBSAGC0GAgIDAAHIhBgsCQCAGQYDAgIAEcQ0AIAZBgLwPcUUNACADIAUgBCgCbCAGQQl2IhJB7wNxai0AAEECdGoiDCgCACIKKAIAIgFrIQMCfyABIAJBEHZNBEAgAiABQRB0ayECIANBgIACcQRAIAooAgQMAgsgCigCBCEOIAwgCkEMQQggASADSyIYG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCiAILQABIQEgCC0AAEH/AUcEQCAEIAo2AhBBCCEIIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEIDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgLIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgDkUgDiAYGwwBCyAKKAIEIQ4gDCAKQQhBDCABIANLIhgbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhAyAILQAAQf8BRwRAIAQgCjYCEEEIIQggA0EIdCACaiECDAELIANBjwFNBEAgBCAKNgIQIANBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgDiAORSAYGwsEfyADIAUgCSgCBEEadkEEcSAJQQRrIg4oAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSASQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIMKAIAIgooAgAiAWshAyASQdC7AWotAAAhGCARIBNqIBQgDQJ/IAEgAkEQdk0EQCACIAFBEHRrIQIgA0GAgAJxBEAgCigCBAwCCyAKKAIEIRIgDCAKQQxBCCABIANLIhsbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiEKIAgtAAEhASAILQAAQf8BRwRAIAQgCjYCEEEIIQggAUEIdCACaiECDAELIAFBjwFNBEAgBCAKNgIQIAFBCXQgAmohAkEHIQgMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyASRSASIBsbDAELIAooAgQhEiAMIApBCEEMIAEgA0siGxtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQogCC0AASEDIAgtAABB/wFHBEAgBCAKNgIQQQghCCADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAo2AhAgA0EJdCACaiECQQchCAwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEICyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyASIBJFIBsbCyAYcyIKGzYCACAOIA4oAgBBgIABcjYCACAJIAkoAgRBgCByNgIEIAQoAnxBAnQgCWoiASABKAIEQQRyNgIEIAEgASgCDEEBcjYCDCABIAEoAgggCkESdHJBAnI2AgggBiAKQRx0ckGAwAByBSAGC0GAgICABHIhBgsgCSAGNgIACyAJQQRqIQYgEUEEaiERIAtBAWoiCyAQRw0ACyAJQQxqIQYgESATaiERIAdBBGoiByAEKAKAASIBQXxxSQ0ACwwBC0EEIAFBfHEiBiAGQQRNG0EBayIGQXxxQQRqIQcgCSAGQQF0QXhxakEUaiEGCyAEIAg2AgggBCADNgIEIAQgAjYCACAEIAw2AmggEEUNACABIAdNDQADQCABIAdGIVNBACEIIAchASBTRQRAA0AgBCAGIBEgCCAQbEECdGogDSAIIAQoAnxBAmpBABBZIAhBAWoiCCAEKAKAASIBIAdrSQ0ACwsgBkEEaiEGIBFBBGohESAXQQFqIhcgEEcNAAsLDAILA0BBACEXA0AgASEJIAYiBygCACIGBEACQCAGQZCAgAFxDQAgBkHvA3EiAUUNACADIBAgBCgCbCABai0AAEECdGoiDCgCACILKAIAIgFrIQMCfyABIAJBEHZLBEAgCygCBCEKIAwgC0EIQQwgASADSyIUG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIAogCkUgFBsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIQogDCALQQxBCCABIANLIhQbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAKRSAKIBQbDAELIAsoAgQLBH8gAyAQIAcoAgRBEXZBBHEgB0EEayIKKAIAQRN2QQFxIAZBDnZBEHEgBkEQdkHAAHEgBkGqAXFycnJyIhRB0LkBai0AAEECdGoiDCgCACILKAIAIgFrIQMgFEHQuwFqLQAAIRMgCSAFIBECfyABIAJBEHZLBEAgCygCBCEUIAwgC0EIQQwgASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQMgCC0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIANBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCADQQh0IAJqIQILIAhBAWshCCACQQF0IQIgAUEBdCIBQYCAAkkNAAsgASEDIBQgFEUgDhsMAQsgAiABQRB0ayECIANBgIACcUUEQCALKAIEIRQgDCALQQxBCCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhASAILQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgAUEJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIAFBCHQgAmohAgsgCEEBayEIIAJBAXQhAiADQQF0IgNBgIACSQ0ACyAURSAUIA4bDAELIAsoAgQLIBNzIgEbNgIAIAogCigCAEEgcjYCACAHIAcoAgRBCHI2AgQgBiABQRN0ckEQcgUgBgtBgICAAXIhBgsCQCAGQYCBgAhxDQAgBkH4HnFFDQAgAyAQIAQoAmwgBkEDdiIUQe8DcWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBMbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiATGwwBCyALKAIECwR/IAMgECAHKAIEQRR2QQRxIAdBBGsiCigCAEEWdkEBcSAGQQ92QRBxIAZBE3ZBwABxIBRBqgFxcnJyciIUQdC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB0LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCgAIgCiAKKAIAQYACcjYCACAHIAcoAgRBwAByNgIEIAYgAUEWdHJBgAFyBSAGC0GAgIAIciEGCwJAIAZBgIiAwABxDQAgBkHA9wFxRQ0AIAMgECAEKAJsIAZBBnYiFEHvA3FqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAwJ/IAEgAkEQdksEQCALKAIEIQogDCALQQhBDCABIANLIhMbaigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgCiAKRSATGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhCiAMIAtBDEEIIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIApFIAogExsMAQsgCygCBAsEfyADIBAgBygCBEEXdkEEcSAHQQRrIgooAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAUQaoBcXJycnIiFEHQuQFqLQAAQQJ0aiIMKAIAIgsoAgAiAWshAyAUQdC7AWotAAAhEyAJIAUgEQJ/IAEgAkEQdksEQCALKAIEIRQgDCALQQhBDCABIANLIg4baigCADYCAANAAkAgCA0AIAQoAhAiCEEBaiELIAgtAAEhAyAILQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghCAwCCyAEIAs2AhAgA0EJdCACaiECQQchCAwBCyAEIAs2AhBBCCEIIANBCHQgAmohAgsgCEEBayEIIAJBAXQhAiABQQF0IgFBgIACSQ0ACyABIQMgFCAURSAOGwwBCyACIAFBEHRrIQIgA0GAgAJxRQRAIAsoAgQhFCAMIAtBDEEIIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEBIAgtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECABQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggAUEIdCACaiECCyAIQQFrIQggAkEBdCECIANBAXQiA0GAgAJJDQALIBRFIBQgDhsMAQsgCygCBAsgE3MiARs2AoAEIAogCigCAEGAEHI2AgAgByAHKAIEQYAEcjYCBCAGIAFBGXRyQYAIcgUgBgtBgICAwAByIQYLAkAgBkGAwICABHENACAGQYC8D3FFDQAgAyAQIAQoAmwgBkEJdiIUQe8DcWotAABBAnRqIgwoAgAiCygCACIBayEDAn8gASACQRB2SwRAIAsoAgQhCiAMIAtBCEEMIAEgA0siExtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAKIApFIBMbDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEKIAwgC0EMQQggASADSyITG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgCkUgCiATGwwBCyALKAIECwR/IAMgECAHKAIEQRp2QQRxIAdBBGsiCigCAEEcdkEBcSAGQRV2QRBxIAZBGXZBwABxIBRBqgFxcnJyciIUQdC5AWotAABBAnRqIgwoAgAiCygCACIBayEDIBRB0LsBai0AACETIAkgBSARAn8gASACQRB2SwRAIAsoAgQhFCAMIAtBCEEMIAEgA0siDhtqKAIANgIAA0ACQCAIDQAgBCgCECIIQQFqIQsgCC0AASEDIAgtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEIDAILIAQgCzYCECADQQl0IAJqIQJBByEIDAELIAQgCzYCEEEIIQggA0EIdCACaiECCyAIQQFrIQggAkEBdCECIAFBAXQiAUGAgAJJDQALIAEhAyAUIBRFIA4bDAELIAIgAUEQdGshAiADQYCAAnFFBEAgCygCBCEUIAwgC0EMQQggASADSyIOG2ooAgA2AgADQAJAIAgNACAEKAIQIghBAWohCyAILQABIQEgCC0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQgMAgsgBCALNgIQIAFBCXQgAmohAkEHIQgMAQsgBCALNgIQQQghCCABQQh0IAJqIQILIAhBAWshCCACQQF0IQIgA0EBdCIDQYCAAkkNAAsgFEUgFCAOGwwBCyALKAIECyATcyIBGzYCgAYgCiAKKAIAQYCAAXI2AgAgByAHKAIEQYAgcjYCBCAHIAcoAoQCQQRyNgKEAiAHIAcoAowCQQFyNgKMAiAHIAcoAogCIAFBEnRyQQJyNgKIAiAGIAFBHHRyQYDAAHIFIAYLQYCAgIAEciEGCyAHIAY2AgALIAdBBGohBiAJQQRqIQEgF0EBaiIXQcAARw0ACyAHQQxqIQYgCUGEBmohASANQTxJIVQgDUEEaiENIFQNAAsLIAQgCDYCCCAEIAM2AgQgBCACNgIAIAQgDDYCaAsMAgsgIgRAQQEgGXRBAXYhCSAEKAJ8IhFBAnQiDCAEKAJ4akEMaiEBIAQoAnQhBkEAIQ0gBCgCgAEiA0EETwRAIBFFDQQgEUEDbCEFIBFBAXQhC0EAIAlrIQIDQCALQQJ0IQpBACEDA0ACQCABIgcoAgAiAUUNACABQZCAgAFxQRBGBEAgBCgCACEBAkAgBCgCCCIQDQAgAUH/AUYhECAEKAIQIggtAAAhAQJAIBBFBEAgBCABNgIAIAQgCEEBajYCEAwBCyABQY8BTQRAIAQgATYCACAEIAhBAWo2AhBBByEQDAILQf8BIQEgBEH/ATYCAAtBCCEQCyAEIBBBAWsiCDYCCCAGIAIgCSABIAh2QQFxIAYoAgAiAUEfdkYbIAFqNgIAIAcgBygCAEGAgMAAciIBNgIACyABQYCBgAhxQYABRgRAIAQoAgAhAQJAIAQoAggiEA0AIAFB/wFGIRAgBCgCECIILQAAIQECQCAQRQRAIAQgATYCACAEIAhBAWo2AhAMAQsgAUGPAU0EQCAEIAE2AgAgBCAIQQFqNgIQQQchEAwCC0H/ASEBIARB/wE2AgALQQghEAsgBCAQQQFrIgg2AgggBiAMaiIQIAIgCSABIAh2QQFxIBAoAgAiAUEfdkYbIAFqNgIAIAcgBygCAEGAgIAEciIBNgIACyABQYCIgMAAcUGACEYEQCAEKAIAIQECQCAEKAIIIhANACABQf8BRiEQIAQoAhAiCC0AACEBAkAgEEUEQCAEIAE2AgAgBCAIQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgCEEBajYCEEEHIRAMAgtB/wEhASAEQf8BNgIAC0EIIRALIAQgEEEBayIINgIIIAYgCmoiECACIAkgASAIdkEBcSAQKAIAIgFBH3ZGGyABajYCACAHIAcoAgBBgICAIHIiATYCAAsgAUGAwICABHFBgMAARw0AIAYgBUECdGohECAEKAIAIQECQCAEKAIIIggNACABQf8BRiEUIAQoAhAiCC0AACEBAkAgFEUEQCAEIAE2AgAgBCAIQQFqNgIQDAELIAFBjwFNBEAgBCABNgIAIAQgCEEBajYCEEEHIQgMAgtB/wEhASAEQf8BNgIAC0EIIQgLIAQgCEEBayIINgIIIBAgAiAJIAEgCHZBAXEgECgCACIBQR92RhsgAWo2AgAgByAHKAIAQYCAgIACcjYCAAsgBkEEaiEGIAdBBGohASADQQFqIgMgEUcNAAsgB0EMaiEBIAYgBUECdGohBiANQQRqIg0gBCgCgAEiA0F8cUkNAAsLIAMgDU0NAiARRQ0CQQAhE0EAIAlrIQUgAyEHA0ACQCAHIA1GBEAgDSEHDAELIAEoAgAhEEEAIQIDQEGQgIABIAJBA2wiB3QgEHFBECAHdEYEQCAGIAIgEWxBAnRqIRAgBCgCACEDAkAgBCgCCCIIDQAgA0H/AUchDCAEKAIQIggtAAAhAwJAIAxFBEAgA0GQAU8EQEH/ASEDIARB/wE2AgAMAgsgBCADNgIAIAQgCEEBajYCEEEHIQgMAgsgBCADNgIAIAQgCEEBajYCEAtBCCEICyAEIAhBAWsiCDYCCCAQIAUgCSADIAh2QQFxIBAoAgAiA0EfdkYbIANqNgIAIAEgASgCAEGAgMAAIAd0ciIQNgIAIAQoAoABIQMLIAMhByACQQFqIgIgAyANa0kNAAsLIAZBBGohBiABQQRqIQEgE0EBaiITIBFHDQALDAILIAQoAnghCCAEKAJ0IQcgBCgCgAEhAwJAIAQoAnwiDEHAAEcNACADQcAARw0AIAhBjAJqIQNBACETQQBBASAZdEEBdiIFayEMIAQoAgghAiAEKAIEIQYgBCgCACEBIAQoAmghDQNAQQAhCANAIAchCSADIhAoAgAiBwRAIAMhVSAHQZCAgAFxQRBGBEAgBiAPQRBBD0EOIAdB7wNxGyAHQYCAwABxG0ECdGoiDSgCACIRKAIAIgNrIQYCfyADIAFBEHZLBEAgESgCBCELIA0gEUEIQQwgAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQYgAi0AAEH/AUYEQCAGQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIAZBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiAGQQh0IAFqIQELIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIAsgC0UgChsMAQsgASADQRB0ayEBIAZBgIACcUUEQCARKAIEIQsgDSARQQxBCCADIAZLIgobaigCADYCAANAAkAgAg0AIAQoAhAiAkEBaiERIAItAAEhAyACLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgwCCyAEIBE2AhAgA0EJdCABaiEBQQchAgwBCyAEIBE2AhBBCCECIANBCHQgAWohAQsgAkEBayECIAFBAXQhASAGQQF0IgZBgIACSQ0ACyALRSALIAobDAELIBEoAgQLIQMgCSAMIAUgAyAJKAIAIhFBH3ZGGyARajYCACAHQYCAwAByIQcLIAdBgIGACHFBgAFGBEAgBiAPQRBBD0EOIAdB+B5xGyAHQYCAgARxG0ECdGoiDSgCACIRKAIAIgNrIQYCfyADIAFBEHZLBEAgESgCBCELIA0gEUEIQQwgAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQYgAi0AAEH/AUYEQCAGQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIAZBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiAGQQh0IAFqIQELIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIAsgC0UgChsMAQsgASADQRB0ayEBIAZBgIACcUUEQCARKAIEIQsgDSARQQxBCCADIAZLIgobaigCADYCAANAAkAgAg0AIAQoAhAiAkEBaiERIAItAAEhAyACLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgwCCyAEIBE2AhAgA0EJdCABaiEBQQchAgwBCyAEIBE2AhBBCCECIANBCHQgAWohAQsgAkEBayECIAFBAXQhASAGQQF0IgZBgIACSQ0ACyALRSALIAobDAELIBEoAgQLIQMgCSAMIAUgAyAJKAKAAiIRQR92RhsgEWo2AoACIAdBgICABHIhBwsgB0GAiIDAAHFBgAhGBEAgBiAPQRBBD0EOIAdBwPcBcRsgB0GAgIAgcRtBAnRqIg0oAgAiESgCACIDayEGAn8gAyABQRB2SwRAIBEoAgQhCyANIBFBCEEMIAMgBksiChtqKAIANgIAA0ACQCACDQAgBCgCECICQQFqIREgAi0AASEGIAItAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECDAILIAQgETYCECAGQQl0IAFqIQFBByECDAELIAQgETYCEEEIIQIgBkEIdCABaiEBCyACQQFrIQIgAUEBdCEBIANBAXQiA0GAgAJJDQALIAMhBiALIAtFIAobDAELIAEgA0EQdGshASAGQYCAAnFFBEAgESgCBCELIA0gEUEMQQggAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQMgAi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIANBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiADQQh0IAFqIQELIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgC0UgCyAKGwwBCyARKAIECyEDIAkgDCAFIAMgCSgCgAQiEUEfdkYbIBFqNgKABCAHQYCAgCByIQcLIFUgB0GAwICABHFBgMAARgR/IAYgD0EQQQ9BDiAHQYC8D3EbIAdBgICAgAJxG0ECdGoiDSgCACIRKAIAIgNrIQYCfyADIAFBEHZLBEAgESgCBCELIA0gEUEIQQwgAyAGSyIKG2ooAgA2AgADQAJAIAINACAEKAIQIgJBAWohESACLQABIQYgAi0AAEH/AUYEQCAGQZABTwRAIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQIMAgsgBCARNgIQIAZBCXQgAWohAUEHIQIMAQsgBCARNgIQQQghAiAGQQh0IAFqIQELIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIAsgC0UgChsMAQsgASADQRB0ayEBIAZBgIACcUUEQCARKAIEIQsgDSARQQxBCCADIAZLIgobaigCADYCAANAAkAgAg0AIAQoAhAiAkEBaiERIAItAAEhAyACLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgwCCyAEIBE2AhAgA0EJdCABaiEBQQchAgwBCyAEIBE2AhBBCCECIANBCHQgAWohAQsgAkEBayECIAFBAXQhASAGQQF0IgZBgIACSQ0ACyALRSALIAobDAELIBEoAgQLIQMgCSAMIAUgAyAJKAKABiIRQR92RhsgEWo2AoAGIAdBgICAgAJyBSAHCzYCAAsgEEEEaiEDIAlBBGohByAIQQFqIghBwABHDQALIBBBDGohAyAJQYQGaiEHIBNBPEkhViATQQRqIRMgVg0ACyAEIAI2AgggBCAGNgIEIAQgATYCACAEIA02AmgMAgtBASAZdEEBdiELIAggDEECdCIOakEMaiEJIAQoAgghAiAEKAIEIQYgBCgCACEBIAQoAmghDUEAIRECQCADQQRJDQAgDARAIAxBA2whFCAMQQF0IRdBACALayEKA0AgF0ECdCESQQAhCANAIAkiBSgCACIQBEAgEEGQgIABcUEQRgRAIAYgD0EQQQ9BDiAQQe8DcRsgEEGAgMAAcRtBAnRqIg0oAgAiCSgCACIDayEGAn8gAyABQRB2TQRAIAEgA0EQdGshASAGQYCAAnEEQCAJKAIEDAILIAkoAgQhEyANIAlBDEEIIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEDIAktAABB/wFHBEAgBCACNgIQQQghAiADQQh0IAFqIQEMAQsgA0GPAU0EQCAEIAI2AhAgA0EJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIAZBAXQiBkGAgAJJDQALIBNFIBMgFRsMAQsgCSgCBCETIA0gCUEIQQwgAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQYgCS0AAEH/AUcEQCAEIAI2AhBBCCECIAZBCHQgAWohAQwBCyAGQY8BTQRAIAQgAjYCECAGQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIBMgE0UgFRsLIQMgByAKIAsgAyAHKAIAIglBH3ZGGyAJajYCACAQQYCAwAByIRALIBBBgIGACHFBgAFGBEAgBiAPQRBBD0EOIBBB+B5xGyAQQYCAgARxG0ECdGoiDSgCACIJKAIAIgNrIQYCfyADIAFBEHZNBEAgASADQRB0ayEBIAZBgIACcQRAIAkoAgQMAgsgCSgCBCETIA0gCUEMQQggAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQMgCS0AAEH/AUcEQCAEIAI2AhBBCCECIANBCHQgAWohAQwBCyADQY8BTQRAIAQgAjYCECADQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgE0UgEyAVGwwBCyAJKAIEIRMgDSAJQQhBDCADIAZLIhUbaigCADYCAANAAkAgAg0AIAQoAhAiCUEBaiECIAktAAEhBiAJLQAAQf8BRwRAIAQgAjYCEEEIIQIgBkEIdCABaiEBDAELIAZBjwFNBEAgBCACNgIQIAZBCXQgAWohAUEHIQIMAQsgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgsgAkEBayECIAFBAXQhASADQQF0IgNBgIACSQ0ACyADIQYgEyATRSAVGwshAyAHIA5qIgkgCiALIAMgCSgCACIJQR92RhsgCWo2AgAgEEGAgIAEciEQCyAQQYCIgMAAcUGACEYEQCAGIA9BEEEPQQ4gEEHA9wFxGyAQQYCAgCBxG0ECdGoiDSgCACIJKAIAIgNrIQYCfyADIAFBEHZNBEAgASADQRB0ayEBIAZBgIACcQRAIAkoAgQMAgsgCSgCBCETIA0gCUEMQQggAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQMgCS0AAEH/AUcEQCAEIAI2AhBBCCECIANBCHQgAWohAQwBCyADQY8BTQRAIAQgAjYCECADQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgBkEBdCIGQYCAAkkNAAsgE0UgEyAVGwwBCyAJKAIEIRMgDSAJQQhBDCADIAZLIhUbaigCADYCAANAAkAgAg0AIAQoAhAiCUEBaiECIAktAAEhBiAJLQAAQf8BRwRAIAQgAjYCEEEIIQIgBkEIdCABaiEBDAELIAZBjwFNBEAgBCACNgIQIAZBCXQgAWohAUEHIQIMAQsgBCAEKAIMQQFqNgIMIAFBgP4DaiEBQQghAgsgAkEBayECIAFBAXQhASADQQF0IgNBgIACSQ0ACyADIQYgEyATRSAVGwshAyAHIBJqIgkgCiALIAMgCSgCACIJQR92RhsgCWo2AgAgEEGAgIAgciEQCyAFIBBBgMCAgARxQYDAAEYEfyAGIA9BEEEPQQ4gEEGAvA9xGyAQQYCAgIACcRtBAnRqIg0oAgAiCSgCACIDayEGAn8gAyABQRB2TQRAIAEgA0EQdGshASAGQYCAAnEEQCAJKAIEDAILIAkoAgQhEyANIAlBDEEIIAMgBksiFRtqKAIANgIAA0ACQCACDQAgBCgCECIJQQFqIQIgCS0AASEDIAktAABB/wFHBEAgBCACNgIQQQghAiADQQh0IAFqIQEMAQsgA0GPAU0EQCAEIAI2AhAgA0EJdCABaiEBQQchAgwBCyAEIAQoAgxBAWo2AgwgAUGA/gNqIQFBCCECCyACQQFrIQIgAUEBdCEBIAZBAXQiBkGAgAJJDQALIBNFIBMgFRsMAQsgCSgCBCETIA0gCUEIQQwgAyAGSyIVG2ooAgA2AgADQAJAIAINACAEKAIQIglBAWohAiAJLQABIQYgCS0AAEH/AUcEQCAEIAI2AhBBCCECIAZBCHQgAWohAQwBCyAGQY8BTQRAIAQgAjYCECAGQQl0IAFqIQFBByECDAELIAQgBCgCDEEBajYCDCABQYD+A2ohAUEIIQILIAJBAWshAiABQQF0IQEgA0EBdCIDQYCAAkkNAAsgAyEGIBMgE0UgFRsLIQMgByAUQQJ0aiIJIAogCyADIAkoAgAiCUEfdkYbIAlqNgIAIBBBgICAgAJyBSAQCzYCAAsgBUEEaiEJIAdBBGohByAIQQFqIgggDEcNAAsgBUEMaiEJIAcgFEECdGohByARQQRqIhEgBCgCgAEiA0F8cUkNAAsMAQtBBCADQXxxIgkgCUEETRtBAWsiCUF8cUEEaiERIAggCUEBdEF4cWpBFGohCQsgBCACNgIIIAQgBjYCBCAEIAE2AgAgBCANNgJoIAxFDQEgAyARTQ0BQQAhE0EAIAtrIRQgAyEBA0ACQCABIBFGBEAgESEBDAELIAkoAgAhAkEAIRADQEGQgIABIBBBA2wiCHQgAnFBECAIdEYEQCAHIAwgEGxBAnRqIQUgBCAPQRBBD0EOIAIgCHYiAUHvA3EbIAFBgIDAAHEbQQJ0aiINNgJoIAQgBCgCBCANKAIAIgIoAgAiAWsiAzYCBAJ/IAEgBCgCACIGQRB2SwRAIAIoAgQhCiAEIAE2AgQgDSACQQhBDCABIANLIg4baigCADYCACAEKAIIIQIDQAJAIAINACAEKAIQIgJBAWohDSACLQABIQMgAi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAGQYD+A2ohBkEIIQIMAgsgBCANNgIQIANBCXQgBmohBkEHIQIMAQsgBCANNgIQQQghAiADQQh0IAZqIQYLIAQgAkEBayICNgIIIAQgBkEBdCIGNgIAIAQgAUEBdCIBNgIEIAFBgIACSQ0ACyAKIApFIA4bDAELIAQgBiABQRB0ayIGNgIAIANBgIACcUUEQCACKAIEIQogDSACQQxBCCABIANLIg4baigCADYCACAEKAIIIQIDQAJAIAINACAEKAIQIgJBAWohDSACLQABIQEgAi0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCAGQYD+A2ohBkEIIQIMAgsgBCANNgIQIAFBCXQgBmohBkEHIQIMAQsgBCANNgIQQQghAiABQQh0IAZqIQYLIAQgAkEBayICNgIIIAQgBkEBdCIGNgIAIAQgA0EBdCIDNgIEIANBgIACSQ0ACyAKRSAKIA4bDAELIAIoAgQLIQEgBSAUIAsgASAFKAIAIgNBH3ZGGyADajYCACAJIAkoAgBBgIDAACAIdHIiAjYCACAEKAKAASEDCyAQQQFqIhAgAyIBIBFrSQ0ACwsgCUEEaiEJIAdBBGohByATQQFqIhMgDEcNAAsMAQtBACERQQAhFwJAAkACQAJAIAQoAnwiFEHAAEcNACAEKAKAAUHAAEcNAEEAQQEgGXQiAUEBdiABciIUayETIARB5ABqIQggBEHgAGohECAEQRxqIQsgBCgCeEGMAmohBiAEKAIIIQUgBCgCBCEBIAQoAgAhAiAEKAJoIQkgBCgCdCEDIBZBCHENAQNAQQAhDANAIAMhEQJAAkACfwJAAkAgBiINKAIAIgZFBEAgASAQKAIAIgMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQcgECADQQhBDCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEJIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgByAHRSAKGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhByAQIANBDEEIIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECADQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgChsMAQsgAygCBAtFBEAgECEJDAYLIAEgCCgCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEHIAggA0EIQQwgASAGSSIKG2ooAgAiAzYCAANAAkAgBQ0AIAQoAhAiCUEBaiEFIAktAAEhASAJLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgByAHRSAKGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhByAIIANBDEEIIAEgBkkiChtqKAIAIgM2AgADQAJAIAUNACAEKAIQIglBAWohBSAJLQABIQYgCS0AAEH/AUYEQCAGQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSAGQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAKGwwBCyADKAIECyEKIAEgAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhByAIIANBCEEMIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQkgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHIAdFIA4bDAELIAIgBkEQdGshAiABQYCAAnFFBEAgAygCBCEHIAggA0EMQQggASAGSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQMgBi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIANBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAOGwwBCyADKAIECyEDQQAhBiAIIQkCQAJAAkACfwJAAkAgAyAKQQF0cg4EAAEDBQoLIAEgCyANKAIEQRF2QQRxIA1BBGsiBygCAEETdkEBcXIiDkHQuQFqLQAAQQJ0aiIJKAIAIgMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQogCSADQQhBDCABIAZJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEJIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCiAKRSASGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhCiAJIANBDEEIIAEgBkkiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECADQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogEhsMAQsgAygCBAshAyARIBMgFCADIA5B0LsBai0AAHMiAxs2AgAgByAHKAIAQSByNgIAIA0gDSgCBEEIcjYCBCANQYwCayIGIAYoAgBBgIAIcjYCACANQYQCayIGIAYoAgBBgIACcjYCACANQYgCayIGIAYoAgAgA0EfdHJBgIAEcjYCACADQRN0IVcgASALIAQoAmwtAAJBAnRqIgcoAgAiAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhCSAHIANBCEEMIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQcgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBzYCECABQQl0IAJqIQJBByEFDAELIAQgBzYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAJIAlFIA4bDAELIAIgBkEQdGshAiABQYCAAnFFBEAgAygCBCEJIAcgA0EMQQggASAGSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohByAGLQABIQMgBi0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAHNgIQIANBCXQgAmohAkEHIQUMAQsgBCAHNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCUUgCSAOGwwBCyADKAIECyEDIFdBEHIiBiADRQ0BGgsgASALIA0oAgRBFHZBBHEgDUEEayIJKAIAQRZ2QQFxIAZBD3ZBEHEgBkETdkHAAHEgBkEDdkGqAXFycnJyIhJB0LkBai0AAEECdGoiCigCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEOIAogB0EIQQwgASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIA4gDkUgChsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQ4gCiAHQQxBCCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAORSAOIAobDAELIAcoAgQLIQMgESATIBQgAyASQdC7AWotAABzIgMbNgKAAiAJIAkoAgBBgAJyNgIAIA0gDSgCBEHAAHI2AgQgBiADQRZ0ckGAAXILIQYgASALIAQoAmwgBkEGdkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQogCSAHQQhBDCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEJIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCiAKRSAOGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhCiAJIAdBDEEIIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQkgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECADQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDhsMAQsgBygCBAtFDQELIAEgCyANKAIEQRd2QQRxIA1BBGsiCSgCAEEZdkEBcSAGQRJ2QRBxIAZBFnZBwABxIAZBBnZBqgFxcnJyciISQdC5AWotAABBAnRqIgooAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAKIAdBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIAobDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAogB0EMQQggASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAKGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHQuwFqLQAAcyIDGzYCgAQgCSAJKAIAQYAQcjYCACANIA0oAgRBgARyNgIEIAYgA0EZdHJBgAhyIQYLIAEgCyAEKAJsIAZBCXZB7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgDhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIA4bDAELIAcoAgQLRQ0FCyABIAsgDSgCBEEadkEEcSANQQRrIg4oAgBBHHZBAXEgBkEVdkEQcSAGQRl2QcAAcSAGQQl2QaoBcXJycnIiCkHQuQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shASADIAJBEHZLBEAgBygCBCESIAkgB0EIQQwgASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIBIgEkUgFRsMBAsgAiADQRB0ayECIAFBgIACcQ0BIAcoAgQhEiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIBJFIBIgFRsMAwsCQCAGQZCAgAFxDQAgASALIAQoAmwgBkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQogCSAHQQhBDCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCiAKRSAOGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhCiAJIAdBDEEIIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDhsMAQsgBygCBAtFDQAgASALIA0oAgRBEXZBBHEgDUEEayIKKAIAQRN2QQFxIAZBDnZBEHEgBkEQdkHAAHEgBkGqAXFycnJyIhJB0LkBai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEOIAkgB0EIQQwgASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIA4gDkUgFRsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQ4gCSAHQQxBCCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAORSAOIBUbDAELIAcoAgQLIQMgESATIBQgAyASQdC7AWotAABzIgMbNgIAIAogCigCAEEgcjYCACANIA0oAgRBCHI2AgQgDUGMAmsiByAHKAIAQYCACHI2AgAgDUGEAmsiByAHKAIAQYCAAnI2AgAgDUGIAmsiByAHKAIAIANBH3RyQYCABHI2AgAgBiADQRN0ckEQciEGCwJAIAZBgIGACHENACABIAsgBCgCbCAGQQN2Ig5B7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgEhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBIbDAELIAcoAgQLRQ0AIAEgCyANKAIEQRR2QQRxIA1BBGsiCigCAEEWdkEBcSAGQQ92QRBxIAZBE3ZBwABxIA5BqgFxcnJyciISQdC5AWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIBUbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAkgB0EMQQggASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAVGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHQuwFqLQAAcyIDGzYCgAIgCiAKKAIAQYACcjYCACANIA0oAgRBwAByNgIEIAYgA0EWdHJBgAFyIQYLAkAgBkGAiIDAAHENACABIAsgBCgCbCAGQQZ2Ig5B7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgEhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBIbDAELIAcoAgQLRQ0AIAEgCyANKAIEQRd2QQRxIA1BBGsiCigCAEEZdkEBcSAGQRJ2QRBxIAZBFnZBwABxIA5BqgFxcnJyciISQdC5AWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIBUbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAkgB0EMQQggASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAVGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHQuwFqLQAAcyIDGzYCgAQgCiAKKAIAQYAQcjYCACANIA0oAgRBgARyNgIEIAYgA0EZdHJBgAhyIQYLIAZBgMCAgARxDQMgASALIAQoAmwgBkEJdiISQe8DcWotAABBAnRqIgkoAgAiASgCACIDayEHAn8gAyACQRB2SwRAIAEoAgQhCiAJIAFBCEEMIAMgB0siDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhByAKIApFIA4bDAELIAIgA0EQdGshAiAHQYCAAnFFBEAgASgCBCEKIAkgAUEMQQggAyAHSyIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohBSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgB0EBdCIHQYCAAkkNAAsgCkUgCiAOGwwBCyABKAIEC0UEQCAHIQEMBAsgByALIA0oAgRBGnZBBHEgDUEEayIOKAIAQRx2QQFxIAZBFXZBEHEgBkEZdkHAAHEgEkGqAXFycnJyIgpB0LkBai0AAEECdGoiCSgCACIHKAIAIgFrIQMgASACQRB2SwRAIAcoAgQhEiAJIAdBCEEMIAEgA0siFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIBIgEkUgFRsMAwsgAiABQRB0ayECIANBgIACcUUNASADIQELIAcoAgQMAQsgBygCBCESIAkgB0EMQQggASADSyIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIBJFIBIgFRsLIQMgESATIBQgAyAKQdC7AWotAABzIgMbNgKABiAOIA4oAgBBgIABcjYCACANIA0oAgRBgCByNgIEIA0gDSgChAJBBHI2AoQCIA0gDSgCjAJBAXI2AowCIA0gDSgCiAIgA0ESdHJBAnI2AogCIAYgA0EcdHJBgMAAciEGCyANIAZB////tntxNgIACyANQQRqIQYgEUEEaiEDIAxBAWoiDEHAAEcNAAsgDUEMaiEGIBFBhAZqIQMgF0E8SSFYIBdBBGohFyBYDQALDAILQQEgGXQiAUEBdiABciEOIAQoAngiByAUQQJ0akEMaiEDIAQoAoABIQYgBCgCCCEFIAQoAgQhASAEKAIAIQIgBCgCaCEJIAQoAnQhCwJAAkAgFkEIcQRAIAZBBEkNAiAURQ0BIARB5ABqIRAgBEHgAGohDSAUQQNsIRsgFEEBdCEkQQAgDmshFSAEQRxqIRIDQEEAIRgDQAJAAkACfwJAIAMiCCgCACIDBEACQCADQZCAgAFxDQAgASASIAQoAmwgA0HvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIAobDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIAobC0UNACABIBIgCCgCBEERdkEEcSAIQQRrIgwoAgBBE3ZBAXEgA0EOdkEQcSADQRB2QcAAcSADQaoBcXJycnIiE0HQuQFqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogCSAHQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBwbDAELIAcoAgQhCiAJIAdBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIBwbCyEGIAsgFSAOIAYgE0HQuwFqLQAAcyIGGzYCACAMIAwoAgBBIHI2AgAgCCAIKAIEQQhyNgIEIAMgBkETdHJBEHIhAwsCQCADQYCBgAhxDQAgASASIAQoAmwgA0EDdiIKQe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgExsLRQ0AIAEgEiAIKAIEQRR2QQRxIAhBBGsiDCgCAEEWdkEBcSADQQ92QRBxIANBE3ZBwABxIApBqgFxcnJyciITQdC5AWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAJIAdBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogHBsMAQsgBygCBCEKIAkgB0EIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgHBsLIQYgCyAUQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAwgDCgCAEGAAnI2AgAgCCAIKAIEQcAAcjYCBCADIAZBFnRyQYABciEDCwJAIANBgIiAwABxDQAgASASIAQoAmwgA0EGdiIKQe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgExsLRQ0AIAEgEiAIKAIEQRd2QQRxIAhBBGsiDCgCAEEZdkEBcSADQRJ2QRBxIANBFnZBwABxIApBqgFxcnJyciITQdC5AWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAJIAdBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogHBsMAQsgBygCBCEKIAkgB0EIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgHBsLIQYgCyAkQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAwgDCgCAEGAEHI2AgAgCCAIKAIEQYAEcjYCBCADIAZBGXRyQYAIciEDCyADQYDAgIAEcQ0DIAEgEiAEKAJsIANBCXYiCkHvA3FqLQAAQQJ0aiIJKAIAIgEoAgAiBmshBwJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgB0GAgAJxBEAgASgCBAwCCyABKAIEIQwgCSABQQxBCCAGIAdLIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEFIAYtAAEhASAGLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAHQQF0IgdBgIACSQ0ACyAMRSAMIBMbDAELIAEoAgQhDCAJIAFBCEEMIAYgB0siExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhByAMIAxFIBMbC0UEQCAHIQEMBAsgByASIAgoAgRBGnZBBHEgCEEEayIMKAIAQRx2QQFxIANBFXZBEHEgA0EZdkHAAHEgCkGqAXFycnJyIhNB0LkBai0AAEECdGoiCSgCACIKKAIAIgFrIQYgASACQRB2TQRAIAIgAUEQdGshAiAGQYCAAnEEQCAGIQEMAwsgCigCBCEHIAkgCkEMQQggASAGSyIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQEgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAdFIAcgHBsMAwsgCigCBCEHIAkgCkEIQQwgASAGSyIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQYgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgCjYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgByAHRSAcGwwCCyABIA0oAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByANIAZBDEEIIAEgA0kiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDBsMAQsgBigCBCEHIA0gBkEIQQwgASADSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAcgB0UgDBsLRQRAIA0hCQwECyABIBAoAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByAQIAZBDEEIIAEgA0kiDBtqKAIAIgY2AgADQAJAIAUNACAEKAIQIglBAWohBSAJLQABIQMgCS0AAEH/AUcEQCAEIAU2AhBBCCEFIANBCHQgAmohAgwBCyADQY8BTQRAIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAMGwwBCyAGKAIEIQcgECAGQQhBDCABIANJIgwbaigCACIGNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEBIAktAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAwbCyEMIAEgBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByAQIAZBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgChsMAQsgBigCBCEHIBAgBkEIQQwgASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAcgB0UgChsLIQZBACEDIBAhCQJAAkACQAJ/AkACQCAGIAxBAXRyDgQAAQMFCAsgASASIAgoAgRBEXZBBHEgCEEEayIHKAIAQRN2QQFxciIKQdC5AWotAABBAnRqIgkoAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhDCAJIAZBDEEIIAEgA0kiExtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBigCBCEMIAkgBkEIQQwgASADSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAwgDEUgExsLIQMgCyAVIA4gAyAKQdC7AWotAABzIgMbNgIAIAcgBygCAEEgcjYCACAIIAgoAgRBCHI2AgQgA0ETdCFZIAEgEiAEKAJsLQACQQJ0aiIHKAIAIgYoAgAiA2shAQJ/IAMgAkEQdk0EQCACIANBEHRrIQIgAUGAgAJxBEAgBigCBAwCCyAGKAIEIQkgByAGQQxBCCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEHIAYtAAEhAyAGLQAAQf8BRwRAIAQgBzYCEEEIIQUgA0EIdCACaiECDAELIANBjwFNBEAgBCAHNgIQIANBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAJRSAJIAobDAELIAYoAgQhCSAHIAZBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQcgBi0AASEBIAYtAABB/wFHBEAgBCAHNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAc2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAJIAlFIAobCyEGIFlBEHIiAyAGRQ0BGgsgASASIAgoAgRBFHZBBHEgCEEEayIJKAIAQRZ2QQFxIANBD3ZBEHEgA0ETdkHAAHEgA0EDdkGqAXFycnJyIhNB0LkBai0AAEECdGoiDCgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEKIAwgB0EMQQggASAGSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQYgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAMGwwBCyAHKAIEIQogDCAHQQhBDCABIAZJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCiAKRSAMGwshBiALIBRBAnRqIBUgDiAGIBNB0LsBai0AAHMiBhs2AgAgCSAJKAIAQYACcjYCACAIIAgoAgRBwAByNgIEIAMgBkEWdHJBgAFyCyEDIAEgEiAEKAJsIANBBnZB7wNxai0AAEECdGoiCSgCACIHKAIAIgZrIQECfyAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQRAIAcoAgQMAgsgBygCBCEMIAkgB0EMQQggASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQYgBy0AAEH/AUcEQCAEIAk2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgCTYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDEUgDCAKGwwBCyAHKAIEIQwgCSAHQQhBDCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEJIActAAEhASAHLQAAQf8BRwRAIAQgCTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgDCAMRSAKGwtFDQELIAEgEiAIKAIEQRd2QQRxIAhBBGsiCSgCAEEZdkEBcSADQRJ2QRBxIANBFnZBwABxIANBBnZBqgFxcnJyciITQdC5AWotAABBAnRqIgwoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAMIAdBDEEIIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDBsMAQsgBygCBCEKIAwgB0EIQQwgASAGSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgDBsLIQYgCyAkQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAkgCSgCAEGAEHI2AgAgCCAIKAIEQYAEcjYCBCADIAZBGXRyQYAIciEDCyABIBIgBCgCbCADQQl2Qe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgChsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgChsLRQ0DCyABIBIgCCgCBEEadkEEcSAIQQRrIgwoAgBBHHZBAXEgA0EVdkEQcSADQRl2QcAAcSADQQl2QaoBcXJycnIiE0HQuQFqLQAAQQJ0aiIJKAIAIgooAgAiBmshASAGIAJBEHZNBEAgAiAGQRB0ayECIAFBgIACcQ0BIAooAgQhByAJIApBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEGIAUtAABB/wFHBEAgBCAKNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAo2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgHBsMAgsgCigCBCEHIAkgCkEIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQEgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgHBsMAQsgCigCBAshBiALIBtBAnRqIBUgDiAGIBNB0LsBai0AAHMiBxs2AgAgDCAMKAIAQYCAAXI2AgAgCCAIKAIEQYAgcjYCBCAEKAJ8QQJ0IAhqIgYgBigCBEEEcjYCBCAGIAYoAgxBAXI2AgwgBiAGKAIIIAdBEnRyQQJyNgIIIAMgB0EcdHJBgMAAciEDCyAIIANB////tntxNgIACyAIQQRqIQMgC0EEaiELIBhBAWoiGCAURw0ACyAIQQxqIQMgCyAbQQJ0aiELIBFBBGoiESAEKAKAASIGQXxxSQ0ACwwCCwJAIAZBBEkNACAUBEAgBEHkAGohECAEQeAAaiENIBRBA2whGyAUQQF0ISRBACAOayEVIARBHGohEgNAQQAhGANAAkACQAJ/AkAgAyIIKAIAIgMEQAJAIANBkICAAXENACABIBIgBCgCbCADQe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgChsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgChsLRQ0AIAEgEiAIKAIEQRF2QQRxIAhBBGsiDCgCAEETdkEBcSADQQ52QRBxIANBEHZBwABxIANBqgFxcnJyciITQdC5AWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAJIAdBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogHBsMAQsgBygCBCEKIAkgB0EIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgHBsLIQYgCyAVIA4gBiATQdC7AWotAABzIgcbNgIAIAwgDCgCAEEgcjYCACAIIAgoAgRBCHI2AgQgCEF+IAQoAnxrQQJ0aiIGIAYoAgRBgIACcjYCBCAGIAYoAgAgB0EfdHJBgIAEcjYCACAGQQRrIgYgBigCAEGAgAhyNgIAIAMgB0ETdHJBEHIhAwsCQCADQYCBgAhxDQAgASASIAQoAmwgA0EDdiIKQe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgExsLRQ0AIAEgEiAIKAIEQRR2QQRxIAhBBGsiDCgCAEEWdkEBcSADQQ92QRBxIANBE3ZBwABxIApBqgFxcnJyciITQdC5AWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAJIAdBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogHBsMAQsgBygCBCEKIAkgB0EIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgHBsLIQYgCyAUQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAwgDCgCAEGAAnI2AgAgCCAIKAIEQcAAcjYCBCADIAZBFnRyQYABciEDCwJAIANBgIiAwABxDQAgASASIAQoAmwgA0EGdiIKQe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgExsLRQ0AIAEgEiAIKAIEQRd2QQRxIAhBBGsiDCgCAEEZdkEBcSADQRJ2QRBxIANBFnZBwABxIApBqgFxcnJyciITQdC5AWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAJIAdBDEEIIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogHBsMAQsgBygCBCEKIAkgB0EIQQwgASAGSSIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgHBsLIQYgCyAkQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAwgDCgCAEGAEHI2AgAgCCAIKAIEQYAEcjYCBCADIAZBGXRyQYAIciEDCyADQYDAgIAEcQ0DIAEgEiAEKAJsIANBCXYiCkHvA3FqLQAAQQJ0aiIJKAIAIgEoAgAiBmshBwJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgB0GAgAJxBEAgASgCBAwCCyABKAIEIQwgCSABQQxBCCAGIAdLIhMbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEFIAYtAAEhASAGLQAAQf8BRwRAIAQgBTYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiAHQQF0IgdBgIACSQ0ACyAMRSAMIBMbDAELIAEoAgQhDCAJIAFBCEEMIAYgB0siExtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhByAMIAxFIBMbC0UEQCAHIQEMBAsgByASIAgoAgRBGnZBBHEgCEEEayIMKAIAQRx2QQFxIANBFXZBEHEgA0EZdkHAAHEgCkGqAXFycnJyIhNB0LkBai0AAEECdGoiCSgCACIKKAIAIgFrIQYgASACQRB2TQRAIAIgAUEQdGshAiAGQYCAAnEEQCAGIQEMAwsgCigCBCEHIAkgCkEMQQggASAGSyIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQEgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCjYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAdFIAcgHBsMAwsgCigCBCEHIAkgCkEIQQwgASAGSyIcG2ooAgA2AgADQAJAIAUNACAEKAIQIgVBAWohCiAFLQABIQYgBS0AAEH/AUcEQCAEIAo2AhBBCCEFIAZBCHQgAmohAgwBCyAGQY8BTQRAIAQgCjYCECAGQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgByAHRSAcGwwCCyABIA0oAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByANIAZBDEEIIAEgA0kiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDBsMAQsgBigCBCEHIA0gBkEIQQwgASADSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAcgB0UgDBsLRQRAIA0hCQwECyABIBAoAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByAQIAZBDEEIIAEgA0kiDBtqKAIAIgY2AgADQAJAIAUNACAEKAIQIglBAWohBSAJLQABIQMgCS0AAEH/AUcEQCAEIAU2AhBBCCEFIANBCHQgAmohAgwBCyADQY8BTQRAIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgB0UgByAMGwwBCyAGKAIEIQcgECAGQQhBDCABIANJIgwbaigCACIGNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEBIAktAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAHIAdFIAwbCyEMIAEgBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhByAQIAZBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgChsMAQsgBigCBCEHIBAgBkEIQQwgASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAcgB0UgChsLIQZBACEDIBAhCQJAAkACQAJ/AkACQCAGIAxBAXRyDgQAAQMFCAsgASASIAgoAgRBEXZBBHEgCEEEayIHKAIAQRN2QQFxciIKQdC5AWotAABBAnRqIgkoAgAiBigCACIDayEBAn8gAyACQRB2TQRAIAIgA0EQdGshAiABQYCAAnEEQCAGKAIEDAILIAYoAgQhDCAJIAZBDEEIIAEgA0kiExtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFHBEAgBCAJNgIQQQghBSADQQh0IAJqIQIMAQsgA0GPAU0EQCAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgExsMAQsgBigCBCEMIAkgBkEIQQwgASADSSITG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohCSAGLQABIQEgBi0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAwgDEUgExsLIQMgCyAVIA4gAyAKQdC7AWotAABzIgYbNgIAIAcgBygCAEEgcjYCACAIIAgoAgRBCHI2AgQgCEF+IAQoAnxrQQJ0aiIDIAMoAgRBgIACcjYCBCADIAMoAgAgBkEfdHJBgIAEcjYCACADQQRrIgMgAygCAEGAgAhyNgIAIAZBE3QhWiABIBIgBCgCbC0AAkECdGoiBygCACIGKAIAIgNrIQECfyADIAJBEHZNBEAgAiADQRB0ayECIAFBgIACcQRAIAYoAgQMAgsgBigCBCEJIAcgBkEMQQggASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgZBAWohByAGLQABIQMgBi0AAEH/AUcEQCAEIAc2AhBBCCEFIANBCHQgAmohAgwBCyADQY8BTQRAIAQgBzYCECADQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCUUgCSAKGwwBCyAGKAIEIQkgByAGQQhBDCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEHIAYtAAEhASAGLQAAQf8BRwRAIAQgBzYCEEEIIQUgAUEIdCACaiECDAELIAFBjwFNBEAgBCAHNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgCSAJRSAKGwshBiBaQRByIgMgBkUNARoLIAEgEiAIKAIEQRR2QQRxIAhBBGsiCSgCAEEWdkEBcSADQQ92QRBxIANBE3ZBwABxIANBA3ZBqgFxcnJyciITQdC5AWotAABBAnRqIgwoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhCiAMIAdBDEEIIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEGIActAABB/wFHBEAgBCAFNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAU2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIApFIAogDBsMAQsgBygCBCEKIAwgB0EIQQwgASAGSSIMG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUcEQCAEIAU2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgDBsLIQYgCyAUQQJ0aiAVIA4gBiATQdC7AWotAABzIgYbNgIAIAkgCSgCAEGAAnI2AgAgCCAIKAIEQcAAcjYCBCADIAZBFnRyQYABcgshAyABIBIgBCgCbCADQQZ2Qe8DcWotAABBAnRqIgkoAgAiBygCACIGayEBAn8gBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnEEQCAHKAIEDAILIAcoAgQhDCAJIAdBDEEIIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQkgBy0AASEGIActAABB/wFHBEAgBCAJNgIQQQghBSAGQQh0IAJqIQIMAQsgBkGPAU0EQCAEIAk2AhAgBkEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAxFIAwgChsMAQsgBygCBCEMIAkgB0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQEgBy0AAEH/AUcEQCAEIAk2AhBBCCEFIAFBCHQgAmohAgwBCyABQY8BTQRAIAQgCTYCECABQQl0IAJqIQJBByEFDAELIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQULIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAwgDEUgChsLRQ0BCyABIBIgCCgCBEEXdkEEcSAIQQRrIgkoAgBBGXZBAXEgA0ESdkEQcSADQRZ2QcAAcSADQQZ2QaoBcXJycnIiE0HQuQFqLQAAQQJ0aiIMKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQogDCAHQQxBCCABIAZJIgwbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIAwbDAELIAcoAgQhCiAMIAdBCEEMIAEgBkkiDBtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAKIApFIAwbCyEGIAsgJEECdGogFSAOIAYgE0HQuwFqLQAAcyIGGzYCACAJIAkoAgBBgBByNgIAIAggCCgCBEGABHI2AgQgAyAGQRl0ckGACHIhAwsgASASIAQoAmwgA0EJdkHvA3FqLQAAQQJ0aiIJKAIAIgcoAgAiBmshAQJ/IAYgAkEQdk0EQCACIAZBEHRrIQIgAUGAgAJxBEAgBygCBAwCCyAHKAIEIQwgCSAHQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhBiAHLQAAQf8BRwRAIAQgBTYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAFNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAMRSAMIAobDAELIAcoAgQhDCAJIAdBCEEMIAEgBkkiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFHBEAgBCAFNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAMIAxFIAobC0UNAwsgASASIAgoAgRBGnZBBHEgCEEEayIMKAIAQRx2QQFxIANBFXZBEHEgA0EZdkHAAHEgA0EJdkGqAXFycnJyIhNB0LkBai0AAEECdGoiCSgCACIKKAIAIgZrIQEgBiACQRB2TQRAIAIgBkEQdGshAiABQYCAAnENASAKKAIEIQcgCSAKQQxBCCABIAZJIhwbaigCADYCAANAAkAgBQ0AIAQoAhAiBUEBaiEKIAUtAAEhBiAFLQAAQf8BRwRAIAQgCjYCEEEIIQUgBkEIdCACaiECDAELIAZBjwFNBEAgBCAKNgIQIAZBCXQgAmohAkEHIQUMAQsgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIBwbDAILIAooAgQhByAJIApBCEEMIAEgBkkiHBtqKAIANgIAA0ACQCAFDQAgBCgCECIFQQFqIQogBS0AASEBIAUtAABB/wFHBEAgBCAKNgIQQQghBSABQQh0IAJqIQIMAQsgAUGPAU0EQCAEIAo2AhAgAUEJdCACaiECQQchBQwBCyAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFCyAFQQFrIQUgAkEBdCECIAZBAXQiBkGAgAJJDQALIAYhASAHIAdFIBwbDAELIAooAgQLIQYgCyAbQQJ0aiAVIA4gBiATQdC7AWotAABzIgcbNgIAIAwgDCgCAEGAgAFyNgIAIAggCCgCBEGAIHI2AgQgBCgCfEECdCAIaiIGIAYoAgRBBHI2AgQgBiAGKAIMQQFyNgIMIAYgBigCCCAHQRJ0ckECcjYCCCADIAdBHHRyQYDAAHIhAwsgCCADQf///7Z7cTYCAAsgCEEEaiEDIAtBBGohCyAYQQFqIhggFEcNAAsgCEEMaiEDIAsgG0ECdGohCyARQQRqIhEgBCgCgAEiBkF8cUkNAAsMAQtBBCAGQXxxIgMgA0EETRtBAWsiA0F8cUEEaiERIAcgA0EBdEF4cWpBFGohAwsgBCAFNgIIIAQgATYCBCAEIAI2AgAgBCAJNgJoIBRFDQQgBiARTQ0EA0BBACEFIBEgBCgCgAFHBEADQCAEIAMgCyAFIBRsQQJ0aiAOIAVBABBYIAVBAWoiBSAEKAKAASARa0kNAAsLIAMgAygCAEH///+2e3E2AgAgC0EEaiELIANBBGohAyAXQQFqIhcgFEcNAAsMBAtBBCAGQXxxIgMgA0EETRtBAWsiA0F8cUEEaiERIAcgA0EBdEF4cWpBFGohAwsgBCAFNgIIIAQgATYCBCAEIAI2AgAgBCAJNgJoIBRFDQIgBiARTQ0CA0BBACEFIBEgBCgCgAFHBEADQCAEIAMgCyAFIBRsQQJ0aiAOIAVBARBYIAVBAWoiBSAEKAKAASARa0kNAAsLIAMgAygCAEH///+2e3E2AgAgC0EEaiELIANBBGohAyAXQQFqIhcgFEcNAAsMAgsDQEEAIQwDQCADIRECQAJAAn8CQAJAIAYiDSgCACIGRQRAIAEgECgCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEHIBAgA0EIQQwgASAGSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohCSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgChsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQcgECADQQxBCCABIAZJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAHRSAHIAobDAELIAMoAgQLRQRAIBAhCQwGCyABIAgoAgAiAygCACIGayEBAn8gBiACQRB2SwRAIAMoAgQhByAIIANBCEEMIAEgBkkiChtqKAIAIgM2AgADQAJAIAUNACAEKAIQIglBAWohBSAJLQABIQEgCS0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAcgB0UgChsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQcgCCADQQxBCCABIAZJIgobaigCACIDNgIAA0ACQCAFDQAgBCgCECIJQQFqIQUgCS0AASEGIAktAABB/wFGBEAgBkGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECAGQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgBkEIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgChsMAQsgAygCBAshCiABIAMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQcgCCADQQhBDCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEJIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgAUEJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgByAHRSAOGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhByAIIANBDEEIIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQkgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgCTYCECADQQl0IAJqIQJBByEFDAELIAQgCTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAdFIAcgDhsMAQsgAygCBAshA0EAIQYgCCEJAkACQAJAAn8CQAJAIAMgCkEBdHIOBAABAwUKCyABIAsgDSgCBEERdkEEcSANQQRrIgcoAgBBE3ZBAXFyIg5B0LkBai0AAEECdGoiCSgCACIDKAIAIgZrIQECfyAGIAJBEHZLBEAgAygCBCEKIAkgA0EIQQwgASAGSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgNBAWohCSADLQABIQEgAy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgBkEBdCIGQYCAAkkNAAsgBiEBIAogCkUgEhsMAQsgAiAGQRB0ayECIAFBgIACcUUEQCADKAIEIQogCSADQQxBCCABIAZJIhIbaigCADYCAANAAkAgBQ0AIAQoAhAiBkEBaiEJIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIBIbDAELIAMoAgQLIQMgESATIBQgAyAOQdC7AWotAABzIgMbNgIAIAcgBygCAEEgcjYCACANIA0oAgRBCHI2AgQgA0ETdCFbIAEgCyAEKAJsLQACQQJ0aiIHKAIAIgMoAgAiBmshAQJ/IAYgAkEQdksEQCADKAIEIQkgByADQQhBDCABIAZJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiA0EBaiEHIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAc2AhAgAUEJdCACaiECQQchBQwBCyAEIAc2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiAGQQF0IgZBgIACSQ0ACyAGIQEgCSAJRSAOGwwBCyACIAZBEHRrIQIgAUGAgAJxRQRAIAMoAgQhCSAHIANBDEEIIAEgBkkiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIGQQFqIQcgBi0AASEDIAYtAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBzYCECADQQl0IAJqIQJBByEFDAELIAQgBzYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIAlFIAkgDhsMAQsgAygCBAshAyBbQRByIgYgA0UNARoLIAEgCyANKAIEQRR2QQRxIA1BBGsiCSgCAEEWdkEBcSAGQQ92QRBxIAZBE3ZBwABxIAZBA3ZBqgFxcnJyciISQdC5AWotAABBAnRqIgooAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAKIAdBCEEMIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIAobDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAogB0EMQQggASADSSIKG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAKGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHQuwFqLQAAcyIDGzYCgAIgCSAJKAIAQYACcjYCACANIA0oAgRBwAByNgIEIAYgA0EWdHJBgAFyCyEGIAEgCyAEKAJsIAZBBnZB7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohCSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAJNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAJNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgDhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEJIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAk2AhAgA0EJdCACaiECQQchBQwBCyAEIAk2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIA4bDAELIAcoAgQLRQ0BCyABIAsgDSgCBEEXdkEEcSANQQRrIgkoAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAGQQZ2QaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIKKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCiAHQQhBDCABIANJIgobaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAKGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAKIAdBDEEIIAEgA0kiChtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gChsMAQsgBygCBAshAyARIBMgFCADIBJB0LsBai0AAHMiAxs2AoAEIAkgCSgCAEGAEHI2AgAgDSANKAIEQYAEcjYCBCAGIANBGXRyQYAIciEGCyABIAsgBCgCbCAGQQl2Qe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiDhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIA4bDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiAOGwwBCyAHKAIEC0UNBQsgASALIA0oAgRBGnZBBHEgDUEEayIOKAIAQRx2QQFxIAZBFXZBEHEgBkEZdkHAAHEgBkEJdkGqAXFycnJyIgpB0LkBai0AAEECdGoiCSgCACIHKAIAIgNrIQEgAyACQRB2SwRAIAcoAgQhEiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASASIBJFIBUbDAQLIAIgA0EQdGshAiABQYCAAnENASAHKAIEIRIgCSAHQQxBCCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyASRSASIBUbDAMLAkAgBkGQgIABcQ0AIAEgCyAEKAJsIAZB7wNxai0AAEECdGoiCSgCACIHKAIAIgNrIQECfyADIAJBEHZLBEAgBygCBCEKIAkgB0EIQQwgASADSSIOG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQEgBy0AAEH/AUYEQCABQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIAFBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSABQQh0IAJqIQILIAVBAWshBSACQQF0IQIgA0EBdCIDQYCAAkkNAAsgAyEBIAogCkUgDhsMAQsgAiADQRB0ayECIAFBgIACcUUEQCAHKAIEIQogCSAHQQxBCCABIANJIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyAKRSAKIA4bDAELIAcoAgQLRQ0AIAEgCyANKAIEQRF2QQRxIA1BBGsiCigCAEETdkEBcSAGQQ52QRBxIAZBEHZBwABxIAZBqgFxcnJyciISQdC5AWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhDiAJIAdBCEEMIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAOIA5FIBUbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEOIAkgB0EMQQggASADSSIVG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgDkUgDiAVGwwBCyAHKAIECyEDIBEgEyAUIAMgEkHQuwFqLQAAcyIDGzYCACAKIAooAgBBIHI2AgAgDSANKAIEQQhyNgIEIAYgA0ETdHJBEHIhBgsCQCAGQYCBgAhxDQAgASALIAQoAmwgBkEDdiIOQe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIBIbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiASGwwBCyAHKAIEC0UNACABIAsgDSgCBEEUdkEEcSANQQRrIgooAgBBFnZBAXEgBkEPdkEQcSAGQRN2QcAAcSAOQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAVGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gFRsMAQsgBygCBAshAyARIBMgFCADIBJB0LsBai0AAHMiAxs2AoACIAogCigCAEGAAnI2AgAgDSANKAIEQcAAcjYCBCAGIANBFnRyQYABciEGCwJAIAZBgIiAwABxDQAgASALIAQoAmwgBkEGdiIOQe8DcWotAABBAnRqIgkoAgAiBygCACIDayEBAn8gAyACQRB2SwRAIAcoAgQhCiAJIAdBCEEMIAEgA0kiEhtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASAKIApFIBIbDAELIAIgA0EQdGshAiABQYCAAnFFBEAgBygCBCEKIAkgB0EMQQggASADSSISG2ooAgA2AgADQAJAIAUNACAEKAIQIgdBAWohBSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCACQYD+A2ohAkEIIQUMAgsgBCAFNgIQIANBCXQgAmohAkEHIQUMAQsgBCAFNgIQQQghBSADQQh0IAJqIQILIAVBAWshBSACQQF0IQIgAUEBdCIBQYCAAkkNAAsgCkUgCiASGwwBCyAHKAIEC0UNACABIAsgDSgCBEEXdkEEcSANQQRrIgooAgBBGXZBAXEgBkESdkEQcSAGQRZ2QcAAcSAOQaoBcXJycnIiEkHQuQFqLQAAQQJ0aiIJKAIAIgcoAgAiA2shAQJ/IAMgAkEQdksEQCAHKAIEIQ4gCSAHQQhBDCABIANJIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQEgDiAORSAVGwwBCyACIANBEHRrIQIgAUGAgAJxRQRAIAcoAgQhDiAJIAdBDEEIIAEgA0kiFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEDIActAABB/wFGBEAgA0GQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECADQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgA0EIdCACaiECCyAFQQFrIQUgAkEBdCECIAFBAXQiAUGAgAJJDQALIA5FIA4gFRsMAQsgBygCBAshAyARIBMgFCADIBJB0LsBai0AAHMiAxs2AoAEIAogCigCAEGAEHI2AgAgDSANKAIEQYAEcjYCBCAGIANBGXRyQYAIciEGCyAGQYDAgIAEcQ0DIAEgCyAEKAJsIAZBCXYiEkHvA3FqLQAAQQJ0aiIJKAIAIgEoAgAiA2shBwJ/IAMgAkEQdksEQCABKAIEIQogCSABQQhBDCADIAdLIg4baigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhASAHLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgAUEJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIAFBCHQgAmohAgsgBUEBayEFIAJBAXQhAiADQQF0IgNBgIACSQ0ACyADIQcgCiAKRSAOGwwBCyACIANBEHRrIQIgB0GAgAJxRQRAIAEoAgQhCiAJIAFBDEEIIAMgB0siDhtqKAIANgIAA0ACQCAFDQAgBCgCECIDQQFqIQUgAy0AASEBIAMtAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIAdBAXQiB0GAgAJJDQALIApFIAogDhsMAQsgASgCBAtFBEAgByEBDAQLIAcgCyANKAIEQRp2QQRxIA1BBGsiDigCAEEcdkEBcSAGQRV2QRBxIAZBGXZBwABxIBJBqgFxcnJyciIKQdC5AWotAABBAnRqIgkoAgAiBygCACIBayEDIAEgAkEQdksEQCAHKAIEIRIgCSAHQQhBDCABIANLIhUbaigCADYCAANAAkAgBQ0AIAQoAhAiB0EBaiEFIActAAEhAyAHLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAJBgP4DaiECQQghBQwCCyAEIAU2AhAgA0EJdCACaiECQQchBQwBCyAEIAU2AhBBCCEFIANBCHQgAmohAgsgBUEBayEFIAJBAXQhAiABQQF0IgFBgIACSQ0ACyASIBJFIBUbDAMLIAIgAUEQdGshAiADQYCAAnFFDQEgAyEBCyAHKAIEDAELIAcoAgQhEiAJIAdBDEEIIAEgA0siFRtqKAIANgIAA0ACQCAFDQAgBCgCECIHQQFqIQUgBy0AASEBIActAABB/wFGBEAgAUGQAU8EQCAEIAQoAgxBAWo2AgwgAkGA/gNqIQJBCCEFDAILIAQgBTYCECABQQl0IAJqIQJBByEFDAELIAQgBTYCEEEIIQUgAUEIdCACaiECCyAFQQFrIQUgAkEBdCECIANBAXQiA0GAgAJJDQALIAMhASASRSASIBUbCyEDIBEgEyAUIAMgCkHQuwFqLQAAcyIDGzYCgAYgDiAOKAIAQYCAAXI2AgAgDSANKAIEQYAgcjYCBCANIA0oAoQCQQRyNgKEAiANIA0oAowCQQFyNgKMAiANIA0oAogCIANBEnRyQQJyNgKIAiAGIANBHHRyQYDAAHIhBgsgDSAGQf///7Z7cTYCAAsgDUEEaiEGIBFBBGohAyAMQQFqIgxBwABHDQALIA1BDGohBiARQYQGaiEDIBdBPEkhXCAXQQRqIRcgXA0ACwsgBCAFNgIIIAQgATYCBCAEIAI2AgAgBCAJNgJoCwJAIBZBIHFFDQAgBCAEQeQAajYCaCAEIAQoAgQgBCgCZCIGKAIAIgFrIgI2AgQCQCABIAQoAgAiBUEQdksEQCAEIAE2AgQgBCAGQQhBDCABIAJLG2ooAgAiBjYCZCAEKAIIIQIDQAJAIAINACAEKAIQIgdBAWohCSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQIMAgsgBCAJNgIQIANBCXQgBWohBUEHIQIMAQsgBCAJNgIQQQghAiADQQh0IAVqIQULIAQgAkEBayICNgIIIAQgBUEBdCIFNgIAIAQgAUEBdCIBNgIEIAFBgIACSQ0ACyABIQIMAQsgBCAFIAFBEHRrIgU2AgAgAkGAgAJxDQAgBCAGQQxBCCABIAJLG2ooAgAiBjYCZCAEKAIIIQEDQAJAIAENACAEKAIQIgFBAWohByABLQABIQMgAS0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQEMAgsgBCAHNgIQIANBCXQgBWohBUEHIQEMAQsgBCAHNgIQQQghASADQQh0IAVqIQULIAQgAUEBayIBNgIIIAQgBUEBdCIFNgIAIAQgAkEBdCICNgIEIAJBgIACSQ0ACwsgBCACIAYoAgAiAWsiAjYCBAJAIAEgBUEQdksEQCAEIAE2AgQgBCAGQQhBDCABIAJLG2ooAgAiBjYCZCAEKAIIIQIDQAJAIAINACAEKAIQIgdBAWohCSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQIMAgsgBCAJNgIQIANBCXQgBWohBUEHIQIMAQsgBCAJNgIQQQghAiADQQh0IAVqIQULIAQgAkEBayICNgIIIAQgBUEBdCIFNgIAIAQgAUEBdCIBNgIEIAFBgIACSQ0ACyABIQIMAQsgBCAFIAFBEHRrIgU2AgAgAkGAgAJxDQAgBCAGQQxBCCABIAJLG2ooAgAiBjYCZCAEKAIIIQEDQAJAIAENACAEKAIQIgFBAWohByABLQABIQMgAS0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQEMAgsgBCAHNgIQIANBCXQgBWohBUEHIQEMAQsgBCAHNgIQQQghASADQQh0IAVqIQULIAQgAUEBayIBNgIIIAQgBUEBdCIFNgIAIAQgAkEBdCICNgIEIAJBgIACSQ0ACwsgBCACIAYoAgAiAWsiAjYCBAJAIAEgBUEQdksEQCAEIAE2AgQgBCAGQQhBDCABIAJLG2ooAgAiBjYCZCAEKAIIIQIDQAJAIAINACAEKAIQIgdBAWohCSAHLQABIQMgBy0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQIMAgsgBCAJNgIQIANBCXQgBWohBUEHIQIMAQsgBCAJNgIQQQghAiADQQh0IAVqIQULIAQgAkEBayICNgIIIAQgBUEBdCIFNgIAIAQgAUEBdCIBNgIEIAFBgIACSQ0ACyABIQIMAQsgBCAFIAFBEHRrIgU2AgAgAkGAgAJxDQAgBCAGQQxBCCABIAJLG2ooAgAiBjYCZCAEKAIIIQEDQAJAIAENACAEKAIQIgFBAWohByABLQABIQMgAS0AAEH/AUYEQCADQZABTwRAIAQgBCgCDEEBajYCDCAFQYD+A2ohBUEIIQEMAgsgBCAHNgIQIANBCXQgBWohBUEHIQEMAQsgBCAHNgIQQQghASADQQh0IAVqIQULIAQgAUEBayIBNgIIIAQgBUEBdCIFNgIAIAQgAkEBdCICNgIEIAJBgIACSQ0ACwsgBCACIAYoAgAiAWsiAjYCBCABIAVBEHZLBEAgBCABNgIEIAQgBkEIQQwgASACSxtqKAIANgJkIAQoAgghAgNAAkAgAg0AIAQoAhAiBkEBaiEHIAYtAAEhAyAGLQAAQf8BRgRAIANBkAFPBEAgBCAEKAIMQQFqNgIMIAVBgP4DaiEFQQghAgwCCyAEIAc2AhAgA0EJdCAFaiEFQQchAgwBCyAEIAc2AhBBCCECIANBCHQgBWohBQsgBCACQQFrIgI2AgggBCAFQQF0IgU2AgAgBCABQQF0IgE2AgQgAUGAgAJJDQALDAELIAQgBSABQRB0ayIHNgIAIAJBgIACcQ0AIAQgBkEMQQggASACSxtqKAIANgJkIAQoAgghBQNAAkAgBQ0AIAQoAhAiA0EBaiEGIAMtAAEhASADLQAAQf8BRgRAIAFBkAFPBEAgBCAEKAIMQQFqNgIMIAdBgP4DaiEHQQghBQwCCyAEIAY2AhAgAUEJdCAHaiEHQQchBQwBCyAEIAY2AhBBCCEFIAFBCHQgB2ohBwsgBCAFQQFrIgU2AgggBCAHQQF0Igc2AgAgBCACQQF0IgI2AgQgAkGAgAJJDQALCwsgJw0AIAQQWiAEQbCpATYCZCAEQdCeATYCYCAEQfCeATYCHAtBACAfQQFqIgEgAUEDRiIBGyEfIBkgAWshGSAmQQFqIiYgICgCCE8NASAZQQBKDQALCyAoICpqISggBCgCGCAELwFwOwAAIClBAWoiKSAaKAIsSQ0ACwsCQCArRQ0AAkAgBCgCGCIBIAQoAhAiA0ECaksEQCAhRQ0BICMgASAEKAIUIgZrNgI4ICMgAyAGazYCNCAjIAEgA2tBAms2AjAgHUECQZDyACAjQTBqEA8MAgsgBCgCDCIBQQNJDQEgIQRAICMgATYCUCAdQQJB6TUgI0HQAGoQDwwCCyAjIAE2AkAgHUECQek1ICNBQGsQDwwBCyAjIAEgBCgCFCIGazYCKCAjIAMgBms2AiQgIyABIANrQQJrNgIgIB1BAkGQ8gAgI0EgahAPCyAaKAI8RQ0AIAQgLDYCdAsgMCgCBCEBIBooAgwhXSAaKAIIIDAoAgBrIQggMCgCECIGQQFxBEAgMigCHCA3QZgBbGoiB0GQAWsoAgAgCGogB0GYAWsoAgBrIQgLIF0gAWshAyAGQQJxBEAgMigCHCA3QZgBbGoiAUGMAWsoAgAgA2ogAUGUAWsoAgBrIQMLIBooAjwiBiECIAZFBEAgBCgCdCECCyAEKAKAASEWIAQoAnwhDQJAIC8oAqgGIgdFDQAgFkUgDUVyIQEgB0EeTARAIAENAUEAIRADQCANIBBsIQRBACEBA0AgAiABIARqQQJ0aiIRKAIAIgkgCUEfdSIFcyAFayIFIAd2BEAgEUEAIAUgLygCqAZ2IhFrIBEgCUEASBs2AgALIAFBAWoiASANRw0ACyAQQQFqIhAgFkcNAAsMAQsgAQ0AIAJBACANIBZsQQJ0EBUaCyAGBEAgDSAWbCEGIC8oAhRBAUYEQCAGRQ0FQQAhASAGQQRPBEAgBkF8cSEBQQAhBANAIAIgBEECdGoiAyAD/QACACJe/RsAQQJt/REgXv0bAUECbf0cASBe/RsCQQJt/RwCIF79GwNBAm39HAP9CwIAIARBBGoiBCABRw0ACyABIAZGDQYLA0AgAiABQQJ0aiIDIAMoAgBBAm02AgAgAUEBaiIBIAZHDQALDAULIAZFDQQgMCoCIEMAAAA/lCFmQQAhBAJAIAZBBEkEQCACIQEMAQsgAiAGQXxxIgRBAnRqIQEgZv0TIV5BACEDA0AgAiADQQJ0aiIHIF4gB/0AAgD9+gH95gH9CwIAIANBBGoiAyAERw0ACyAEIAZGDQULA0AgASBmIAEoAgCylDgCACABQQRqIQEgBEEBaiIEIAZHDQALDAQLIDYgNWshESAvKAIUQQFHDQIgFkUNAyAyKAIkIgYgAyARbCIDQQJ0aiAIQQJ0aiEJIA1BfHEiDEEBayIBQQRxIQsgNiANIDVqa0ECdCEaIAFBAnZBAWpB/v///wdxIR0gAyAIakECdCAGaiACayEKQQAhCCABQQNHIRQDQEEAIQECQCAMRQ0AIAggDWwhAyAJIAggEWxBAnRqIQZBACEHIBQEQANAIAYgAUECdGogAiABIANqQQJ0av0AAgAiXv0bAEECbf0RIF79GwFBAm39HAEgXv0bAkECbf0cAiBe/RsDQQJt/RwD/QsCACAGIAFBBHIiBEECdGogAiADIARqQQJ0av0AAgAiXv0bAEECbf0RIF79GwFBAm39HAEgXv0bAkECbf0cAiBe/RsDQQJt/RwD/QsCACABQQhqIQEgB0ECaiIHIB1HDQALCyALDQAgBiABQQJ0aiACIAEgA2pBAnRq/QACACJe/RsAQQJt/REgXv0bAUECbf0cASBe/RsCQQJt/RwCIF79GwNBAm39HAP9CwIAIAFBBGohAQsCQCABIA1PDQAgCCANbCEDIAkgCCARbEECdGohBwJAIA0gAWsiEEEESQRAIAEhBAwBCyAKIAggGmxqQRBJBEAgASEEDAELIAEgEEF8cSIFaiEEQQAhBgNAIAcgASAGaiIhQQJ0aiACIAMgIWpBAnRq/QACACJe/RsAQQJt/REgXv0bAUECbf0cASBe/RsCQQJt/RwCIF79GwNBAm39HAP9CwIAIAZBBGoiBiAFRw0ACyAFIBBGDQELIARBAWohASANIARrQQFxBEAgByAEQQJ0aiACIAMgBGpBAnRqKAIAQQJtNgIAIAEhBAsgASANRg0AA0AgByAEQQJ0aiACIAMgBGpBAnRqKAIAQQJtNgIAIAcgBEEBaiIBQQJ0aiACIAEgA2pBAnRqKAIAQQJtNgIAIARBAmoiBCANRw0ACwsgCEEBaiIIIBZHDQALDAMLICMgGTYCACAdQQJB1cEAICMQDwsgECgCAEEANgIADAELIBZFDQAgDUUNACAyKAIkIAMgEWxBAnRqIAhBAnRqIQcgDUF8cSIDQQJ0IQYgMCoCIEMAAAA/lCJm/RMhXkEAIRAgDUEESSEIA0ACQAJAIAgEQCACIQkgByEBQQAhBAwBCyAGIAdqIQEgAiAGaiEJQQAhBANAIAcgBEECdCIFaiBeIAIgBWr9AAIA/foB/eYB/QsCACAEQQRqIgQgA0cNAAsgCSECIAMiBCANRg0BCyAJIQIDQCABIGYgAigCALKUOAIAIAFBBGohASACQQRqIQIgBEEBaiIEIA1HDQALCyAHIBFBAnRqIQcgEEEBaiIQIBZHDQALCyAAEBAgI0HgAGokAAvWBAEJfyAAKAIsQQhPBEAgACgCKCEFQQghCgNAIAAoAgxBBXQhCCAAKAIAIQQgACgCJCEDAkAgACgCFCIGIAAoAhAiAU0NACAEIAhqIQcgAUEBaiECIAYgAWtBAXEEQCAHIAFBBnRqIgkgBSABIANsQQJ0aiIB/QACAP0LAgAgCSAB/QACEP0LAhAgAiEBCyACIAZGDQADQCAHIAFBBnRqIgIgBSABIANsQQJ0aiIJ/QACAP0LAgAgAiAJ/QACEP0LAhAgByABQQFqIgJBBnRqIgkgBSACIANsQQJ0aiIC/QACEP0LAhAgCSAC/QACAP0LAgAgAUECaiIBIAZHDQALCwJAIAAoAhwiBiAAKAIYIgFNDQAgBCAIa0EgaiEHIAUgACgCCCADbEECdGohCCABQQFqIQIgBiABa0EBcQRAIAcgAUEGdGoiBCAIIAEgA2xBAnRqIgH9AAIA/QsCACAEIAH9AAIQ/QsCECACIQELIAIgBkYNAANAIAcgAUEGdGoiAiAIIAEgA2xBAnRqIgT9AAIA/QsCACACIAT9AAIQ/QsCECAHIAFBAWoiAkEGdGoiBCAIIAIgA2xBAnRqIgL9AAIQ/QsCECAEIAL9AAIA/QsCACABQQJqIgEgBkcNAAsLIAAQIkEAIQEgACgCIARAA0AgBSAAKAIkIAFsQQJ0aiICIAAoAgAgAUEFdGoiA/0AAgD9CwIAIAIgA/0AAhD9CwIQIAFBAWoiASAAKAIgSQ0ACwsgBUEgaiEFIApBCGoiCiAAKAIsTQ0ACwsgACgCABAQIAAQEAv3DQElfyAAKAIsQQhPBEAgACgCJCIKQQV0IR4gCkEHbCEWIApBBmwhFyAKQQVsIRggCkEDbCEZIApBAXQhGiAAKAIoIgEgCkEcbGohHyABIApBGGxqISAgASAKQRRsaiEhIAEgCkEEdGohIiABIApBDGxqISMgASAKQQN0IiRqISUgASAKQQJ0IhtqISZBCCEcA0AgACABIAAoAiRBCBA7IAAQIgJAIAAoAiAiC0UNACAdIB5sIQggACgCACEGQQAhBAJAAkAgC0HoAkkNACAGQQxqIg4gC0EBayICQQV0IgNqIA5JDQAgBkEIaiIPIANqIA9JDQAgAyAGaiAGSQ0AIAZBBGoiECADaiAQSQ0AIAJB////P0sNACABIAggJmoiAyALQQJ0IgVqIgxJIAMgASAFaiIHSXENACABIAggJWoiAiAFaiINSSACIAdJcQ0AIAEgBSAIICNqIglqIgVJIAcgCUtxDQAgBiAHSSABIAYgC0EFdGoiEUEcayISSXENACABIBFBGGsiE0kgByAQS3ENACABIBFBFGsiFEkgByAPS3ENACAHIA5LIAEgEUEQayIHSXENACADIA1JIAIgDElxDQAgAyAFSSAJIAxJcQ0AIAMgEkkgBiAMSXENACADIBNJIAwgEEtxDQAgAyAUSSAMIA9LcQ0AIAMgB0kgDCAOS3ENACACIAVJIAkgDUlxDQAgAiASSSAGIA1JcQ0AIAIgE0kgDSAQS3ENACACIBRJIA0gD0txDQAgAiAHSSANIA5LcQ0AIAkgEkkgBSAGS3ENACAJIBNJIAUgEEtxDQAgCSAUSSAFIA9LcQ0AIAcgCUsgBSAOS3ENACALQfz///8AcSEEQQAhAwNAIAEgA0ECdGogBiADQQV0aiIC/QkCACACKgIg/SABIAJBQGsqAgD9IAIgAioCYP0gA/0LAgAgASADIApqQQJ0aiAC/QkCBCACKgIk/SABIAIqAkT9IAIgAioCZP0gA/0LAgAgASADIBpqQQJ0aiAC/QkCCCACKgIo/SABIAIqAkj9IAIgAioCaP0gA/0LAgAgASADIBlqQQJ0aiAC/QkCDCACKgIs/SABIAIqAkz9IAIgAioCbP0gA/0LAgAgA0EEaiIDIARHDQALIAQgC0YNAQsDQCABIARBAnRqIAYgBEEFdGoiAyoCADgCACABIAQgCmpBAnRqIAMqAgQ4AgAgASAEIBpqQQJ0aiADKgIIOAIAIAEgBCAZakECdGogAyoCDDgCACAEQQFqIgQgC0cNAAsLIAAoAgAhBkEAIQQCQCALQdwASQ0AIAZBHGoiDyALQQFrIgJBBXQiA2ogD0kNACAGQRhqIhAgA2ogEEkNACAGQRBqIhEgA2ogEUkNACAGQRRqIhIgA2ogEkkNACACQf///z9LDQAgCCAiaiIDIAggIWoiAiALQQJ0IgVqIgxJIAIgAyAFaiIHSXENACADIAggIGoiCSAFaiINSSAHIAlLcQ0AIAMgCCAfaiIIIAVqIgVJIAcgCEtxDQAgAyAGIAtBBXRqIg5BDGsiE0kgByARS3ENACADIA5BCGsiFEkgByASS3ENACADIA5BBGsiFUkgByAQS3ENACADIA5JIAcgD0txDQAgAiANSSAJIAxJcQ0AIAIgBUkgCCAMSXENACACIBNJIAwgEUtxDQAgAiAUSSAMIBJLcQ0AIAIgFUkgDCAQS3ENACACIA5JIAwgD0txDQAgCCANSSAFIAlLcQ0AIAkgE0kgDSARS3ENACAJIBRJIA0gEktxDQAgCSAVSSANIBBLcQ0AIAkgDkkgDSAPS3ENACAIIBNJIAUgEUtxDQAgCCAUSSAFIBJLcQ0AIAggFUkgBSAQS3ENACAIIA5JIAUgD0txDQAgC0H8////AHEhBEEAIQMDQCABIAMgG2pBAnRqIAYgA0EFdGoiAv0JAhAgAioCMP0gASACKgJQ/SACIAIqAnD9IAP9CwIAIAEgAyAYakECdGogAv0JAhQgAioCNP0gASACKgJU/SACIAIqAnT9IAP9CwIAIAEgAyAXakECdGogAv0JAhggAioCOP0gASACKgJY/SACIAIqAnj9IAP9CwIAIAEgAyAWakECdGogAv0JAhwgAioCPP0gASACKgJc/SACIAIqAnz9IAP9CwIAIANBBGoiAyAERw0ACyAEIAtGDQELA0AgASAEIBtqQQJ0aiAGIARBBXRqIgMqAhA4AgAgASAEIBhqQQJ0aiADKgIUOAIAIAEgBCAXakECdGogAyoCGDgCACABIAQgFmpBAnRqIAMqAhw4AgAgBEEBaiIEIAtHDQALCyAdQQFqIR0gASAkQQJ0aiEBIBxBCGoiHCAAKAIsTQ0ACwsgACgCABAQIAAQEAtzAQJ/IAAoAhwiAUEIaiIDIAAoAiAiAk0EQANAIAAgACgCGCABQQJ0aiAAKAIUQQgQMCADIgFBCGoiAyAAKAIgIgJNDQALCyABIAJJBEAgACAAKAIYIAFBAnRqIAAoAhQgAiABaxAwCyAAKAIAEBAgABAQC0QAIAAoAhwiASAAKAIgSQRAA0AgACAAKAIYIAAoAhQgAWxBAnRqEF0gAUEBaiIBIAAoAiBJDQALCyAAKAIAEBAgABAQC6gBAQV/IAAoAlQiAygCACEFIAMoAgQiBCAAKAIUIAAoAhwiB2siBiAEIAZJGyIGBEAgBSAHIAYQEhogAyADKAIAIAZqIgU2AgAgAyADKAIEIAZrIgQ2AgQLIAQgAiACIARLGyIEBEAgBSABIAQQEhogAyADKAIAIARqIgU2AgAgAyADKAIEIARrNgIECyAFQQA6AAAgACAAKAIsIgE2AhwgACABNgIUIAILngUCBn4EfyABIAEoAgBBB2pBeHEiAUEQajYCACAAIQsgASkDACEDIAEpAwghByMAQSBrIggkACAHQv///////z+DIQQCfiAHQjCIQv//AYMiBaciCkGB+ABrQf0PTQRAIARCBIYgA0I8iIQhAiAKQYD4AGutIQUCQCADQv//////////D4MiA0KBgICAgICAgAhaBEAgAkIBfCECDAELIANCgICAgICAgIAIUg0AIAJCAYMgAnwhAgtCACACIAJC/////////wdWIgAbIQIgAK0gBXwMAQsCQCADIASEUA0AIAVC//8BUg0AIARCBIYgA0I8iIRCgICAgICAgASEIQJC/w8MAQtC/w8gCkH+hwFLDQAaQgBBgPgAQYH4ACAFUCIBGyIAIAprIglB8ABKDQAaIAMhAiAEIARCgICAgICAwACEIAEbIgYhBAJAQYABIAlrIgFBwABxBEAgAyABQUBqrYYhBEIAIQIMAQsgAUUNACAEIAGtIgWGIAJBwAAgAWutiIQhBCACIAWGIQILIAggAjcDECAIIAQ3AxgCQCAJQcAAcQRAIAYgCUFAaq2IIQNCACEGDAELIAlFDQAgBkHAACAJa62GIAMgCa0iAoiEIQMgBiACiCEGCyAIIAM3AwAgCCAGNwMIIAgpAwhCBIYgCCkDACICQjyIhCEDAkAgACAKRyAIKQMQIAgpAxiEQgBSca0gAkL//////////w+DhCICQoGAgICAgICACFoEQCADQgF8IQMMAQsgAkKAgICAgICAgAhSDQAgA0IBgyADfCEDCyADQoCAgICAgIAIhSADIANC/////////wdWIgAbIQIgAK0LIQMgCEEgaiQAIAsgB0KAgICAgICAgIB/gyADQjSGhCAChL85AwALhhgDE38BfAN+IwBBsARrIgwkACAMQQA2AiwCQCABvSIaQgBTBEBBASERQboIIRMgAZoiAb0hGgwBCyAEQYAQcQRAQQEhEUG9CCETDAELQcAIQbsIIARBAXEiERshEyARRSEVCwJAIBpCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiARQQNqIgMgBEH//3txEBwgACATIBEQGSAAQZIJQfYKIAVBIHEiBRtB+wlB+gogBRsgASABYhtBAxAZIABBICACIAMgBEGAwABzEBwgAyACIAIgA0gbIQoMAQsgDEEQaiESAkACfwJAIAEgDEEsahBlIgEgAaAiAUQAAAAAAAAAAGIEQCAMIAwoAiwiBkEBazYCLCAFQSByIg5B4QBHDQEMAwsgBUEgciIOQeEARg0CIAwoAiwhCUEGIAMgA0EASBsMAQsgDCAGQR1rIgk2AiwgAUQAAAAAAACwQaIhAUEGIAMgA0EASBsLIQsgDEEwakGgAkEAIAlBAE4baiINIQcDQCAHAn8gAUQAAAAAAADwQWMgAUQAAAAAAAAAAGZxBEAgAasMAQtBAAsiAzYCACAHQQRqIQcgASADuKFEAAAAAGXNzUGiIgFEAAAAAAAAAABiDQALAkAgCUEATARAIAkhAyAHIQYgDSEIDAELIA0hCCAJIQMDQEEdIAMgA0EdTxshAwJAIAdBBGsiBiAISQ0AIAOtIRxCACEaA0AgBiAaQv////8PgyAGNQIAIByGfCIbQoCU69wDgCIaQoDslKMMfiAbfD4CACAGQQRrIgYgCE8NAAsgG0KAlOvcA1QNACAIQQRrIgggGj4CAAsDQCAIIAciBkkEQCAGQQRrIgcoAgBFDQELCyAMIAwoAiwgA2siAzYCLCAGIQcgA0EASg0ACwsgA0EASARAIAtBGWpBCW5BAWohDyAOQeYARiEQA0BBCUEAIANrIgMgA0EJTxshCgJAIAYgCE0EQCAIKAIARUECdCEHDAELQYCU69wDIAp2IRRBfyAKdEF/cyEWQQAhAyAIIQcDQCAHIAMgBygCACIXIAp2ajYCACAWIBdxIBRsIQMgB0EEaiIHIAZJDQALIAgoAgBFQQJ0IQcgA0UNACAGIAM2AgAgBkEEaiEGCyAMIAwoAiwgCmoiAzYCLCANIAcgCGoiCCAQGyIHIA9BAnRqIAYgBiAHa0ECdSAPShshBiADQQBIDQALC0EAIQMCQCAGIAhNDQAgDSAIa0ECdUEJbCEDQQohByAIKAIAIgpBCkkNAANAIANBAWohAyAKIAdBCmwiB08NAAsLIAsgA0EAIA5B5gBHG2sgDkHnAEYgC0EAR3FrIgcgBiANa0ECdUEJbEEJa0gEQCAMQTBqQYRgQaRiIAlBAEgbaiAHQYDIAGoiCkEJbSIPQQJ0aiEJQQohByAPQXdsIApqIgpBB0wEQANAIAdBCmwhByAKQQFqIgpBCEcNAAsLAkAgCSgCACIQIBAgB24iDyAHbCIKRiAJQQRqIhQgBkZxDQAgECAKayEQAkAgD0EBcUUEQEQAAAAAAABAQyEBIAdBgJTr3ANHDQEgCCAJTw0BIAlBBGstAABBAXFFDQELRAEAAAAAAEBDIQELRAAAAAAAAOA/RAAAAAAAAPA/RAAAAAAAAPg/IAYgFEYbRAAAAAAAAPg/IBAgB0EBdiIURhsgECAUSRshGQJAIBUNACATLQAAQS1HDQAgGZohGSABmiEBCyAJIAo2AgAgASAZoCABYQ0AIAkgByAKaiIDNgIAIANBgJTr3ANPBEADQCAJQQA2AgAgCCAJQQRrIglLBEAgCEEEayIIQQA2AgALIAkgCSgCAEEBaiIDNgIAIANB/5Pr3ANLDQALCyANIAhrQQJ1QQlsIQNBCiEHIAgoAgAiCkEKSQ0AA0AgA0EBaiEDIAogB0EKbCIHTw0ACwsgCUEEaiIHIAYgBiAHSxshBgsDQCAGIgcgCE0iCkUEQCAGQQRrIgYoAgBFDQELCwJAIA5B5wBHBEAgBEEIcSEJDAELIANBf3NBfyALQQEgCxsiBiADSiADQXtKcSIJGyAGaiELQX9BfiAJGyAFaiEFIARBCHEiCQ0AQXchBgJAIAoNACAHQQRrKAIAIg5FDQBBCiEKQQAhBiAOQQpwDQADQCAGIglBAWohBiAOIApBCmwiCnBFDQALIAlBf3MhBgsgByANa0ECdUEJbCEKIAVBX3FBxgBGBEBBACEJIAsgBiAKakEJayIGQQAgBkEAShsiBiAGIAtKGyELDAELQQAhCSALIAMgCmogBmpBCWsiBkEAIAZBAEobIgYgBiALShshCwtBfyEKIAtB/f///wdB/v///wcgCSALciIQG0oNASALIBBBAEdqQQFqIQ4CQCAFQV9xIhVBxgBGBEAgAyAOQf////8Hc0oNAyADQQAgA0EAShshBgwBCyASIAMgA0EfdSIGcyAGa60gEhAqIgZrQQFMBEADQCAGQQFrIgZBMDoAACASIAZrQQJIDQALCyAGQQJrIg8gBToAACAGQQFrQS1BKyADQQBIGzoAACASIA9rIgYgDkH/////B3NKDQILIAYgDmoiAyARQf////8Hc0oNASAAQSAgAiADIBFqIgMgBBAcIAAgEyAREBkgAEEwIAIgAyAEQYCABHMQHAJAAkACQCAVQcYARgRAIAxBEGpBCXIhBSANIAggCCANSxsiCSEIA0AgCDUCACAFECohBgJAIAggCUcEQCAGIAxBEGpNDQEDQCAGQQFrIgZBMDoAACAGIAxBEGpLDQALDAELIAUgBkcNACAGQQFrIgZBMDoAAAsgACAGIAUgBmsQGSAIQQRqIgggDU0NAAsgEARAIABBggxBARAZCyAHIAhNDQEgC0EATA0BA0AgCDUCACAFECoiBiAMQRBqSwRAA0AgBkEBayIGQTA6AAAgBiAMQRBqSw0ACwsgACAGQQkgCyALQQlOGxAZIAtBCWshBiAIQQRqIgggB08NAyALQQlKIRggBiELIBgNAAsMAgsCQCALQQBIDQAgByAIQQRqIAcgCEsbIQ0gDEEQakEJciEFIAghBwNAIAUgBzUCACAFECoiBkYEQCAGQQFrIgZBMDoAAAsCQCAHIAhHBEAgBiAMQRBqTQ0BA0AgBkEBayIGQTA6AAAgBiAMQRBqSw0ACwwBCyAAIAZBARAZIAZBAWohBiAJIAtyRQ0AIABBggxBARAZCyAAIAYgBSAGayIGIAsgBiALSBsQGSALIAZrIQsgB0EEaiIHIA1PDQEgC0EATg0ACwsgAEEwIAtBEmpBEkEAEBwgACAPIBIgD2sQGQwCCyALIQYLIABBMCAGQQlqQQlBABAcCyAAQSAgAiADIARBgMAAcxAcIAMgAiACIANIGyEKDAELIBMgBUEadEEfdUEJcWohCAJAIANBC0sNAEEMIANrIQZEAAAAAAAAMEAhGQNAIBlEAAAAAAAAMECiIRkgBkEBayIGDQALIAgtAABBLUYEQCAZIAGaIBmhoJohAQwBCyABIBmgIBmhIQELIBIgDCgCLCIHIAdBH3UiBnMgBmutIBIQKiIGRgRAIAZBAWsiBkEwOgAACyARQQJyIQsgBUEgcSENIAZBAmsiCSAFQQ9qOgAAIAZBAWtBLUErIAdBAEgbOgAAIARBCHEhBiAMQRBqIQcDQCAHIgUCfyABmUQAAAAAAADgQWMEQCABqgwBC0GAgICAeAsiB0HQxAFqLQAAIA1yOgAAIAEgB7ehRAAAAAAAADBAoiEBAkAgBUEBaiIHIAxBEGprQQFHDQACQCAGDQAgA0EASg0AIAFEAAAAAAAAAABhDQELIAVBLjoAASAFQQJqIQcLIAFEAAAAAAAAAABiDQALQX8hCkH9////ByALIBIgCWsiBmoiDWsgA0gNACAAQSAgAiANIANBAmogByAMQRBqIgdrIgUgBUECayADSBsgBSADGyIKaiIDIAQQHCAAIAggCxAZIABBMCACIAMgBEGAgARzEBwgACAHIAUQGSAAQTAgCiAFa0EAQQAQHCAAIAkgBhAZIABBICACIAMgBEGAwABzEBwgAyACIAIgA0gbIQoLIAxBsARqJAAgCgsEAEIACwQAQQALnwMBCX9B5gohAAJAA0AgAC0AACIBRQ0BIAFBPUYNASAAQQFqIgBBA3ENAAsCQAJAQYCChAggACgCACICayACckGAgYKEeHFBgIGChHhHDQADQEGAgoQIIAJBvfr06QNzIgFrIAFyQYCBgoR4cUGAgYKEeEcNASAAKAIEIQIgAEEEaiIBIQAgAkGAgoQIIAJrckGAgYKEeHFBgIGChHhGDQALDAELIAAhAQsDQCABIgAtAAAiAkUNASAAQQFqIQEgAkE9Rw0ACwsgACIBQeYKRgRAQQAPCwJAIAFB5gprIgBB5gpqLQAADQBBsM8BKAIAIgRFDQAgBCgCACIFRQ0AA0ACQAJ/IAUhAkHmCiEGQQAgACIBRQ0AGkHmCi0AACIDBH8CQANAIAMgAi0AACIHRw0BIAdFDQEgAUEBayIBRQ0BIAJBAWohAiAGLQABIQMgBkEBaiEGIAMNAAtBACEDCyADBUEACyACLQAAawtFBEAgACAFaiIBLQAAQT1GDQELIAQoAgQhBSAEQQRqIQQgBQ0BDAILCyABQQFqIQgLIAgLCQAgACgCPBANC84CAQh/IwBBIGsiAyQAIAMgACgCHCIENgIQIAAoAhQhBSADIAI2AhwgAyABNgIYIAMgBSAEayIBNgIUIAEgAmohBUECIQYgA0EQaiEBAn8DQAJAAkACQCAAKAI8IAEgBiADQQxqEAEiBAR/QZTHASAENgIAQX8FQQALRQRAIAUgAygCDCIHRg0BIAdBAE4NAgwDCyAFQX9HDQILIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhAgAgwDCyABIAcgASgCBCIISyIJQQN0aiIEIAcgCEEAIAkbayIIIAQoAgBqNgIAIAFBDEEEIAkbaiIBIAEoAgAgCGs2AgAgBSAHayEFIAYgCWshBiAEIQEMAQsLIABBADYCHCAAQgA3AxAgACAAKAIAQSByNgIAQQAgBkECRg0AGiACIAEoAgRrCyEKIANBIGokACAKC1YBAn8gACgCPCEEIwBBEGsiACQAIAQgAacgAUIgiKcgAkH/AXEgAEEIahAJIgIEf0GUxwEgAjYCAEF/BUEACyECIAApAwghASAAQRBqJABCfyABIAIbCwYAIAAQAAsGACAAEAML8n4FAnw2fwh7A34GfSMAQeDAAGsiGCQAIBhBADYCIEECIQwCQAJAIAAoAgAiB0GNlJzUAEYNACAHQf+f/Y8FRwRAAkAgB0GAgIDgAEcNACAAKAIEQeqggYECRw0AIAAoAghBjZSc1ABGDQILQc0IEABBASEMDAILQQAhDAsCf0EAQQFB4AAQEyIHRQ0AGiAHQQE2AkwCQAJAAkACQCAMDgMAAwEDCyAHQcMANgJYIAdBxAA2AlQgB0HFADYCUCAHQcYANgIQIAdBxwA2AgQgB0HIADYCHCAHQckANgIYIAdBygA2AhQgB0HLADYCACAHQcwANgJcIAdBzQA2AiwgB0HOADYCKCAHQc8ANgIkIAdB0AA2AiAgB0HRADYCDCAHQdIANgIIIAcQTSIINgIwIAgNAQwCCyAHQdMANgJYIAdB1AA2AlQgB0HVADYCUCAHQdYANgIQIAdB1wA2AgQgB0HYADYCXCAHQdkANgIsIAdB2gA2AiggB0HbADYCJCAHQdwANgIgIAdB3QA2AhwgB0HeADYCGCAHQd8ANgIUIAdB4AA2AgwgB0HhADYCCCAHQeIANgIAIAcCf0EBQYgBEBMiCARAIAgQTSIONgIAAkAgDkUNACAI/QwAAAAAAAAAAAAAAAAAAAAA/QsCbCAIQQA6AHwgCBAzIg42AgQgDkUNACAIEDMiDjYCCCAORQ0AIAgMAgsgCBBwC0EACyIINgIwIAhFDQELIAdBATYCSCAHQQE2AkAgB0EANgI8IAdCADcCNCAHQQE2AkQgBwwBCyAHEBBBAAsiCARAIAhBADYCPCAIQeMANgJICyAIBEAgCEEANgI4IAhB5AA2AkQLIAgEQCAIQQA2AjQgCEHlADYCQAsgGEEkaiIHBEAgB0EAQbjAABAVIgdBADYCuEAgB0J/NwKIQAsgAwRAIBggGCgC3EBBAXI2AtxACyAYIAE2AhwgGCAANgIYIBggADYCFEEBIQxBACEBAkAgGEEUaiIHRQ0AQQFByAAQEyIABH8CfyAAQYCAwAA2AkAgAEGAgMAAEBQiDjYCICAORQRAIAAQEEEADAELIAAgDjYCJCAAQQI2AhwgAEEDNgIYIABBBDYCFCAAQQU2AhAgAEEGNgIsIABBCDYCKCAAIAAoAkRBAnI2AkQgAAsFQQALIgBFDQAgAARAIABBADYCBCAAIAc2AgALIAc1AgghRSAABEAgACBFNwMICwJAIABFDQAgAC0AREECcUUNACAAQT82AhALIAAEQCAAQcEANgIYCyAABEAgAEHCADYCHAsgACEBCyABIQACfyAYQSRqIQECQCAIRQ0AIAFFDQAgCCgCTEUEQCAIQTRqQQFBtMkAQQAQD0EADAILIAgoAjAgASAIKAIYEQMAQQEhCwsgCwtFBEBB3AgQACAAEDQgCBA1DAELAn8gGEEgaiEBQQAhBwJAIABFDQAgCEUNACAIKAJMRQRAIAhBNGpBAUGFygBBABAPQQAMAgsgACAIKAIwIAEgCEE0aiAIKAIAEQEAIQcLIAcLRQRAQfgIEAAgABA0IAgQNSAYKAIgECEMAQsgGCgCICEBQQAhBwJAIAhFDQAgAEUNACAIKAJMRQ0AIAgoAjAgACABIAhBNGogCCgCBBEBACEHCwJAIAcEQEEAIQcCQCAIRQ0AIABFDQAgCCgCTEUNACAIKAIwIAAgCEE0aiAIKAIQEQAAIQcLIAcNAQtB/wkQACAIEDUgABA0IBgoAiAQIQwBCyAAEDQgCBA1IBgoAiAiDSgCHCIABEAgABAQIBgoAiAiDUIANwIcCyANKAIQISECQAJAIAJFBEACQCAERQ0AICFBBEcNAEEBIRlBBCEhDAMLAkACQCANKAIUIgFBA0YNACAhQQNHDQAgDSgCGCIAKAIAIAAoAgRHDQEgACgCNEEBRg0BIA1BAzYCFAwDCyAhQQJLDQAgDUECNgIUDAMLAkACQCABQQNrDgMDAQAECyMAQRBrIg4kAAJAAkACQCANKAIQQQRJDQAgDSgCGCIAKAIAIgEgACgCNEcNACABIAAoAmhHDQAgASAAKAKcAUcNACAAKAIEIgEgACgCOEcNACABIAAoAmxHDQAgASAAKAKgAUYNAQsgDkGHCDYCBCAOQbgKNgIAQejEAUHtPSAOEBYMAQsCQCAAKAIMIAAoAghsIghFBEAgACgCyAEhAQwBC0MAAIA/QX8gACgCtAF0QX9zs5UhSEMAAIA/QX8gACgCgAF0QX9zs5UhSkMAAIA/QX8gACgCTHRBf3OzlSFLQwAAgD9BfyAAKAIYdEF/c7OVIUkgACgCyAEhASAAKAKUASECIAAoAmAhCiAAKAIsIQdBACEAAkAgCEEISQ0AIAcgCiAIQQJ0IgtqIg9JIAogByALaiIXSXENACACIBdJIAcgAiALaiIJSXENACABIBdJIAcgASALaiILSXENACACIA9JIAkgCktxDQAgASAPSSAKIAtJcQ0AIAEgCUkgAiALSXENACAIQXxxIQAgSP0TIT0gSv0TIT4gS/0TIUMgSf0TIUBBACELA0AgAiALQQJ0Ig9qIhf9AAIAIUEgCiAPaiIJ/QACACFCIAcgD2oiEP0MAACAPwAAgD8AAIA/AACAPyBAIBD9AAIA/foB/eYB/eUB/QwAAH9DAAB/QwAAf0MAAH9D/eYB/QwAAIA/AACAPwAAgD8AAIA/ID0gASAPav0AAgD9+gH95gH95QEiP/3mAf34Af0LAgAgCf0MAACAPwAAgD8AAIA/AACAPyBDIEL9+gH95gH95QH9DAAAf0MAAH9DAAB/QwAAf0P95gEgP/3mAf34Af0LAgAgF/0MAACAPwAAgD8AAIA/AACAPyA+IEH9+gH95gH95QH9DAAAf0MAAH9DAAB/QwAAf0P95gEgP/3mAf34Af0LAgAgC0EEaiILIABHDQALIAAgCEYNAQsDQAJ/QwAAgD8gSSAHIABBAnQiC2oiDygCALKUk0MAAH9DlEMAAIA/IEggASALaigCALKUkyJMlCJNi0MAAABPXQRAIE2oDAELQYCAgIB4CyEXIAIgC2oiCSgCACEQIAogC2oiCygCACEMIA8gFzYCACALAn9DAACAPyBLIAyylJNDAAB/Q5QgTJQiTYtDAAAAT10EQCBNqAwBC0GAgICAeAs2AgAgCQJ/QwAAgD8gSiAQspSTQwAAf0OUIEyUIkyLQwAAAE9dBEAgTKgMAQtBgICAgHgLNgIAIABBAWoiACAIRw0ACwsgARAQIA0oAhgiAEEINgKAASAAQQg2AkwgAEEINgIYIABBADYCyAEgDUEBNgIUIA0gDSgCEEEBayIANgIQIABBBEkNAEEDIQADQCANKAIYIABBNGxqIgEgASgCZDYCMCABIAH9AAJU/QsCICABIAH9AAJE/QsCECABIAH9AAI0/QsCACAAQQFqIgAgDSgCEEkNAAsLIA5BEGokAAwDCyMAQRBrIgskAAJAAkACQCANKAIQQQNJDQAgDSgCGCIAKAIAIgEgACgCNEcNACABIAAoAmhHDQAgACgCBCIBIAAoAjhHDQAgASAAKAJsRg0BCyALQcUINgIEIAtBuAo2AgBB6MQBQZc+IAsQFgwBCwJAIAAoAgwgACgCCGwiAkUNAEF/IAAoAhgiCnRBf3MhAUEAQQEgCkEBa3QiCiAAKAKIARshD0EAIAogACgCVBshFyAAKAKUASEKIAAoAmAhByAAKAIsIQ5BACEAAkAgAkEESQ0AIA4gByACQQJ0IghqIglJIAcgCCAOaiIQSXENACAKIBBJIA4gCCAKaiIISXENACAHIAhJIAkgCktxDQAgAkF8cSEAIAH9ESE/IA/9ESFAIBf9ESFBQQAhCANAIA4gCEECdCIJaiIQID8gCSAKaiIM/QACACBA/bEB/foBIj39DGl0sz9pdLM/aXSzP2l0sz/95gEgByAJaiIJ/QACACBB/bEB/foBIj79DLNZGrizWRq4s1kauLNZGrj95gEgEP0AAgD9+gEiQ/3kAf3kAf0MAAAAPwAAAD8AAAA/AAAAP/3kAf34ASJC/QwAAAAAAAAAAAAAAAAAAAAA/bgBID8gQv05/VL9CwIAIAkgPyA9/QwZ0Da/GdA2vxnQNr8Z0Da//eYBIEP9DNUJgD/VCYA/1QmAP9UJgD/95gEgPv0MJzGwvicxsL4nMbC+JzGwvv3mAf3kAf3kAf0MAAAAPwAAAD8AAAA/AAAAP/3kAf34ASJC/QwAAAAAAAAAAAAAAAAAAAAA/bgBID8gQv05/VL9CwIAIAwgPyA9/Qy9Nwa3vTcGt703Bre9Nwa3/eYBIEP9DGb0fz9m9H8/ZvR/P2b0fz/95gEgPv0MNdLiPzXS4j810uI/NdLiP/3mAf3kAf3kAf0MAAAAPwAAAD8AAAA/AAAAP/3kAf34ASI9/QwAAAAAAAAAAAAAAAAAAAAA/bgBID8gPf05/VL9CwIAIAhBBGoiCCAARw0ACyAAIAJGDQELA0ACfyAKIABBAnQiCGoiCSgCACAPa7IiSENpdLM/lCAHIAhqIhAoAgAgF2uyIkpDs1kauJQgCCAOaiIMKAIAsiJLkpJDAAAAP5IiSYtDAAAAT10EQCBJqAwBC0GAgICAeAshCCAMIAEgCEEAIAhBAEobIAEgCEgbNgIAIBAgAQJ/IEhDGdA2v5QgS0PVCYA/lCBKQycxsL6UkpJDAAAAP5IiSYtDAAAAT10EQCBJqAwBC0GAgICAeAsiCEEAIAhBAEobIAEgCEgbNgIAIAkgAQJ/IEhDvTcGt5QgS0Nm9H8/lCBKQzXS4j+UkpJDAAAAP5IiSItDAAAAT10EQCBIqAwBC0GAgICAeAsiCEEAIAhBAEobIAEgCEgbNgIAIABBAWoiACACRw0ACwsgDUEBNgIUCyALQRBqJAAMAgsgISACIAIgIUsbISFBASEZDAELAkACQAJ/AkACQCANKAIYIgEoAgBBAUcNAAJAAkAgASgCNEEBaw4CAQACCyABKAJoQQJHDQECQCABKAIEQQFHDQAgASgCOEECRw0AIAEoAmxBAkcNAEEAIQsgDSIXKAIYIgAoAhghASAAKAKUASERIAAoAmAhCiAAKAIsIRAgACgCCCINIAAoAgwiAmxBAnQiABAYIQcgABAYIQggABAYIQ4CQAJAAkACQAJAAkAgB0UNACAIRQ0AIA5FDQBBfyABdEF/cyEJQQEgAUEBa3QhDCACIBcoAgRBAXEiAGshHiAXKAIAQQFxIRsgAEUNAyANRQ0DAn9BACAMa7K7IgVEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAshFAJ/IAVEJzEIrBxa/D+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyEaIA1BCEkhOAJ/IAVEO99PjZdu9j+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEdIDgNASAIIAdrQRBJDQEgDiAHa0EQSQ0BIAcgEGtBEEkNASAOIAhrQRBJDQEgCCAQa0EQSQ0BIA4gEGtBEEkNASAOIA1BfHEiC0ECdCICaiEBIAIgB2ohACAa/REhPiAU/REhQyAJ/REhPyAd/REhQANAIAcgD0ECdCITav0MAAAAAAAAAAAAAAAAAAAAACAQIBNq/QACACI9IED9rgEiQSA//bYBIEH9DAAAAAAAAAAAAAAAAAAAAAD9Of1S/QsCACAIIBNq/QwAAAAAAAAAAAAAAAAAAAAAID0gQ/2xASJBID/9tgEgQf0MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAIA4gE2r9DAAAAAAAAAAAAAAAAAAAAAAgPSA+/a4BIj0gP/22ASA9/QwAAAAAAAAAAAAAAAAAAAAA/Tn9Uv0LAgAgD0EEaiIPIAtHDQALIAIgEGohECACIAhqIQIgCyANRg0EDAILIAcQECAIEBAgDhAQDAQLIAchACAIIQIgDiEBCwNAIAAgECgCACIPIB1qIhMgCSAJIBNKG0EAIBNBAE4bNgIAIAIgDyAUayITIAkgCSATShtBACATQQBOGzYCACABIA8gGmoiDyAJIAkgD0obQQAgD0EAThs2AgAgAUEEaiEBIAJBBGohAiAAQQRqIQAgEEEEaiEQIAtBAWoiCyANRw0ACwwBCyAOIQEgCCECIAchAAsgDSAbayEaAkAgHkF+cSIdBH8Cf0EAIAxrsrsiBURqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyEiIBpBfnEiHEEBayE5An8gBUQnMQisHFr8P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLISMgOUF+cSE6An8gBUQ730+Nl272P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLISQgHUEBayElIDpBAmohJiANQQJ0IQ0DQCABIA1qIQ8gAiANaiETIAAgDWohCyANIBBqIRQgGwRAIAAgECgCACIVICRqIhIgCSAJIBJKG0EAIBJBAE4bNgIAIAIgFSAiayISIAkgCSASShtBACASQQBOGzYCACABIBUgI2oiFSAJIAkgFUobQQAgFUEAThs2AgAgCigCACEWIAsCfyARKAIAIAxrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIBQoAgAiFWoiEiAJIAkgEkobQQAgEkEAThs2AgAgEyAVAn8gFiAMa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIhIgCSAJIBJKG0EAIBJBAE4bNgIAIA8CfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgFWoiFSAJIAkgFUobQQAgFUEAThs2AgAgD0EEaiEPIBNBBGohEyALQQRqIQsgFEEEaiEUIAJBBGohAiAQQQRqIRAgAUEEaiEBIABBBGohAAtBACEVIBwEfwNAIAooAgAhHyAAAn8gESgCACAMa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAQKAIAIhJqIhYgCSAJIBZKG0EAIBZBAE4bNgIAIAIgEgJ/IB8gDGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIWIAkgCSAWShtBACAWQQBOGzYCACABAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIBJqIhIgCSAJIBJKG0EAIBJBAE4bNgIAIAooAgAhHyAAAn8gESgCACAMa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAQKAIEIhJqIhYgCSAJIBZKG0EAIBZBAE4bNgIEIAIgEgJ/IB8gDGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIWIAkgCSAWShtBACAWQQBOGzYCBCABAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIBJqIhIgCSAJIBJKG0EAIBJBAE4bNgIEIAooAgAhHyALAn8gESgCACAMa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAUKAIAIhJqIhYgCSAJIBZKG0EAIBZBAE4bNgIAIBMgEgJ/IB8gDGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIWIAkgCSAWShtBACAWQQBOGzYCACAPAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIBJqIhIgCSAJIBJKG0EAIBJBAE4bNgIAIAooAgAhHyALAn8gESgCACAMa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAUKAIEIhJqIhYgCSAJIBZKG0EAIBZBAE4bNgIEIBMgEgJ/IB8gDGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIWIAkgCSAWShtBACAWQQBOGzYCBCAPAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIBJqIhIgCSAJIBJKG0EAIBJBAE4bNgIEIBFBBGohESAKQQRqIQogD0EIaiEPIBNBCGohEyALQQhqIQsgFEEIaiEUIAFBCGohASACQQhqIQIgAEEIaiEAIBBBCGohECAVQQJqIhUgHEkNAAsgJgVBAAsgGkkEfyAKKAIAIRYgAAJ/IBEoAgAgDGuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCACIVaiISIAkgCSASShtBACASQQBOGzYCACACIBUCfyAWIAxrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siEiAJIAkgEkobQQAgEkEAThs2AgAgAQJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAVaiIVIAkgCSAVShtBACAVQQBOGzYCACAKKAIAIRUgCwJ/IBEoAgAgDGuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgFCgCACILaiIUIAkgCSAUShtBACAUQQBOGzYCACATIAsCfyAVIAxrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siEyAJIAkgE0obQQAgE0EAThs2AgAgDwJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyALaiILIAkgCSALShtBACALQQBOGzYCACARQQRqIREgCkEEaiEKIAJBBGohAiAQQQRqIRAgAEEEaiEAIAFBBGoFIAELIA1qIQEgAiANaiECIAAgDWohACANIBBqIRAgIEECaiIgIB1JDQALICVBfnFBAmoFQQALIB5PDQAgGwRAIAACf0EAIAxrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIBAoAgAiC2oiDSAJIAkgDUobQQAgDUEAThs2AgAgAiALAn8gBURqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4C2siDSAJIAkgDUobQQAgDUEAThs2AgAgAQJ/IAVEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyALaiILIAkgCSALShtBACALQQBOGzYCACACQQRqIQIgEEEEaiEQIAFBBGohASAAQQRqIQALIBpBfnEiIAR/ICBBAWsiC0F+cSE7AkACf0EAICBBD0kNABpBACAAIAIgC0EBdiIUQQN0QQhqIhNqIgtJIAIgACATaiINSXENABpBACABIA1JIAAgASATaiIPSXENABpBACAAIBAgE2oiE0kgDSAQS3ENABpBACAKIA1JIAAgCiAUQQJ0QQRqIh5qIhtJcQ0AGkEAIA0gEUsgACARIB5qIg1JcQ0AGkEAIAIgD0kgASALSXENABpBACACIBNJIAsgEEtxDQAaQQAgCiALSSACIBtJcQ0AGkEAIAIgDUkgCyARS3ENABpBACABIBNJIA8gEEtxDQAaQQAgCiAPSSABIBtJcQ0AGkEAIAEgDUkgDyARS3ENABogCiAUQQFqIhZB/P///wdxIhtBAnQiImohCyABIBtBA3QiHmohDSAAIB5qIQ8gCf0RIT8gDP0RIUNBACETA0AgECATQQN0IhRBGHIiHWoiIyAQIBRBEHIiHGoiJCAQIBRBCHIiFWoiJSAQIBRqIib9CQIA/VYCAAH9VgIAAv1WAgADIT0CfyARIBNBAnQiH2r9AAIAIEP9sQH9+gEiPv1fIkD9DDvfT42XbvY/O99PjZdu9j/98gEiQf0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshJyAKIB9q/QACACFCIAAgFGoiH/0MAAAAAAAAAAAAAAAAAAAAACA9An8gQf0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAn/RwBAn8gPiA+/Q0ICQoLDA0ODwABAgMAAQID/V8iQf0MO99PjZdu9j8730+Nl272P/3yASI+/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/ID79IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwDIkT9rgEiPiA//bYBID79DAAAAAAAAAAAAAAAAAAAAAD9Of1SIj79WgIAACAAIBVqIicgPv1aAgABIAAgHGoiKSA+/VoCAAIgACAdaiIqID79WgIAAwJ/IEIgQ/2xAf36ASI+/V8iQv0Marx0kxgE1j9qvHSTGATWP/3yASBA/QwMAiuHFtnmPwwCK4cW2eY//fIB/fABIkD9IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLISggAiAUaiIr/QwAAAAAAAAAAAAAAAAAAAAAID0CfyBA/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RICj9HAECfyA+/QwAAAAAAAAAAAAAAAAAAAAA/Q0ICQoLDA0ODwABAgMAAQID/V8iQP0Marx0kxgE1j9qvHSTGATWP/3yASBB/QwMAiuHFtnmPwwCK4cW2eY//fIB/fABIj79IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAMiQf2xASI+ID/9tgEgPv0MAAAAAAAAAAAAAAAAAAAAAP05/VIiPv1aAgAAIAIgFWoiKCA+/VoCAAEgAiAcaiIsID79WgIAAiACIB1qIi0gPv1aAgADAn8gQv0MJzEIrBxa/D8nMQisHFr8P/3yASI+/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEuIAEgFGoiFP0MAAAAAAAAAAAAAAAAAAAAACA9An8gPv0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAu/RwBAn8gQP0MJzEIrBxa/D8nMQisHFr8P/3yASI9/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/ID39IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwDIkD9rgEiPSA//bYBID39DAAAAAAAAAAAAAAAAAAAAAD9Of1SIj39WgIAACABIBVqIhUgPf1aAgABIAEgHGoiHCA9/VoCAAIgASAdaiIdID39WgIAAyAf/QwAAAAAAAAAAAAAAAAAAAAAICNBBGogJEEEaiAlQQRqICb9CQIE/VYCAAH9VgIAAv1WAgADIj4gRP2uASI9ID/9tgEgPf0MAAAAAAAAAAAAAAAAAAAAAP05/VIiPf1aAgQAICcgPf1aAgQBICkgPf1aAgQCICogPf1aAgQDICv9DAAAAAAAAAAAAAAAAAAAAAAgPiBB/bEBIj0gP/22ASA9/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI9/VoCBAAgKCA9/VoCBAEgLCA9/VoCBAIgLSA9/VoCBAMgFP0MAAAAAAAAAAAAAAAAAAAAACA+IED9rgEiPSA//bYBID39DAAAAAAAAAAAAAAAAAAAAAD9Of1SIj39WgIEACAVID39WgIEASAcID39WgIEAiAdID39WgIEAyATQQRqIhMgG0cNAAsgESAiaiERIBAgHmohECACIB5qIQIgFiAbRgRAIA8hACANIQEgCyEKDAILIA8hACANIQEgCyEKIBtBAXQLIQsDQCAKKAIAIRMgAAJ/IBEoAgAgDGuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCACINaiIPIAkgCSAPShtBACAPQQBOGzYCACACIA0CfyATIAxrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siDyAJIAkgD0obQQAgD0EAThs2AgAgAQJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyANaiINIAkgCSANShtBACANQQBOGzYCACAKKAIAIRMgAAJ/IBEoAgAgDGuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCBCINaiIPIAkgCSAPShtBACAPQQBOGzYCBCACIA0CfyATIAxrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siDyAJIAkgD0obQQAgD0EAThs2AgQgAQJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyANaiINIAkgCSANShtBACANQQBOGzYCBCARQQRqIREgCkEEaiEKIAFBCGohASACQQhqIQIgAEEIaiEAIBBBCGohECALQQJqIgsgIEkNAAsLIDtBAmoFQQALIBpPDQAgCigCACELIAACfyARKAIAIAxrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIBAoAgAiAGoiCiAJIAkgCkobQQAgCkEAThs2AgAgAiAAAn8gCyAMa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIgIgCSACIAlIG0EAIAJBAE4bNgIAIAECfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgAGoiACAJIAAgCUgbQQAgAEEAThs2AgALIBcoAhgoAiwQECAXKAIYIgAgBzYCLCAAKAJgEBAgFygCGCIAIAg2AmAgACgClAEQECAXKAIYIgAgDjYClAEgACAA/QACACI//QsCaCAAID/9CwI0IBdBATYCFAsMBwsgASgCBEEBRw0BIAEoAjhBAUcNASABKAJsQQFHDQEgASgCGCEAIAEoApQBIQIgASgCYCEHIAEoAiwhDCABKAIIIgogASgCDCIWbEECdCIBEBghDyABEBghFyABEBghCSAPRQ0FIBdFDQUgCUUNBSAWBEAgCiANKAIAQQFxIh9rISICf0EAQQEgAEEBa3QiFGuyuyIFRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLISdBfyAAdCE8ICJBfnEiHUEBayIKQQF2IgBBAWohIwJ/IAVEJzEIrBxa/D+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyEpIApBfnEhCiAAQQJ0IQggAEEDdCEAICNBfHEhGyA8QX9zIRECfyAFRDvfT42XbvY/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshKiAKQQJqISQgCEEEaiElIABBCGohICAbQQJ0ISYgG0EDdCEeIBtBAXQhECAR/REhPyAU/REhQyAdQQdJISggDyEKIBchACAJIQ4DQCAfBEAgCiAMKAIAIgEgKmoiCCARIAggEUgbQQAgCEEAThs2AgAgACABICdrIgggESAIIBFIG0EAIAhBAE4bNgIAIA4gASApaiIBIBEgASARSBtBACABQQBOGzYCACAOQQRqIQ4gCkEEaiEKIAxBBGohDCAAQQRqIQALAn8CfyAdRQRAIAchASAOIQsgCiEIQQAMAQtBACEZAkACQCAoDQAgCiAAICBqIgFJIAAgCiAgaiIISXENACAKIA4gIGoiC0kgCCAOS3ENACAKIAwgIGoiGkkgCCAMS3ENACAHIAhJIAogByAlaiIcSXENACACIAhJIAogAiAlaiIISXENACAAIAtJIAEgDktxDQAgACAaSSABIAxLcQ0AIAAgHEkgASAHS3ENACAAIAhJIAEgAktxDQAgDiAaSSALIAxLcQ0AIA4gHEkgByALSXENACACIAtJIAggDktxDQAgByAmaiEBIA4gHmohCyAKIB5qIQgDQCAMIBlBA3QiGkEYciIcaiIrIAwgGkEQciIVaiIsIAwgGkEIciISaiItIAwgGmoiLv0JAgD9VgIAAf1WAgAC/VYCAAMhPQJ/IAIgGUECdCIvav0AAgAgQ/2xAf36ASI+/V8iQP0MO99PjZdu9j8730+Nl272P/3yASJB/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEwIAcgL2r9AAIAIUIgCiAaaiIv/QwAAAAAAAAAAAAAAAAAAAAAID0CfyBB/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RIDD9HAECfyA+ID79DQgJCgsMDQ4PAAECAwABAgP9XyJB/Qw730+Nl272PzvfT42XbvY//fIBIj79IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAMiRP2uASI+ID/9tgEgPv0MAAAAAAAAAAAAAAAAAAAAAP05/VIiPv1aAgAAIAogEmoiMCA+/VoCAAEgCiAVaiIyID79WgIAAiAKIBxqIjMgPv1aAgADAn8gQiBD/bEB/foBIj79XyJC/QxqvHSTGATWP2q8dJMYBNY//fIBIED9DAwCK4cW2eY/DAIrhxbZ5j/98gH98AEiQP0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshMSAAIBpqIjT9DAAAAAAAAAAAAAAAAAAAAAAgPQJ/IED9IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgMf0cAQJ/ID79DAAAAAAAAAAAAAAAAAAAAAD9DQgJCgsMDQ4PAAECAwABAgP9XyJA/QxqvHSTGATWP2q8dJMYBNY//fIBIEH9DAwCK4cW2eY/DAIrhxbZ5j/98gH98AEiPv0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyA+/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAyJB/bEBIj4gP/22ASA+/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI+/VoCAAAgACASaiIxID79WgIAASAAIBVqIjUgPv1aAgACIAAgHGoiNiA+/VoCAAMCfyBC/QwnMQisHFr8PycxCKwcWvw//fIBIj79IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLITcgDiAaaiIa/QwAAAAAAAAAAAAAAAAAAAAAID0CfyA+/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RIDf9HAECfyBA/QwnMQisHFr8PycxCKwcWvw//fIBIj39IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gPf0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAMiQP2uASI9ID/9tgEgPf0MAAAAAAAAAAAAAAAAAAAAAP05/VIiPf1aAgAAIA4gEmoiEiA9/VoCAAEgDiAVaiIVID39WgIAAiAOIBxqIhwgPf1aAgADIC/9DAAAAAAAAAAAAAAAAAAAAAAgK0EEaiAsQQRqIC1BBGogLv0JAgT9VgIAAf1WAgAC/VYCAAMiPiBE/a4BIj0gP/22ASA9/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI9/VoCBAAgMCA9/VoCBAEgMiA9/VoCBAIgMyA9/VoCBAMgNP0MAAAAAAAAAAAAAAAAAAAAACA+IEH9sQEiPSA//bYBID39DAAAAAAAAAAAAAAAAAAAAAD9Of1SIj39WgIEACAxID39WgIEASA1ID39WgIEAiA2ID39WgIEAyAa/QwAAAAAAAAAAAAAAAAAAAAAID4gQP2uASI9ID/9tgEgPf0MAAAAAAAAAAAAAAAAAAAAAP05/VIiPf1aAgQAIBIgPf1aAgQBIBUgPf1aAgQCIBwgPf1aAgQDIBlBBGoiGSAbRw0ACyACICZqIQIgDCAeaiEMIAAgHmohACAQIRkgJCAbICNGDQIaDAELIAohCCAOIQsgByEBCwNAIAEoAgAhDiAIAn8gAigCACAUa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAMKAIAIgpqIgcgESAHIBFIG0EAIAdBAE4bNgIAIAAgCgJ/IA4gFGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIHIBEgByARSBtBACAHQQBOGzYCACALAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIApqIgogESAKIBFIG0EAIApBAE4bNgIAIAEoAgAhDiAIAn8gAigCACAUa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAMKAIEIgpqIgcgESAHIBFIG0EAIAdBAE4bNgIEIAAgCgJ/IA4gFGuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayIHIBEgByARSBtBACAHQQBOGzYCBCALAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIApqIgogESAKIBFIG0EAIApBAE4bNgIEIAJBBGohAiABQQRqIQEgC0EIaiELIABBCGohACAIQQhqIQggDEEIaiEMIBlBAmoiGSAdSQ0ACyAkCyAiTwRAIAEhByAIIQogCwwBCyABKAIAIQ4gCAJ/IAIoAgAgFGuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgDCgCACIKaiIHIBEgByARSBtBACAHQQBOGzYCACAAIAoCfyAOIBRrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siByARIAcgEUgbQQAgB0EAThs2AgAgCwJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAKaiIKIBEgCiARSBtBACAKQQBOGzYCACACQQRqIQIgAUEEaiEHIABBBGohACAIQQRqIQogDEEEaiEMIAtBBGoLIQ4gE0EBaiITIBZHDQALCyANKAIYKAIsEBAgDSgCGCIAIA82AiwgACgCYBAQIA0oAhgiACAXNgJgIAAoApQBEBAgDSgCGCIAIAk2ApQBIAAgAP0AAgAiP/0LAmggACA//QsCNCANQQE2AhRBACEZDAYLIAEoAmhBAUcNACABKAIEQQFHDQAgASgCOEEBRw0AIAEoAmxBAUcNACABKAIYIQIgASgClAEhCCABKAJgIQwgASgCLCEAIAEoAgwgASgCCGwiF0ECdCIBEBghByABEBghDyABEBghDgJAIAdFDQAgD0UNACAORQ0AIBdFDQRBfyACdEF/cyEZQQEgAkEBa3QhESAXQQhJDQIgDyAHa0EQSQ0CIA4gB2tBEEkNAiAHIABrQRBJDQIgByAMa0EQSQ0CIAcgCGtBEEkNAiAOIA9rQRBJDQIgDyAAa0EQSQ0CIA8gDGtBEEkNAiAPIAhrQRBJDQIgDiAAa0EQSQ0CIA4gDGtBEEkNAiAOIAhrQRBJDQIgCCAXQXxxIgpBAnQiCWohCyAJIA5qIQEgByAJaiECIBn9ESE/IBH9ESE9A0ACfyAIIBNBAnQiEGr9AAIAID39sQH9+gEiPv1fIkD9DDvfT42XbvY/O99PjZdu9j/98gEiQf0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshFCAMIBBq/QACACFCIAcgEGr9DAAAAAAAAAAAAAAAAAAAAAAgACAQav0AAgAiQwJ/IEH9IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgFP0cAQJ/ID4gPv0NCAkKCwwNDg8AAQIDAAECA/1fIj79DDvfT42XbvY/O99PjZdu9j/98gEiQf0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyBB/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cA/2uASJBID/9tgEgQf0MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAAn8gQiA9/bEB/foBIkH9XyJC/QxqvHSTGATWP2q8dJMYBNY//fIBIED9DAwCK4cW2eY/DAIrhxbZ5j/98gH98AEiQP0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshFCAPIBBq/QwAAAAAAAAAAAAAAAAAAAAAIEMCfyBA/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RIBT9HAECfyBB/QwAAAAAAAAAAAAAAAAAAAAA/Q0ICQoLDA0ODwABAgMAAQID/V8iQP0Marx0kxgE1j9qvHSTGATWP/3yASA+/QwMAiuHFtnmPwwCK4cW2eY//fIB/fABIj79IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAP9sQEiPiA//bYBID79DAAAAAAAAAAAAAAAAAAAAAD9Of1S/QsCAAJ/IEL9DCcxCKwcWvw/JzEIrBxa/D/98gEiPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshFCAOIBBq/QwAAAAAAAAAAAAAAAAAAAAAIEMCfyA+/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RIBT9HAECfyBA/QwnMQisHFr8PycxCKwcWvw//fIBIj79IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAP9rgEiPiA//bYBID79DAAAAAAAAAAAAAAAAAAAAAD9Of1S/QsCACATQQRqIhMgCkcNAAsgCiAXRg0EIAkgDGohDCAAIAlqIQAgCSAPagwDCyAHEBAgDxAQIA4QEAwFCyAYQbkDNgIEIBhBuAo2AgBB6MQBQcI+IBgQFgwECyAHIQIgDiEBIAghCyAPCyEIA0AgDCgCACETIAICfyALKAIAIBFrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIAAoAgAiCWoiECAZIBAgGUgbQQAgEEEAThs2AgAgCCAJAn8gEyARa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIhAgGSAQIBlIG0EAIBBBAE4bNgIAIAECfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgCWoiCSAZIAkgGUgbQQAgCUEAThs2AgAgAUEEaiEBIAhBBGohCCACQQRqIQIgC0EEaiELIAxBBGohDCAAQQRqIQAgCkEBaiIKIBdHDQALCyANKAIYKAIsEBAgDSgCGCIAIAc2AiwgACgCYBAQIA0oAhgiACAPNgJgIAAoApQBEBAgDSgCGCAONgKUASANQQE2AhRBACEZDAELIA8QECAXEBAgCRAQCyAYKAIgIQACQCADDQAgIUUNACAAKAIYIQ5BACETA0AgDiATQTRsaiIDKAIYIgJBCEcEQAJAIAJBB00EQCADKAIMIAMoAghsIQEgAygCLCEKIAMoAiAEQCABRQ0CQQEgAkEBa3StIUVBACEHIAFBBE8EQCABQXxxIQcgRf0SIT9BACEMA0AgCiAMQQJ0aiICIAL9AAIAIj39xwFBB/3LASI+/R0AID/9HQAiRn/9EiA+/R0BID/9HQEiR3/9HgEgPSA//Q0ICQoLDA0ODwABAgMAAQID/ccBQQf9ywEiPf0dACBGf/0SID39HQEgR3/9HgH9DQABAgMICQoLEBESExgZGhv9CwIAIAxBBGoiDCAHRw0ACyABIAdGDQMLA0AgCiAHQQJ0aiICIAI0AgBCB4YgRX8+AgAgB0EBaiIHIAFHDQALDAILIAFFDQFBfyACdEF/c60hRUEAIQcgAUEETwRAIAFBfHEhByBF/RIhP0EAIQwDQCAKIAxBAnRqIgIgAv0AAgAiPf3JAf0M/wAAAAAAAAD/AAAAAAAAAP3VASI+/R0AID/9HQAiRoD9EiA+/R0BID/9HQEiR4D9HgEgPSA//Q0ICQoLDA0ODwABAgMAAQID/ckB/Qz/AAAAAAAAAP8AAAAAAAAA/dUBIj39HQAgRoD9EiA9/R0BIEeA/R4B/Q0AAQIDCAkKCxAREhMYGRob/QsCACAMQQRqIgwgB0cNAAsgASAHRg0CCwNAIAogB0ECdGoiAiACNQIAQv8BfiBFgD4CACAHQQFqIgcgAUcNAAsMAQsgAkEIayEKIAMoAgwgAygCCGwhASADKAIsIQggAygCIARAIAFFDQFBACEHIAFBBE8EQCABQXxxIQdBACECA0AgCCACQQJ0aiILIAv9AAIAIAr9rAH9CwIAIAJBBGoiAiAHRw0ACyABIAdGDQILA0AgCCAHQQJ0aiICIAIoAgAgCnU2AgAgB0EBaiIHIAFHDQALDAELIAFFDQBBACEHIAFBBE8EQCABQXxxIQdBACECA0AgCCACQQJ0aiILIAv9AAIAIAr9rQH9CwIAIAJBBGoiAiAHRw0ACyABIAdGDQELA0AgCCAHQQJ0aiICIAIoAgAgCnY2AgAgB0EBaiIHIAFHDQALCyADQQg2AhgLIBNBAWoiEyAhRw0ACwsgACgCDCAAKAIIbCEBAkAgGUUEQCAAKAIUQQJGBEAgACgCEEEBRgRAIAAoAhgoAiwgARAODAMLIARFDQIgACgCGCIAKAIsIAAoAmAgARAIDAILIAAoAhgiACgCLCAAKAJgIAAoApQBIAEQBwwBCwJAAkACQCAhQQFrDgQAAwECAwsgACgCGCgCLCABEAYMAgsgACgCGCIAKAIsIAAoAmAgACgClAEgARAFDAELIAAoAhgiACgCLCAAKAJgIAAoApQBIAAoAsgBIAEQBAsgGCgCIBAhQQAhDAsgGEHgwABqJAAgDAsIAEEIIAAQJQurAgICfgJ/Qn8hAyAALQBEQQhxRQRAIAAgACgCICIGNgIkAkACQAJAIAAgACgCMCIFBH8DQCAGIAUgACgCACAAKAIUEQAAIgVBf0YNAiAAIAAoAiQgBWoiBjYCJCAAIAAoAjAgBWsiBTYCMCAFDQALIAAoAiAFIAYLNgIkIAFCAFUNAUIAIQMMAgsgACAAKAJEQQhyNgJEIAJBBEGB9QBBABAPIABBADYCMCAAIAAoAkRBCHI2AkRCfw8LQgAhAwNAIAEgACgCACAAKAIYEQsAIgRCf1EEQCACQQRB8vQAQQAQDyAAIAAoAkRBCHI2AkQgACAAKQM4IAN8NwM4Qn8gAyADUBsPCyADIAR8IQMgASAEfSIBQgBVDQALCyAAIAApAzggA3w3AzgLIAMLIwEBfyABIAEoAgAgASgCCCIBIACnIgIgASACSRtqNgIEQQELPAICfwF+IAEoAgAgASgCCGoiAyABKAIEIgJGBEBCfw8LIAEgAiAAp2o2AgQgAyACa6wiBCAAIAAgBFUbC5gDAgJ+An8gACgCMCIFIAGnIgZPBEAgACAFIAZrNgIwIAAgACgCJCAGajYCJCAAIAApAzggAXw3AzggAQ8LIAAtAERBBHEEQCAAQQA2AjAgACAAKAIkIAVqNgIkIAAgBa0iASAAKQM4fDcDOCABQn8gBRsPCwJAIAVFBEAMAQsgAEEANgIwIAAgACgCIDYCJCABIAWtIgN9IQELIAFCAFUEQANAIAApAwggACkDOCABIAN8fFQEQCACQQRBm/UAQQAQDyAAQQA2AjAgACAAKAIgNgIkIAAgACkDOCADfCIDNwM4IAApAwgiASADfSEEIAEgACgCACAAKAIcEQoAIQUgACgCRCECIAAgBQR/IAAgATcDOCACQXtxBSACC0EEcjYCREJ/IAQgASADURsPCyABIAAoAgAgACgCGBELACIEQn9RBEAgAkEEQZv1AEEAEA8gACAAKAJEQQRyNgJEIAAgACkDOCADfDcDOEJ/IAMgA1AbDwsgAyAEfCEDIAEgBH0iAUIAVQ0ACwsgACAAKQM4IAN8NwM4IAMLmwEBBX9BASACKAIIIgcgB0EBTRshBCACKAIEIgMgAigCAGshBgNAIAQiBUEBdCEEIAUgBmsgAUkNAAsgBSAHRwRAIAUQFCIDRQRAQX8PCyACKAIAIgQEQCADIAQgBhASGiACKAIAEBALIAIgBTYCCCACIAM2AgAgAiADIAZqIgM2AgQLIAMgACABEBIaIAIgAigCBCABajYCBCABC0YBAn8gAigCACACKAIIaiIEIAIoAgQiA0YEQEF/DwsgACADIAQgA2siACABIAAgAUkbIgAQEhogAiACKAIEIABqNgIEIAALqgIBBH8jAEEQayIEJAACQCAAKAJ0DQAgAkEBTQRAIANBAUH7wgBBABAPDAELIAEgBEEMakECEBEgBCgCDCIGQf//A3EiB0UEQCADQQFBnMMAQQAQDwwBCyACIAdBBmxBAmpJBEAgA0EBQfvCAEEAEA8MAQsgBkEGbBAUIgNFDQAgAEEIEBQiAjYCdCACRQRAIAMQEAwBCyACIAM2AgAgAiAELwEMIgI7AQQgAkUEQEEBIQUMAQtBACECA0AgAUECaiAEQQxqIgVBAhARIAMgAkEGbGoiBiAEKAIMOwEAIAFBBGogBUECEBEgBiAEKAIMOwECIAFBBmoiASAFQQIQESAGIAQoAgw7AQRBASEFIAJBAWoiAiAAKAJ0LwEESQ0ACwsgBEEQaiQAIAUL8AEBBX8jAEEQayIEJAACfyAAKAJ4IgVFBEAgA0EBQc3CAEEAEA9BAAwBCyAFKAIMBEAgA0EBQdvVAEEAEA9BAAwBCyACIAUtABIiBUECdCIGSQRAIANBAUGswgBBABAPQQAMAQtBACAGEBQiAkUNABogBQRAQQAhAwNAIAEgBEEMaiIHQQIQESACIANBAnRqIgYgBCgCDDsBACABQQJqIAdBARARIAYgBCgCDDoAAiABQQNqIAdBARARIAYgBCgCDDoAAyABQQRqIQEgA0EBaiIDIAVHDQALCyAAKAJ4IAI2AgxBAQshCCAEQRBqJAAgCAvwAwEJfyMAQRBrIgUkAAJAIAJBA0kNACAAKAJ4DQAgASAFQQxqQQIQESAFLwEMIglBgQhrQf93TQRAIAUgCTYCACADQQFBtBogBRAPDAELIAFBAmogBUEMakEBEBEgBS8BDCIIRQRAIANBAUHUF0EAEA8MAQsgCEEDaiACSw0AIAggCWxBAnQQFCIHRQ0AIAgQFCIKRQRAIAcQEAwBCyAIEBQiC0UEQCAHEBAgChAQDAELQRQQFCIGRQRAIAcQECAKEBAgCxAQDAELIAFBA2ohAyAGIAo2AgggBiALNgIEIAYgCTsBECAGIAc2AgAgBSgCDCEMIAZBADYCDCAGIAw6ABIgACAGNgJ4A0AgAyAFQQxqQQEQESAEIApqIAUtAAxB/wBxQQFqOgAAIAQgC2ogBSgCDEGAAXFBB3Y6AAAgA0EBaiEDIARBAWoiBCAIRw0ACyAJRQRAQQEhBAwBC0EAIQYDQEEAIQRBACEAA0AgAkEEIAQgCmotAABBB2pBA3YiBCAEQQRPGyIEIAMgAWtqSARAQQAhBAwDCyADIAVBDGogBBARIAcgBSgCDDYCACAHQQRqIQcgAyAEaiEDIABBAWoiAEH//wNxIgQgCEkNAAtBASEEIAZBAWoiBkH//wNxIAlJDQALCyAFQRBqJAAgBAuYAQECfyMAQRBrIgUkACAAKAIYIgRB/wFHBEAgBSAENgIAIANBAkHkEyAFEA8LAkACQCACIAAoAhRGBEAgAg0BQQEhBAwCC0EAIQQgA0EBQbvsAEEAEA8MAQtBACECA0BBASEEIAEgACgCSCACQQxsakEIakEBEBEgAUEBaiEBIAJBAWoiAiAAKAIUSQ0ACwsgBUEQaiQAIAQLjgYBBn8jAEHQAGsiBCQAAkAgAkECTQRAIANBAUGb7ABBABAPDAELIAAtAHwEQCADQQRB7tIAQQAQD0EBIQYMAQtBASEGIAEgAEEoakEBEBEgAUEBaiAAQTRqQQEQESABQQJqIABBLGpBARARIAFBA2ohBQJAAkACQAJAAkAgACgCKCIHQQFrDgIAAQILIAJBBk0EQCAEIAI2AhAgA0EBQcDxACAEQRBqEA9BACEGDAULAkAgAkEHRg0AIAAoAjBBDkYNACAEIAI2AjAgA0ECQcDxACAEQTBqEA8LIAUgAEEwakEEEBEgACgCMEEORw0DQSQQFCIFRQRAQQAhBiADQQFBszxBABAPDAULIAVBDjYCACAEQQA2AkAgBEEANgI4IARBADYCSCAEQQA2AjwgBEEANgJEIARBADYCTEGw6pACIQYgBEGw6pACNgI0IAVBgIyVogQ2AgQCfyACQQdHBEAgAkEjRgRAIAFBB2ogBEHMAGpBBBARIAFBC2ogBEHIAGpBBBARIAFBD2ogBEHEAGpBBBARIAFBE2ogBEFAa0EEEBEgAUEXaiAEQTxqQQQQESABQRtqIARBOGpBBBARIAFBH2ogBEE0akEEEBEgBUEANgIEIAQoAjQhBiAEKAI4IQIgBCgCQCEDIAQoAjwhByAEKAJEIQggBCgCTCEJIAQoAkgMAgsgBCACNgIgIANBAkHk8QAgBEEgahAPC0EAIQJBACEDQQAhB0EACyEBIAUgBzYCGCAFIAg2AhAgBSAJNgIIIAUgBjYCICAFIAI2AhwgBSADNgIUIAUgATYCDCAAQQA2AnAgACAFNgJsDAMLIAAgAkEDayIBNgJwIABBASABEBMiAzYCbCADRQ0BIAJBA0wNAkEAIQIDQCAFIARBzABqQQEQESAAKAJsIAJqIAQoAkw6AAAgBUEBaiEFIAJBAWoiAiABRw0ACwwCCyAHQQNJDQIgBCAHNgIAIANBBEHb9wAgBBAPDAILQQAhBiAAQQA2AnAMAQtBASEGIABBAToAfAsgBEHQAGokACAGC7QDAQN/IwBBIGsiBCQAAkAgACgCSARAIANBAkGNNUEAEA9BASECDAELIAJBDkcEQEEAIQIgA0EBQfrrAEEAEA8MAQsgASAAQRBqQQQQESABQQRqIABBDGpBBBARIAFBCGogAEEUakECEBEgACgCDCEFAkAgBAJ/IAAoAhAiBkUEQCAAKAIUDAELIAAoAhQiAiAFRQ0AGiACDQFBAAs2AgggBCAGNgIEIAQgBTYCACADQQFB3uoAIAQQD0EAIQIMAQsgAkGBgAFrQf//fk0EQEEAIQIgA0EBQYjqAEEAEA8MAQsgACACQQwQEyICNgJIIAJFBEBBACECIANBAUGt6gBBABAPDAELQQEhAiABQQpqIABBGGpBARARIAFBC2ogAEEcakEBEBEgACgCHCIFQQdHBEAgBCAFNgIQIANBBEGd+gAgBEEQahAPCyABQQxqIABBIGpBARARIAFBDWogAEEkakEBEBEgACgCACIBIAEtALwBQfsBcSAAKAIYQf8BRkECdHI6ALwBIAAoAgAiASAAKAIMNgLYASABIAAoAhA2AtwBIABBAToAhQELIARBIGokACACC7oEAQZ/IwBBEGsiBiQAAn8gAC0AZEECcUUEQCADQQFBkdQAQQAQD0EADAELIABBADYCaAJAAkACQCACBEADQCACQQdNBEAgA0EBQbkZQQAQDwwFCyABIAZBDGoiBUEEEBEgBigCDCEEIAFBBGogBUEEEBFBCCEHIAYoAgwhBQJAAkACQAJAIAQOAgEAAwsgAkEQSQRAQeEZIQQMBwsgAUEIaiAGQQhqQQQQESAGKAIIBEBByj8hBAwHCyABQQxqIAZBDGpBBBARIAYoAgwiBA0BQbIYIQQMBgsgA0EBQbIYQQAQDwwGC0EQIQcLIAQgB0kEQCADQQFBhcUAQQAQDwwFCyACIARJBEAgA0EBQb3EAEEAEA9BAAwGCwJAAkAgACABIAdqIAQgB2sgAwJ/AkACQAJAIAVB8di9mwZMBEAgBUHjxsGTBkYNASAFQebKkZsGRg0DIAVB8MK1mwZHDQVB4MABDAQLIAVB8tiNgwdGDQFBwMABIAVB8sihywZGDQMaIAVB8ti9mwZHDQRByMABDAMLQdDAAQwCC0HYwAEMAQtB6MABCygCBBEBAA0BQQAMBwsgACAAKAJoQf////8HcjYCaAtBASAIIAVB8sihywZGGyEIIAEgBGohASACIARrIgINAAsgCA0BCyADQQFB2cMAQQAQD0EADAMLIABBAToAhAEgACAAKAJkQQRyNgJkQQEMAgsgA0EBIARBABAPCyADQQFBng5BABAPQQALIQkgBkEQaiQAIAkL4gEBAX8gACgCZEEBRwRAIANBAUG+1ABBABAPQQAPCwJAIAJBB00EQAwBCyABIABBOGpBBBARIAFBBGogAEE8akEEEBEgAkEDcQRADAELIAAgAkEIayICQQJ2IgQ2AkACQCACRQ0AIAAgBEEEEBMiAjYCRCACRQRAIANBAUGpEEEAEA9BAA8LIAAoAkBFDQAgAUEIaiEDQQAhAgNAIAMgACgCRCACQQJ0akEEEBEgA0EEaiEDIAJBAWoiAiAAKAJASQ0ACwsgACAAKAJkQQJyNgJkQQEPCyADQQFBqi1BABAPQQALxAEBAn8gACAAKAIgIgQ2AiQCQCAAKAIwIgMEQANAIAQgAyAAKAIAIAAoAhQRAAAiA0F/Rg0CIAAgACgCJCADaiIENgIkIAAgACgCMCADayIDNgIwIAMNAAsgACgCICEECyAAQQA2AjAgACAENgIkIAEgACgCACAAKAIcEQoARQRAIAAgACgCREEIcjYCREEADwsgACABNwM4QQEPCyAAIAAoAkRBCHI2AkQgAkEEQYH1AEEAEA8gACAAKAJEQQhyNgJEQQALggEBAn8jAEEQayIEJAACfyAAKAJkBEAgA0EBQdvTAEEAEA9BAAwBCyACQQRHBEAgA0EBQc4tQQAQD0EADAELIAEgBEEMakEEEBEgBCgCDEGKjqroAEcEQCADQQFB9iVBABAPQQAMAQsgACAAKAJkQQFyNgJkQQELIQUgBEEQaiQAIAULDQAgACgCACABIAIQRQsJACAAKAIAEEoLCQAgACgCABBJCw0AIAAoAgAgASACEEwLQQEBfyACBH8gA0ECQdvLAEEAEA8gACgCACABIAIgAyAEEEZFBEAgA0EBQakvQQAQD0EADwsgACACIAMQcQVBAAsLFQAgACgCACABIAIgAyAEIAUgBhBOCw8AIAAoAgAgASACIAMQTwsTACAAKAIAIAEgAiADIAQgBRArCx0AIAAoAgAgASACIAMgBCAFIAYgByAIIAkgChAnC+oEAQd/AkAgASgCCEE1IAMQJEUNACABKAIEIgcoAgAhBSAHKAIIIQQCQCAFBEBBASEGIAVBAUcEQCAFQX5xIQoDQAJ/QQAgBkUNABpBACABIAAgAyAEKAIAEQAARQ0AGiABIAAgAyAEKAIEEQAAQQBHCyEGIARBCGohBCAJQQJqIgkgCkcNAAsLAkAgBUEBcQRAIAZFDQEgASAAIAMgBCgCABEAAEEARyEGCyAHQQA2AgAgBkUNAwwCCyAHQQA2AgBBAA8LIAdBADYCAAsgASgCCCIHKAIAIQUgBygCCCEEAkACQAJ/AkAgBQRAQQEhBiAFQQFxIQggBUEBRw0BQQAMAgsgB0EANgIADAILIAVBfnEhBUEAIQkDQAJ/QQAgBkUNABpBACABIAAgAyAEKAIAEQAARQ0AGiABIAAgAyAEKAIEEQAAQQBHCyEGIARBCGohBCAJQQJqIgkgBUcNAAsgBkULIQUgCARAIAUNAiABIAAgAyAEKAIAEQAAQQBHIQYLIAdBADYCAEEAIQggBkUNAgsgAS0AhAFFBEAgA0EBQb3WAEEAEA9BAA8LIAEtAIUBRQRAIANBAUGg1gBBABAPQQAPCyAAIAEoAgAgAiADEFAhCCACRQ0BIAIoAgAiAEUNAUEBIQQCQAJAAkACQAJAAkAgASgCMEEMaw4NAwQEBAUAAQQEBAQEAgQLQQIhBAwEC0EDIQQMAwtBBCEEDAILQQUhBAwBC0F/IQQLIAAgBDYCFCABKAJsIgNFDQEgACADNgIcIAIoAgAgASgCcDYCICABQQA2AmwgCA8LIAdBADYCAEEAIQgLIAgL5AkCCn8BfiMAQfAAayIDJABBgAghCAJ/AkBBAUGACBATIgYEQCADQdwAaiELIANB7ABqIQkDQAJAAkACQCABIANB6ABqIgRBCCACEBpBCEcNACAEIANB2ABqQQQQESAJIAtBBBARQQghBQJAAkACQAJAAkAgAygCWA4CAAEECyABKQMIIg1QBH5CAAUgDSABKQM4fQsiDUL4////D1MNASACQQFByj9BABAPDAQLIAEgA0HoAGoiBEEIIAIQGkEIRw0DIAQgA0HkAGpBBBARIAMoAmRFDQEgAkEBQco/QQAQDwwDCyADIA2nQQhqNgJYDAELIAkgA0HYAGpBBBARQRAhBQsgAygCXCIEQePkwNMGRgRAIAAoAmQiAUEEcQRAIAAgAUEIcjYCZAwCCyACQQFBrStBABAPIAYQEEEADAcLIAMoAlgiB0UEQCACQQFBshhBABAPIAYQEEEADAcLIAUgB0sEQCADIAQ2AgQgAyAHNgIAIAJBAUH65wAgAxAPDAYLAkACfwJ/AkACfwJAAkACQAJAAkAgBEHx2L2bBkwEQCAEQePGwZMGRg0CIARB5sqRmwZGDQQgBEHwwrWbBkcNAUHgwAEMBgsgBEGfwMDSBkwEQCAEQfLYvZsGRg0FQcDAASAEQfLIocsGRg0GGiAEQfDy0bMGRw0BQajAAQwICyAEQfLYjYMHRg0CIARBoMDA0gZGDQZBsMABIARB6OTA0wZGDQcaCyAAKAJkIgRBAXENCCACQQFB/A5BABAPIAYQEEEADA8LQdDAAQwDC0HYwAEMAgtB6MABDAELQcjAAQshCiADIARB/wFxNgJMIAMgBEEYdjYCQCADIARBCHZB/wFxNgJIIAMgBEEQdkH/AXE2AkQgAkECQckOIANBQGsQDyAHIAVrIgUgAC0AZEEEcQ0CGiADIAMoAlwiBEEYdjYCMCADIARB/wFxNgI8IAMgBEEQdkH/AXE2AjQgAyAEQQh2Qf8BcTYCOCACQQJB2jMgA0EwahAPIAAgACgCZEH/////B3I2AmQgASAFrSINIAIgASgCKBEIACANUQ0HIAJBAUGSHEEAEA8gBhAQQQAMCgtBoMABCyEKIAcgBWsLIQUgASkDCCINUAR+QgAFIA0gASkDOH0LIAWtUwRAIAMoAlghBCADKAJcIQAgAyABKQMIIg1QBH5CAAUgDSABKQM4fQs+AiggAyAFNgIkIAMgAEH/AXE2AiAgAyAAQRh2NgIUIAMgBDYCECADIABBCHZB/wFxNgIcIAMgAEEQdkH/AXE2AhggAkEBQc31ACADQRBqEA8MBwsgBSAITQRAIAYhBAwECyAFIQggBiAFEBciBA0DIAYQECACQQFB/w9BABAPQQAMBwsgBEECcUUEQCACQQFBwg9BABAPIAYQEEEADAcLIAAgBEH/////B3I2AmQgASAHIAVrrSINIAIgASgCKBEIACANUQ0DIAAtAGRBCHFFDQEgAkECQZIcQQAQDwsgBhAQQQEMBQsgAkEBQZIcQQAQDyAGEBBBAAwECyABIAQgBSACEBogBUcEQCACQQFBxBxBABAPIAQQEEEADAQLIAAgBCIGIAUgAiAKKAIEEQEADQALIAQQEEEADAILIAJBAUGiJUEAEA9BAAwBCyAGEBBBAAshDCADQfAAaiQAIAwL5gEBBn8gACgCCEE1IAIQJARAAkAgACgCCCIGKAIAIQMgBigCCCEFAkACQAJ/AkAgAwRAQQEhBCADQQFxIQcgA0EBRw0BQQAMAgsgBkEANgIADAILIANBfnEhAwNAAn9BACAERQ0AGkEAIAAgASACIAUoAgARAABFDQAaIAAgASACIAUoAgQRAABBAEcLIQQgBUEIaiEFIAhBAmoiCCADRw0ACyAERQshAyAHBEAgAw0CIAAgASACIAUoAgARAABBAEchBAsgBkEANgIAIARFDQILIAAoAgAaQQEPCyAGQQA2AgALC0EACwoAIAAoAgAaQQALFAAgACgCACIABEAgACABNgK4AQsLIQAgACgCACABEFMgAEEAOgB8IAAgASgCuEBBAXE2AoABCzIAIAJFBEBBAA8LIAAoAgAgASACIAMQSEUEQCADQQFBqS9BABAPQQAPCyAAIAIgAxBxC2kCAn8BfCMAQRBrIgMkACACBEADQCAAIANBCGoQRCABAn8gAysDCCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAs2AgAgAUEEaiEBIABBCGohACAEQQFqIgQgAkcNAAsLIANBEGokAAuEAQICfwF9IwBBEGsiAyQAIAIEQANAIAMgAC0AADoADyADIAAtAAE6AA4gAyAALQACOgANIAMgAC0AAzoADCABAn8gAyoCDCIFi0MAAABPXQRAIAWoDAELQYCAgIB4CzYCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0sBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQESABIAMoAgw2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMNgIAIAFBBGohASAAQQJqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSgECfyMAQRBrIgMkACACBEADQCAAIANBCGoQRCABIAMrAwi2OAIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALaAECfyMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgASADKgIMOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBBBARIAEgAygCDLM4AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtMAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMszgCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC6oIAg1/AXsjAEEQayIIJAACfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEJAkAgAkUEQCADQQFB8B9BABAPDAELIAAoAkghBkEBIQQgASAIQQhqQQEQESAIKAIIIgVBAk8EQCADQQJBxsgAQQAQDwwBCyACIAVBAWpHBEBBACEEIANBAkHwH0EAEA8MAQsCQCAGKAIQIgNFDQAgCSgC0CshBCADQQhPBEAgA0F4cSEGQQAhAgNAIARBADYCvEMgBEEANgKEOyAEQQA2AswyIARBADYClCogBEEANgLcISAEQQA2AqQZIARBADYC7BAgBEEANgK0CCAEQcDDAGohBCACQQhqIgIgBkcNAAsLIANBB3EiA0UNAEEAIQIDQCAEQQA2ArQIIARBuAhqIQQgAkEBaiICIANHDQALCyAJKALoKyICBH8gAhAQIAlBADYC6CsgCCgCCAUgBQtFBEBBASEEDAELA0AgAUEBaiIBIAhBDGpBARARAkAgCSgCgCxF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KT0ALgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFBMTSBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXIKAEV4cGVjdGVkIEVQSCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlcgoAVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyCgBVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDRCBtYXJrZXIKAENycm9yIHJlYWRpbmcgQ0JEIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNDIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXIKAHJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBmaWxlIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXIKAEVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlcgoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXAKAHRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb24KAE1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uCgBQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvbgoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uCgBJbnZhbGlkIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIG90aGVyIHRoYW4gYXJyYXkgZGVjb3JyZWxhdGlvbgoAVG9vIGxhcmdlIHZhbHVlIGZvciBOcHBtCgBOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbQoAYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW0KAAkgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JWxsaQoJIE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lbGxpCgBNYXJrZXIgc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBUaWxlIHBhcnQgbGVuZ3RoIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmcKAFdyb25nIGZsYWcKAEVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemUKAEVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplCgBJbnZhbGlkIHByZWNpbmN0IHNpemUKAEluY29uc2lzdGVudCBtYXJrZXIgc2l6ZQoASW52YWxpZCBtYXJrZXIgc2l6ZQoARXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZQoATm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUKAEZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aCBpbmRpeCBzaHVmZmxlCgBDYW5ub3QgYWxsb2NhdGUgVGllciAxIGhhbmRsZQoATm8gZGVjb2RlZCBhcmVhIHBhcmFtZXRlcnMsIHNldCB0aGUgZGVjb2RlZCBhcmVhIHRvIHRoZSB3aG9sZSBpbWFnZQoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgdHJhbnNmb3JtYXRpb24gZm91bmQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudC4gVW5zdXBwb3J0ZWQgTWl4ZWQgSFQgY29kZS1ibG9jayBzdHlsZSBmb3VuZAoAVGlsZSBZIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBUaWxlIFggY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAEltYWdlIGNvb3JkaW5hdGVzIGFib3ZlIElOVF9NQVggYXJlIG5vdCBzdXBwb3J0ZWQKAEpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWQKAG9wal9qMmtfbWVyZ2VfcHB0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGV0aXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAE9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAAABQAADAUAAAAUgAAAAAAAAQUAAAsFAAAAFIAAABAAAAIFAAAMBQAAABOAAAAAAAADBQAACwUAAAATgAAAEAAABAUAAAwFAAAAEwAAAAAAAAUFAAABBRAAABMAAAAQAAAGBQAAAgUQAAASQAAAAAAABwUAAAMFEAAAEkAAABAAAAgFAAAEBRAAABHAAAAAAAAJBQAABwUQAAARwAAAEAAACgUAAAgFEAAAEWAAAAAAAAkFIAAJBRAAABFgAAAQAAAKBSAACgUQAAAVYAAAAAAADQUAAAwFAAAAFWAAABAAAA4FAAALBQAAABVAAAAAAAAPBQAACwUAAAAVQAAAEAAAAAUQAAwFAAAAFRAAAAAAAAEFEAANBQAAABUQAAAQAAACBRAADgUAAAAUgAAAAAAAAwUQAA8FAAAAFIAAABAAAAQFEAAABRAAABOAAAAAAAAFBRAAAQUQAAATgAAAEAAABgUQAAIFEAAAE0AAAAAAAAcFEAADBRAAABNAAAAQAAAIBRAABAUQAAATAAAAAAAACQUQAAUFEAAAEwAAABAAAAoFEAAGBRAAABKAAAAAAAALBRAABQUQAAASgAAAEAAADAUQAAYFEAAAEkAAAAAAAA0FEAAHBRAAABJAAAAQAAAOBRAACAUQAAASIAAAAAAADwUQAAkFEAAAEiAAABAAAAAFIAAKBRAAABHAAAAAAAABBSAACwUQAAARwAAAEAAAAgUgAAwFEAAAEYAAAAAAAAMFIAANBRAAABGAAAAQAAAEBSAADgUQAAARYAAAAAAABQUgAA8FEAAAEWAAABAAAAYFIAAABSAAABFAAAAAAAAHBSAAAQUgAAARQAAAEAAACAUgAAIFIAAAESAAAAAAAAkFIAADBSAAABEgAAAQAAAKBSAABAUgAAAREAAAAAAACwUgAAUFIAAAERAAABAAAAwFIAAGBSAADBCgAAAAAAANBSAABwUgAAwQoAAAEAAADgUgAAgFIAAMEJAAAAAAAA8FIAAJBSAADBCQAAAQAAAABTAACgUgAAoQgAAAAAAAAQUwAAsFIAAKEIAAABAAAAIFMAAMBSAAAhBQAAAAAAADBTAADQUgAAIQUAAAEAAABAUwAA4FIAAEEEAAAAAAAAUFMAAPBSAABBBAAAAQAAAGBTAAAAUwAAoQIAAAAAAABwUwAAEFMAAKECAAABAAAAgFMAACBTAAAhAgAAAAAAAJBTAAAwUwAAIQIAAAEAAACgUwAAQFMAAEEBAAAAAAAAsFMAAFBTAABBAQAAAQAAAMBTAABgUwAAEQEAAAAAAADQUwAAcFMAABEBAAABAAAA4FMAAIBTAACFAAAAAAAAAPBTAACQUwAAhQAAAAEAAAAAVAAAoFMAAEkAAAAAAAAAEFQAALBTAABJAAAAAQAAACBUAADAUwAAJQAAAAAAAAAwVAAA0FMAACUAAAABAAAAQFQAAOBTAAAVAAAAAAAAAFBUAADwUwAAFQAAAAEAAABgVAAAAFQAAAkAAAAAAAAAcFQAABBUAAAJAAAAAQAAAIBUAAAgVAAABQAAAAAAAACQVAAAMFQAAAUAAAABAAAAoFQAAEBUAAABAAAAAAAAAJBUAABQVAAAAQAAAAEAAACgVAAAYFQAAAFWAAAAAAAAsFQAALBUAAABVgAAAQAAAMBUAADAVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHZuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZm8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB2bwBCwcBAAEAAQABAEHpvAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGIvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGAwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHAwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAPhiAEGAwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHRwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBi8IBCwEMAEGXwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABBxcIBCwEQAEHRwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABB/8IBCwESAEGLwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBwsMBCw4aAAAAGhoaAAAAAAAACQBB88MBCwEUAEH/wwELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBrcQBCwEWAEG5xAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB4MQBCwmQbAEAAAAAAAUAQfTEAQsBaQBBjMUBCwpqAAAAawAAAHhoAEGkxQELAQIAQbTFAQsI//////////8AQfjFAQsBBQBBhMYBCwFsAEGcxgELDmoAAABtAAAAiGgAAAAEAEG0xgELAQEAQcTGAQsF/////wo="; return f; } var wasmBinaryFile; @@ -7744,16 +12532,16 @@ var OpenJPEG = (() => { } function getWasmImports() { return { - "a": wasmImports + a: wasmImports }; } function createWasm() { var info = getWasmImports(); function receiveInstance(instance, module) { wasmExports = instance.exports; - wasmMemory = wasmExports["i"]; + wasmMemory = wasmExports["p"]; updateMemoryViews(); - addOnInit(wasmExports["j"]); + addOnInit(wasmExports["q"]); removeRunDependency("wasm-instantiate"); return wasmExports; } @@ -7777,6 +12565,43 @@ var OpenJPEG = (() => { }; var noExitRuntime = Module["noExitRuntime"] || true; var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + imageData.set(compG); + } + function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[3 * i] = compR[i]; + imageData[3 * i + 1] = compG[i]; + imageData[3 * i + 2] = compB[i]; + } + } + function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = compA[i]; + } + } var getHeapMax = () => 2147483648; var growMemory = size => { var b = wasmMemory.buffer; @@ -7812,13 +12637,13 @@ var OpenJPEG = (() => { if (!getEnvStrings.strings) { var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; var env = { - "USER": "web_user", - "LOGNAME": "web_user", - "PATH": "/", - "PWD": "/", - "HOME": "/home/web_user", - "LANG": lang, - "_": getExecutableName() + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName() }; for (var x in ENV) { if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; @@ -7855,6 +12680,12 @@ var OpenJPEG = (() => { HEAPU32[penviron_buf_size >> 2] = bufSize; return 0; }; + var _fd_close = fd => 52; + var convertI32PairToI53Checked = (lo, hi) => hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN; + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + return 70; + } var printCharBuffers = [null, [], []]; var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { @@ -7915,12 +12746,44 @@ var OpenJPEG = (() => { HEAPU32[pnum >> 2] = num; return 0; }; + function _gray_to_rgba(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = 255; + } + } + function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { + compG_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = compA[i]; + } + } function _jsPrintWarning(message_ptr) { const message = UTF8ToString(message_ptr); (Module.warn || console.warn)(`OpenJPEG: ${message}`); } - function _setImageData(array_ptr, array_size) { - Module.imageData = new Uint8ClampedArray(Module.HEAPU8.subarray(array_ptr, array_ptr + array_size)); + function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = 255; + } } function _storeErrorMessage(message_ptr) { const message = UTF8ToString(message_ptr); @@ -7931,23 +12794,27 @@ var OpenJPEG = (() => { } } var wasmImports = { - f: __emscripten_memcpy_js, - b: _emscripten_resize_heap, - c: _environ_get, - d: _environ_sizes_get, - e: _fd_write, - g: _jsPrintWarning, - h: _setImageData, + c: __emscripten_memcpy_js, + g: _copy_pixels_1, + f: _copy_pixels_3, + e: _copy_pixels_4, + k: _emscripten_resize_heap, + l: _environ_get, + m: _environ_sizes_get, + n: _fd_close, + j: _fd_seek, + b: _fd_write, + o: _gray_to_rgba, + i: _graya_to_rgba, + d: _jsPrintWarning, + h: _rgb_to_rgba, a: _storeErrorMessage }; var wasmExports = createWasm(); - var ___wasm_call_ctors = wasmExports["j"]; - var _malloc = Module["_malloc"] = wasmExports["k"]; - var _free = Module["_free"] = wasmExports["l"]; - var _jp2_decode = Module["_jp2_decode"] = wasmExports["n"]; - var __emscripten_stack_restore = wasmExports["_emscripten_stack_restore"]; - var __emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"]; - var _emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"]; + var ___wasm_call_ctors = wasmExports["q"]; + var _malloc = Module["_malloc"] = wasmExports["r"]; + var _free = Module["_free"] = wasmExports["s"]; + var _jp2_decode = Module["_jp2_decode"] = wasmExports["u"]; var calledRun; dependenciesFulfilled = function runCaller() { if (!calledRun) run(); @@ -7999,6 +12866,9 @@ var OpenJPEG = (() => { + + + class JpxError extends BaseException { constructor(msg) { super(msg, "JpxError"); @@ -8006,11 +12876,12 @@ class JpxError extends BaseException { } class JpxImage { static #module = null; - static decode(data, ignoreColorSpace = false) { + static decode(data, decoderOptions) { + decoderOptions ||= {}; this.#module ||= openjpeg({ warn: warn }); - const imageData = this.#module.decode(data, ignoreColorSpace); + const imageData = this.#module.decode(data, decoderOptions); if (typeof imageData === "string") { throw new JpxError(imageData); } @@ -8061,18 +12932,32 @@ class JpxStream extends DecodeStream { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } ensureBuffer(requested) {} - readBlock(ignoreColorSpace) { + readBlock(decoderOptions) { + this.decodeImage(null, decoderOptions); + } + decodeImage(bytes, decoderOptions) { if (this.eof) { - return; + return this.buffer; } - this.buffer = JpxImage.decode(this.bytes, ignoreColorSpace); + bytes ||= this.bytes; + this.buffer = JpxImage.decode(bytes, decoderOptions); this.bufferLength = this.buffer.length; this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; } } ;// CONCATENATED MODULE: ./src/core/lzw_stream.js + + + + + + class LZWStream extends DecodeStream { constructor(str, maybeLength, earlyChange) { super(maybeLength); @@ -8192,6 +13077,12 @@ class LZWStream extends DecodeStream { + + + + + + class PredictorStream extends DecodeStream { constructor(str, maybeLength, params) { super(maybeLength); @@ -8424,6 +13315,15 @@ class RunLengthStream extends DecodeStream { + + + + + + + + + @@ -9493,6 +14393,9 @@ class Linearization { + + + const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; const MAX_MAP_RANGE = 2 ** 24 - 1; class CMap { @@ -9933,6 +14836,8 @@ class CMapFactory { } } +// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.to-array.js +var esnext_iterator_to_array = __webpack_require__(1795); ;// CONCATENATED MODULE: ./src/core/charsets.js const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; @@ -9971,6 +14876,13 @@ function getEncoding(encodingName) { + + + + + + + const MAX_SUBR_NESTING = 10; const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; const NUM_STANDARD_CFF_STRINGS = 391; @@ -16084,6 +20996,8 @@ function clearUnicodeCaches() { + + const SEAC_ANALYSIS_ENABLED = true; const FontFlags = { FixedPitch: 1, @@ -16162,6 +21076,41 @@ function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { function normalizeFontName(name) { return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); } +const getVerticalPresentationForm = getLookupTableFactory(t => { + t[0x2013] = 0xfe32; + t[0x2014] = 0xfe31; + t[0x2025] = 0xfe30; + t[0x2026] = 0xfe19; + t[0x3001] = 0xfe11; + t[0x3002] = 0xfe12; + t[0x3008] = 0xfe3f; + t[0x3009] = 0xfe40; + t[0x300a] = 0xfe3d; + t[0x300b] = 0xfe3e; + t[0x300c] = 0xfe41; + t[0x300d] = 0xfe42; + t[0x300e] = 0xfe43; + t[0x300f] = 0xfe44; + t[0x3010] = 0xfe3b; + t[0x3011] = 0xfe3c; + t[0x3014] = 0xfe39; + t[0x3015] = 0xfe3a; + t[0x3016] = 0xfe17; + t[0x3017] = 0xfe18; + t[0xfe4f] = 0xfe34; + t[0xff01] = 0xfe15; + t[0xff08] = 0xfe35; + t[0xff09] = 0xfe36; + t[0xff0c] = 0xfe10; + t[0xff1a] = 0xfe13; + t[0xff1b] = 0xfe14; + t[0xff1f] = 0xfe16; + t[0xff3b] = 0xfe47; + t[0xff3d] = 0xfe48; + t[0xff3f] = 0xfe33; + t[0xff5b] = 0xfe37; + t[0xff5d] = 0xfe38; +}); ;// CONCATENATED MODULE: ./src/core/standard_fonts.js @@ -17191,6 +22140,15 @@ class CFFFont { + + + + + + + + + function getUint32(data, offset) { return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; } @@ -20996,6 +25954,16 @@ const getFontBasicMetrics = getLookupTableFactory(function (t) { }); ;// CONCATENATED MODULE: ./src/core/glyf.js + + + + + + + + + + const ON_CURVE_POINT = 1 << 0; const X_SHORT_VECTOR = 1 << 1; const Y_SHORT_VECTOR = 1 << 2; @@ -21529,6 +26497,13 @@ class CompositeGlyph { ;// CONCATENATED MODULE: ./src/core/opentype_file_builder.js + + + + + + + function writeInt16(dest, offset, num) { dest[offset] = num >> 8 & 0xff; dest[offset + 1] = num & 0xff; @@ -21637,6 +26612,13 @@ class OpenTypeFileBuilder { + + + + + + + const HINTING_ENABLED = false; const COMMAND_MAP = { hstem: [1], @@ -22204,6 +27186,7 @@ class Type1Parser { + function findBlock(streamBytes, signature, startIndex) { const streamBytesLength = streamBytes.length; const signatureLength = signature.length; @@ -22489,6 +27472,25 @@ class Type1Font { + + + + + + + + + + + + + + + + + + + const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; @@ -22997,7 +27999,7 @@ function createOS2Table(properties, charstrings, override) { lastCharIndex = 255; } const bbox = properties.bbox || [0, 0, 0, 0]; - const unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); @@ -24691,7 +29693,7 @@ class Font { } properties.seacMap = seacMap; } - const unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); builder.addTable("CFF ", font.data); builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); @@ -24719,6 +29721,36 @@ class Font { builder.addTable("post", createPostTable(properties)); return builder.toArray(); } + get _spaceWidth() { + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } + } + return shadow(this, "_spaceWidth", width || this.defaultWidth); + } _charToGlyph(charcode, isSpace = false) { let glyph = this._glyphCache[charcode]; if (glyph?.isSpace === isSpace) { @@ -24747,6 +29779,10 @@ class Font { const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } } fontCharCode = mapSpecialUnicodeValues(fontCharCode); } @@ -24771,6 +29807,12 @@ class Font { warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); } } + if (this.missingFile && this.vertical && fontChar.length === 1) { + const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; + if (vertical) { + fontChar = unicode = String.fromCharCode(vertical); + } + } glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); return this._glyphCache[charcode] = glyph; } @@ -24882,6 +29924,13 @@ class ErrorFont { + + + + + + + const ShadingType = { FUNCTION_BASED: 1, AXIAL: 2, @@ -25802,6 +30851,8 @@ const SegoeuiRegularMetrics = { + + const getXFAFontMap = getLookupTableFactory(function (t) { t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { name: "LiberationSans-Regular", @@ -25995,6 +31046,7 @@ function getXfaFontDict(name) { + class PostScriptParser { constructor(lexer) { this.lexer = lexer; @@ -26183,6 +31235,13 @@ class PostScriptLexer { ;// CONCATENATED MODULE: ./src/core/image_utils.js + + + + + + + class BaseLocalCache { constructor(options) { if (this.constructor === BaseLocalCache) { @@ -26419,6 +31478,14 @@ class GlobalImageCache { + + + + + + + + class PDFFunctionFactory { constructor({ xref, @@ -27682,6 +32749,16 @@ function bidi(str, startLevel = -1, vertical = false) { + + + + + + + + + + const NORMAL = { style: "normal", weight: "normal" @@ -27945,6 +33022,12 @@ function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFont ;// CONCATENATED MODULE: ./src/core/image_resizer.js + + + + + + const MIN_IMAGE_DIM = 2048; const MAX_IMAGE_DIM = 65537; const MAX_ERROR = 128; @@ -28188,6 +33271,12 @@ class ImageResizer { ImageResizer._goodSquareLength = MIN_IMAGE_DIM; ;// CONCATENATED MODULE: ./src/shared/murmurhash3.js + + + + + + const SEED = 0xc3d2e1f0; const MASK_HIGH = 0xffff0000; const MASK_LOW = 0xffff; @@ -28282,6 +33371,20 @@ class MurmurHash3_64 { ;// CONCATENATED MODULE: ./src/core/operator_list.js + + + + + + + + + + + + + + function addState(parentState, pattern, checkFn, iterateFn, processFn) { let state = parentState; for (let i = 0, ii = pattern.length - 1; i < ii; i++) { @@ -28814,6 +33917,12 @@ class OperatorList { + + + + + + function decodeAndClamp(value, addend, coefficient, max) { value = addend + value * coefficient; if (value < 0) { @@ -28867,7 +33976,6 @@ class PDFImage { localColorSpaceCache }) { this.image = image; - let jpxDecode = false; const dict = image.dict; const filter = dict.get("F", "Filter"); let filterName; @@ -28888,7 +33996,11 @@ class PDFImage { bitsPerComponent: image.bitsPerComponent } = JpxImage.parseImageProperties(image.stream)); image.stream.reset(); - jpxDecode = true; + this.jpxDecoderOptions = { + numComponents: 0, + isIndexedColormap: false, + smaskInData: dict.has("SMaskInData") + }; break; case "JBIG2Decode": image.bitsPerComponent = 1; @@ -28924,21 +34036,27 @@ class PDFImage { this.bpc = bitsPerComponent; if (!this.imageMask) { let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); - if (!colorSpace) { - info("JPX images (which do not require color spaces)"); - switch (image.numComps) { - case 1: - colorSpace = Name.get("DeviceGray"); - break; - case 3: - colorSpace = Name.get("DeviceRGB"); - break; - case 4: - colorSpace = Name.get("DeviceCMYK"); - break; - default: - throw new Error(`JPX images with ${image.numComps} color components not supported.`); + const hasColorSpace = !!colorSpace; + if (!hasColorSpace) { + if (this.jpxDecoderOptions) { + colorSpace = Name.get("DeviceRGBA"); + } else { + switch (image.numComps) { + case 1: + colorSpace = Name.get("DeviceGray"); + break; + case 3: + colorSpace = Name.get("DeviceRGB"); + break; + case 4: + colorSpace = Name.get("DeviceCMYK"); + break; + default: + throw new Error(`Images with ${image.numComps} color components not supported.`); + } } + } else if (this.jpxDecoderOptions?.smaskInData) { + colorSpace = Name.get("DeviceRGBA"); } this.colorSpace = ColorSpace.parse({ cs: colorSpace, @@ -28948,7 +34066,10 @@ class PDFImage { localColorSpaceCache }); this.numComps = this.colorSpace.numComps; - this.ignoreColorSpace = jpxDecode && this.colorSpace.name === "Indexed"; + if (this.jpxDecoderOptions) { + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0; + this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; + } } this.decode = dict.getArray("D", "Decode"); this.needsDecode = false; @@ -29232,7 +34353,7 @@ class PDFImage { } return output; } - fillOpacity(rgbaBuf, width, height, actualHeight, image) { + async fillOpacity(rgbaBuf, width, height, actualHeight, image) { const smask = this.smask; const mask = this.mask; let alphaBuf, sw, sh, i, ii, j; @@ -29240,7 +34361,7 @@ class PDFImage { sw = smask.width; sh = smask.height; alphaBuf = new Uint8ClampedArray(sw * sh); - smask.fillGrayBuffer(alphaBuf); + await smask.fillGrayBuffer(alphaBuf); if (sw !== width || sh !== height) { alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); } @@ -29250,7 +34371,7 @@ class PDFImage { sh = mask.height; alphaBuf = new Uint8ClampedArray(sw * sh); mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); + await mask.fillGrayBuffer(alphaBuf); for (i = 0, ii = sw * sh; i < ii; ++i) { alphaBuf[i] = 255 - alphaBuf[i]; } @@ -29327,6 +34448,17 @@ class PDFImage { const bpc = this.bpc; const rowBytes = originalWidth * numComps * bpc + 7 >> 3; const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); + if (this.colorSpace.name === "DeviceRGBA") { + imgData.kind = ImageKind.RGBA_32BPP; + const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {}); + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; + } if (!forceRGBA) { let kind; if (this.colorSpace.name === "DeviceGray" && bpc === 1) { @@ -29335,7 +34467,7 @@ class PDFImage { kind = ImageKind.RGB_24BPP; } if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { - const data = this.getImageBytes(originalHeight * rowBytes, {}); + const data = await this.getImageBytes(originalHeight * rowBytes, {}); if (isOffscreenCanvasSupported) { if (mustBeResized) { return ImageResizer.createImage({ @@ -29377,7 +34509,7 @@ class PDFImage { break; } if (isHandled) { - const rgba = this.getImageBytes(imageLength, { + const rgba = await this.getImageBytes(imageLength, { drawWidth, drawHeight, forceRGBA: true @@ -29391,7 +34523,7 @@ class PDFImage { case "DeviceRGB": case "DeviceCMYK": imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(imageLength, { + imgData.data = await this.getImageBytes(imageLength, { drawWidth, drawHeight, forceRGB: true @@ -29404,7 +34536,7 @@ class PDFImage { } } } - const imgArray = this.getImageBytes(originalHeight * rowBytes, { + const imgArray = await this.getImageBytes(originalHeight * rowBytes, { internal: true }); const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; @@ -29435,7 +34567,7 @@ class PDFImage { } alpha01 = 1; maybeUndoPreblend = true; - this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); + await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); } if (this.needsDecode) { this.decodeBuffer(comps); @@ -29461,7 +34593,7 @@ class PDFImage { } return imgData; } - fillGrayBuffer(buffer) { + async fillGrayBuffer(buffer) { const numComps = this.numComps; if (numComps !== 1) { throw new FormatError(`Reading gray scale from a color image: ${numComps}`); @@ -29470,7 +34602,7 @@ class PDFImage { const height = this.height; const bpc = this.bpc; const rowBytes = width * numComps * bpc + 7 >> 3; - const imgArray = this.getImageBytes(height * rowBytes, { + const imgArray = await this.getImageBytes(height * rowBytes, { internal: true }); const comps = this.getComponents(imgArray); @@ -29524,7 +34656,7 @@ class PDFImage { interpolate: this.interpolate }; } - getImageBytes(length, { + async getImageBytes(length, { drawWidth, drawHeight, forceRGBA = false, @@ -29536,7 +34668,7 @@ class PDFImage { this.image.drawHeight = drawHeight || this.height; this.image.forceRGBA = !!forceRGBA; this.image.forceRGB = !!forceRGB; - const imageBytes = this.image.getBytes(length, this.ignoreColorSpace); + const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); if (internal || this.image instanceof DecodeStream) { return imageBytes; } @@ -29566,6 +34698,24 @@ class PDFImage { + + + + + + + + + + + + + + + + + + @@ -29649,7 +34799,11 @@ function normalizeBlendMode(value, parsingArray = false) { warn(`Unsupported blend mode: ${value.name}`); return "source-over"; } -function incrementCachedImageMaskCount(data) { +function addLocallyCachedImageOps(opList, data) { + if (data.objId) { + opList.addDependency(data.objId); + } + opList.addImageOps(data.fn, data.args, data.optionalContent); if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { data.args[0].count++; } @@ -30037,6 +35191,7 @@ class PartialEvaluator { operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); if (cacheKey) { const cacheData = { + objId, fn: OPS.paintImageMaskXObject, args, optionalContent @@ -30138,6 +35293,7 @@ class PartialEvaluator { }); if (cacheKey) { const cacheData = { + objId, fn: OPS.paintImageXObject, args, optionalContent @@ -30782,8 +35938,7 @@ class PartialEvaluator { if (isValidName) { const localImage = localImageCache.getByName(name); if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); + addLocallyCachedImageOps(operatorList, localImage); args = null; continue; } @@ -30796,8 +35951,7 @@ class PartialEvaluator { if (xobj instanceof Ref) { const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj); if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); + addLocallyCachedImageOps(operatorList, localImage); resolveXObject(); return; } @@ -30869,8 +36023,7 @@ class PartialEvaluator { if (cacheKey) { const localImage = localImageCache.getByName(cacheKey); if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); + addLocallyCachedImageOps(operatorList, localImage); args = null; continue; } @@ -30944,9 +36097,7 @@ class PartialEvaluator { resources, localColorSpaceCache }).then(function (colorSpace) { - if (colorSpace) { - stateManager.state.fillColorSpace = colorSpace; - } + stateManager.state.fillColorSpace = colorSpace || ColorSpace.singletons.gray; })); return; } @@ -30962,9 +36113,7 @@ class PartialEvaluator { resources, localColorSpaceCache }).then(function (colorSpace) { - if (colorSpace) { - stateManager.state.strokeColorSpace = colorSpace; - } + stateManager.state.strokeColorSpace = colorSpace || ColorSpace.singletons.gray; })); return; } @@ -31007,7 +36156,12 @@ class PartialEvaluator { args = ColorSpace.singletons.rgb.getRgb(args, 0); break; case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + args = []; + fn = OPS.setFillTransparent; + break; + } if (cs.name === "Pattern") { next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); return; @@ -31016,7 +36170,12 @@ class PartialEvaluator { fn = OPS.setFillRGBColor; break; case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + args = []; + fn = OPS.setStrokeTransparent; + break; + } if (cs.name === "Pattern") { next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); return; @@ -32231,6 +37390,9 @@ class PartialEvaluator { map[charCode] = String.fromCodePoint(token); return; } + if (token.length % 2 !== 0) { + token = "\u0000" + token; + } const str = []; for (let k = 0; k < token.length; k += 2) { const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); @@ -32278,7 +37440,7 @@ class PartialEvaluator { let defaultVMetrics; if (properties.composite) { const dw = dict.get("DW"); - defaultWidth = Number.isInteger(dw) ? dw : 1000; + defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; const widths = dict.get("W"); if (Array.isArray(widths)) { for (let i = 0, ii = widths.length; i < ii; i++) { @@ -33029,8 +38191,22 @@ class EvalState { this.ctm = new Float32Array(IDENTITY_MATRIX); this.font = null; this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; + this._fillColorSpace = ColorSpace.singletons.gray; + this._strokeColorSpace = ColorSpace.singletons.gray; + this.patternFillColorSpace = null; + this.patternStrokeColorSpace = null; + } + get fillColorSpace() { + return this._fillColorSpace; + } + set fillColorSpace(colorSpace) { + this._fillColorSpace = this.patternFillColorSpace = colorSpace; + } + get strokeColorSpace() { + return this._strokeColorSpace; + } + set strokeColorSpace(colorSpace) { + this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; } clone() { return Object.create(this); @@ -33520,6 +38696,13 @@ class EvaluatorPreprocessor { + + + + + + + class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { constructor(str) { super(new StringStream(str)); @@ -33708,7 +38891,9 @@ class FakeUnicodeFont { this.lastChar = -Infinity; this.fontFamily = fontFamily; const canvas = new OffscreenCanvas(1, 1); - this.ctxMeasure = canvas.getContext("2d"); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true + }); if (!FakeUnicodeFont._fontNameId) { FakeUnicodeFont._fontNameId = 1; } @@ -33901,6 +39086,7 @@ class FakeUnicodeFont { ;// CONCATENATED MODULE: ./src/core/name_number_tree.js + class NameOrNumberTree { constructor(root, xref, type) { if (this.constructor === NameOrNumberTree) { @@ -34119,6 +39305,8 @@ class FileSpec { ;// CONCATENATED MODULE: ./src/core/xml_parser.js + + const XMLParserErrorCode = { NoError: 0, EndOfDocument: -1, @@ -34537,6 +39725,10 @@ class SimpleXMLParser extends XMLParserBase { ;// CONCATENATED MODULE: ./src/core/metadata_parser.js + + + + class MetadataParser { constructor(data) { data = this._repair(data); @@ -34673,6 +39865,15 @@ class DecryptStream extends DecodeStream { + + + + + + + + + class ARCFourCipher { constructor(key) { this.a = 0; @@ -35947,6 +41148,16 @@ class CipherTransformFactory { + + + + + + + + + + async function writeObject(ref, obj, buffer, { encrypt = null }) { @@ -36339,6 +41550,10 @@ async function incrementalUpdate({ + + + + const MAX_DEPTH = 40; const StructElementType = { PAGE_CONTENT: 1, @@ -36623,19 +41838,19 @@ class StructTreeRoot { const tagDict = new Dict(xref); tagDict.set("S", Name.get(type)); if (title) { - tagDict.set("T", title); + tagDict.set("T", stringToAsciiOrUTF16BE(title)); } if (lang) { tagDict.set("Lang", lang); } if (alt) { - tagDict.set("Alt", alt); + tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); } if (expanded) { - tagDict.set("E", expanded); + tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); } if (actualText) { - tagDict.set("ActualText", actualText); + tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); } await this.#updateParentTag({ structTreeParent, @@ -37050,6 +42265,17 @@ class StructTreePage { + + + + + + + + + + + function isValidExplicitDest(dest) { @@ -37063,26 +42289,27 @@ function isValidExplicitDest(dest) { if (!(zoom instanceof Name)) { return false; } + const argsLen = args.length; let allowNull = true; switch (zoom.name) { case "XYZ": - if (args.length !== 3) { + if (argsLen < 2 || argsLen > 3) { return false; } break; case "Fit": case "FitB": - return args.length === 0; + return argsLen === 0; case "FitH": case "FitBH": case "FitV": case "FitBV": - if (args.length !== 1) { + if (argsLen > 1) { return false; } break; case "FitR": - if (args.length !== 4) { + if (argsLen !== 4) { return false; } allowNull = false; @@ -38473,6 +43700,7 @@ class Catalog { + function mayHaveChildren(value) { return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value); } @@ -38715,6 +43943,10 @@ const NamespaceIds = { ;// CONCATENATED MODULE: ./src/core/xfa/utils.js + + + + const dimConverters = { pt: x => x, cm: x => x / 2.54 * 72, @@ -38914,6 +44146,16 @@ class HTMLResult { + + + + + + + + + + class FontFinder { constructor(pdfFonts) { this.fonts = new Map(); @@ -39065,6 +44307,9 @@ function fonts_getMetrics(xfaFont, real = false) { ;// CONCATENATED MODULE: ./src/core/xfa/text.js + + + const WIDTH_FACTOR = 1.02; class FontInfo { constructor(xfaFont, margin, lineHeight, fontFinder) { @@ -39276,6 +44521,10 @@ class TextMeasure { ;// CONCATENATED MODULE: ./src/core/xfa/som.js + + + + const namePattern = /^[^.[]+/; const indexPattern = /^[^\]]+/; const operators = { @@ -39513,6 +44762,17 @@ function createDataNode(root, container, expr) { + + + + + + + + + + + const _applyPrototype = Symbol(); const _attributes = Symbol(); const _attributeNames = Symbol(); @@ -40320,6 +45580,10 @@ class Option10 extends IntegerObject { + + + + function measureToString(m) { if (typeof m === "string") { return "0px"; @@ -40820,6 +46084,9 @@ function fixURL(str) { ;// CONCATENATED MODULE: ./src/core/xfa/layout.js + + + function createLine(node, children) { return { name: "div", @@ -41095,6 +46362,26 @@ function checkDimensions(node, space) { + + + + + + + + + + + + + + + + + + + + const TEMPLATE_NS_ID = NamespaceIds.template.id; const SVG_NS = "http://www.w3.org/2000/svg"; @@ -45969,6 +51256,11 @@ class TemplateNamespace { + + + + + const bind_NS_DATASETS = NamespaceIds.datasets.id; function createText(content) { const node = new Text({}); @@ -46385,6 +51677,7 @@ class Binder { ;// CONCATENATED MODULE: ./src/core/xfa/data.js + class DataHandler { constructor(root, data) { this.data = data; @@ -46438,6 +51731,12 @@ class DataHandler { + + + + + + const CONFIG_NS_ID = NamespaceIds.config.id; class Acrobat extends XFAObject { constructor(attributes) { @@ -48392,6 +53691,16 @@ class XdpNamespace { + + + + + + + + + + const XHTML_NS_ID = NamespaceIds.xhtml.id; const $richText = Symbol(); const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); @@ -48827,6 +54136,10 @@ class UnknownNamespace { + + + + class Root extends XFAObject { constructor(ids) { super(-1, "root", Object.create(null)); @@ -48992,6 +54305,14 @@ class Builder { + + + + + + + + class XFAParser extends XMLParserBase { constructor(rootNameSpace = null, richText = false) { super(); @@ -49128,6 +54449,11 @@ class XFAParser extends XMLParserBase { + + + + + class XFAFactory { constructor(data) { try { @@ -49270,6 +54596,21 @@ class XFAFactory { + + + + + + + + + + + + + + + @@ -49612,38 +54953,19 @@ function getQuadPoints(dict, rect) { if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { return null; } - const quadPointsLists = []; - for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) { - let minX = Infinity, - maxX = -Infinity, - minY = Infinity, - maxY = -Infinity; - for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) { - const x = quadPoints[j]; - const y = quadPoints[j + 1]; - minX = Math.min(x, minX); - maxX = Math.max(x, maxX); - minY = Math.min(y, minY); - maxY = Math.max(y, maxY); - } + const newQuadPoints = new Float32Array(quadPoints.length); + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); + const minX = Math.min(x1, x2, x3, x4); + const maxX = Math.max(x1, x2, x3, x4); + const minY = Math.min(y1, y2, y3, y4); + const maxY = Math.max(y1, y2, y3, y4); if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { return null; } - quadPointsLists.push([{ - x: minX, - y: maxY - }, { - x: maxX, - y: maxY - }, { - x: minX, - y: minY - }, { - x: maxX, - y: minY - }]); + newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); } - return quadPointsLists; + return newQuadPoints; } function getTransformMatrix(rect, bbox, matrix) { const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix); @@ -49700,7 +55022,8 @@ class Annotation { subtype: params.subtype, hasOwnCanvas: false, noRotate: !!(this.flags & AnnotationFlag.NOROTATE), - noHTML: isLocked && isContentLocked + noHTML: isLocked && isContentLocked, + isEditable: false }; if (params.collectFields) { const kids = dict.get("Kids"); @@ -49746,6 +55069,9 @@ class Annotation { } return this.printable; } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); + } get viewable() { if (this.data.quadPoints === null) { return false; @@ -49927,7 +55253,7 @@ class Annotation { }); }); } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + async getOperatorList(evaluator, task, intent, annotationStorage) { const { hasOwnCanvas, id, @@ -50269,22 +55595,10 @@ class MarkupAnnotation extends Annotation { } let pointsArray = this.data.quadPoints; if (!pointsArray) { - pointsArray = [[{ - x: this.rectangle[0], - y: this.rectangle[3] - }, { - x: this.rectangle[2], - y: this.rectangle[3] - }, { - x: this.rectangle[0], - y: this.rectangle[1] - }, { - x: this.rectangle[2], - y: this.rectangle[1] - }]]; + pointsArray = Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]); } - for (const points of pointsArray) { - const [mX, MX, mY, MY] = pointsCallback(buffer, points); + for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { + const [mX, MX, mY, MY] = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); minX = Math.min(minX, mX); maxX = Math.max(maxX, MX); minY = Math.min(minY, mY); @@ -50321,14 +55635,21 @@ class MarkupAnnotation extends Annotation { this._streams.push(this.appearance, appearanceStream); } static async createNewAnnotation(xref, annotation, dependencies, params) { - const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); + let oldAnnotation; + if (annotation.ref) { + oldAnnotation = (await xref.fetchIfRefAsync(annotation.ref)).clone(); + } else { + annotation.ref = xref.getNewTemporaryRef(); + } + const annotationRef = annotation.ref; const ap = await this.createNewAppearanceStream(annotation, xref, params); const buffer = []; let annotationDict; if (ap) { const apRef = xref.getNewTemporaryRef(); annotationDict = this.createNewDict(annotation, xref, { - apRef + apRef, + oldAnnotation }); await writeObject(apRef, ap, buffer, xref); dependencies.push({ @@ -50336,7 +55657,9 @@ class MarkupAnnotation extends Annotation { data: buffer.join("") }); } else { - annotationDict = this.createNewDict(annotation, xref, {}); + annotationDict = this.createNewDict(annotation, xref, { + oldAnnotation + }); } if (Number.isInteger(annotation.parentTreeId)) { annotationDict.set("StructParent", annotation.parentTreeId); @@ -50494,8 +55817,8 @@ class WidgetAnnotation extends Annotation { } return str; } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { - if (renderForms && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { return { opList: new OperatorList(), separateForm: true, @@ -50503,11 +55826,11 @@ class WidgetAnnotation extends Annotation { }; } if (!this._hasText) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } const content = await this._getAppearance(evaluator, task, intent, annotationStorage); if (this.appearance && content === null) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } const opList = new OperatorList(); if (!this._defaultAppearance || content === null) { @@ -50605,8 +55928,7 @@ class WidgetAnnotation extends Annotation { path: this.data.fieldName, value }; - const encoder = val => isAscii(val) ? val : stringToUTF16String(val, true); - dict.set("V", Array.isArray(value) ? value.map(encoder) : encoder(value)); + dict.set("V", Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value)); this.amendSavedDict(annotationStorage, dict); const maybeMK = this._getMKDict(rotation); if (maybeMK) { @@ -50912,9 +56234,16 @@ class WidgetAnnotation extends Annotation { class TextWidgetAnnotation extends WidgetAnnotation { constructor(params) { super(params); + const { + dict + } = params; + if (dict.has("PMD")) { + this.flags |= AnnotationFlag.HIDDEN; + this.data.hidden = true; + warn("Barcodes are not supported"); + } this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; this._hasText = true; - const dict = params.dict; if (typeof this.data.fieldValue !== "string") { this.data.fieldValue = ""; } @@ -51066,7 +56395,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { warn("Invalid field flags for button widget annotation"); } } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + async getOperatorList(evaluator, task, intent, annotationStorage) { if (this.data.pushButton) { return super.getOperatorList(evaluator, task, intent, false, annotationStorage); } @@ -51078,7 +56407,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { rotation = storageEntry ? storageEntry.rotation : null; } if (value === null && this.appearance) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } if (value === null || value === undefined) { value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; @@ -51091,7 +56420,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); } this.appearance = appearance; - const operatorList = super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); this.appearance = savedAppearance; appearance.dict.set("Matrix", savedMatrix); return operatorList; @@ -51708,7 +57037,8 @@ class PopupAnnotation extends Annotation { class FreeTextAnnotation extends MarkupAnnotation { constructor(params) { super(params); - this.data.hasOwnCanvas = !this.data.noHTML; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; this.data.noHTML = false; const { evaluatorOptions, @@ -51754,7 +57084,8 @@ class FreeTextAnnotation extends MarkupAnnotation { } static createNewDict(annotation, xref, { apRef, - ap + ap, + oldAnnotation }) { const { color, @@ -51764,19 +57095,24 @@ class FreeTextAnnotation extends MarkupAnnotation { user, value } = annotation; - const freetext = new Dict(xref); + const freetext = oldAnnotation || new Dict(xref); freetext.set("Type", Name.get("Annot")); freetext.set("Subtype", Name.get("FreeText")); - freetext.set("CreationDate", `D:${getModificationDate()}`); + if (oldAnnotation) { + freetext.set("M", `D:${getModificationDate()}`); + freetext.delete("RC"); + } else { + freetext.set("CreationDate", `D:${getModificationDate()}`); + } freetext.set("Rect", rect); const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; freetext.set("DA", da); - freetext.set("Contents", isAscii(value) ? value : stringToUTF16String(value, true)); + freetext.set("Contents", stringToAsciiOrUTF16BE(value)); freetext.set("F", 4); freetext.set("Border", [0, 0, 0]); freetext.set("Rotate", rotation); if (user) { - freetext.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); + freetext.set("T", stringToAsciiOrUTF16BE(user)); } if (apRef || ap) { const n = new Dict(xref); @@ -51935,7 +57271,7 @@ class LineAnnotation extends MarkupAnnotation { fillAlpha, pointsCallback: (buffer, points) => { buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); - return [points[0].x - borderWidth, points[1].x + borderWidth, points[3].y - borderWidth, points[1].y + borderWidth]; + return [points[0] - borderWidth, points[2] + borderWidth, points[7] - borderWidth, points[3] + borderWidth]; } }); } @@ -51968,17 +57304,17 @@ class SquareAnnotation extends MarkupAnnotation { strokeAlpha, fillAlpha, pointsCallback: (buffer, points) => { - const x = points[2].x + this.borderStyle.width / 2; - const y = points[2].y + this.borderStyle.width / 2; - const width = points[3].x - points[2].x - this.borderStyle.width; - const height = points[1].y - points[3].y - this.borderStyle.width; + const x = points[4] + this.borderStyle.width / 2; + const y = points[5] + this.borderStyle.width / 2; + const width = points[6] - points[4] - this.borderStyle.width; + const height = points[3] - points[7] - this.borderStyle.width; buffer.push(`${x} ${y} ${width} ${height} re`); if (fillColor) { buffer.push("B"); } else { buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52010,10 +57346,10 @@ class CircleAnnotation extends MarkupAnnotation { strokeAlpha, fillAlpha, pointsCallback: (buffer, points) => { - const x0 = points[0].x + this.borderStyle.width / 2; - const y0 = points[0].y - this.borderStyle.width / 2; - const x1 = points[3].x - this.borderStyle.width / 2; - const y1 = points[3].y + this.borderStyle.width / 2; + const x0 = points[0] + this.borderStyle.width / 2; + const y0 = points[1] - this.borderStyle.width / 2; + const x1 = points[6] - this.borderStyle.width / 2; + const y1 = points[7] + this.borderStyle.width / 2; const xMid = x0 + (x1 - x0) / 2; const yMid = y0 + (y1 - y0) / 2; const xOffset = (x1 - x0) / 2 * controlPointsDistance; @@ -52024,7 +57360,7 @@ class CircleAnnotation extends MarkupAnnotation { } else { buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52040,7 +57376,7 @@ class PolylineAnnotation extends MarkupAnnotation { this.data.annotationType = AnnotationType.POLYLINE; this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = false; - this.data.vertices = []; + this.data.vertices = null; if (!(this instanceof PolygonAnnotation)) { this.setLineEndings(dict.getArray("LE")); this.data.lineEndings = this.lineEndings; @@ -52049,23 +57385,18 @@ class PolylineAnnotation extends MarkupAnnotation { if (!isNumberArray(rawVertices, null)) { return; } - for (let i = 0, ii = rawVertices.length; i < ii; i += 2) { - this.data.vertices.push({ - x: rawVertices[i], - y: rawVertices[i + 1] - }); - } + const vertices = this.data.vertices = Float32Array.from(rawVertices); if (!this.appearance) { const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; const strokeAlpha = dict.get("CA"); const borderWidth = this.borderStyle.width || 1, borderAdjust = 2 * borderWidth; const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (const vertex of this.data.vertices) { - bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); - bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); - bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); - bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust); } if (!Util.intersect(this.rectangle, bbox)) { this.rectangle = bbox; @@ -52076,12 +57407,11 @@ class PolylineAnnotation extends MarkupAnnotation { strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - const vertices = this.data.vertices; - for (let i = 0, ii = vertices.length; i < ii; i++) { - buffer.push(`${vertices[i].x} ${vertices[i].y} ${i === 0 ? "m" : "l"}`); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); } buffer.push("S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52115,18 +57445,17 @@ class InkAnnotation extends MarkupAnnotation { return; } for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { - this.data.inkLists.push([]); if (!Array.isArray(rawInkLists[i])) { continue; } + const inkList = new Float32Array(rawInkLists[i].length); + this.data.inkLists.push(inkList); for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { const x = xref.fetchIfRef(rawInkLists[i][j]), y = xref.fetchIfRef(rawInkLists[i][j + 1]); if (typeof x === "number" && typeof y === "number") { - this.data.inkLists[i].push({ - x, - y - }); + inkList[j] = x; + inkList[j + 1] = y; } } } @@ -52136,12 +57465,12 @@ class InkAnnotation extends MarkupAnnotation { const borderWidth = this.borderStyle.width || 1, borderAdjust = 2 * borderWidth; const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (const inkLists of this.data.inkLists) { - for (const vertex of inkLists) { - bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); - bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); - bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); - bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust); } } if (!Util.intersect(this.rectangle, bbox)) { @@ -52154,12 +57483,12 @@ class InkAnnotation extends MarkupAnnotation { strokeAlpha, pointsCallback: (buffer, points) => { for (const inkList of this.data.inkLists) { - for (let i = 0, ii = inkList.length; i < ii; i++) { - buffer.push(`${inkList[i].x} ${inkList[i].y} ${i === 0 ? "m" : "l"}`); + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); } buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52321,8 +57650,8 @@ class HighlightAnnotation extends MarkupAnnotation { blendMode: "Multiply", fillAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${points[0].x} ${points[0].y} m`, `${points[1].x} ${points[1].y} l`, `${points[3].x} ${points[3].y} l`, `${points[2].x} ${points[2].y} l`, "f"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52354,7 +57683,7 @@ class HighlightAnnotation extends MarkupAnnotation { highlight.set("C", Array.from(color, c => c / 255)); highlight.set("CA", opacity); if (user) { - highlight.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); + highlight.set("T", stringToAsciiOrUTF16BE(user)); } if (apRef || ap) { const n = new Dict(xref); @@ -52424,8 +57753,8 @@ class UnderlineAnnotation extends MarkupAnnotation { strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${points[2].x} ${points[2].y + 1.3} m`, `${points[3].x} ${points[3].y + 1.3} l`, "S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52453,11 +57782,11 @@ class SquigglyAnnotation extends MarkupAnnotation { strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - const dy = (points[0].y - points[2].y) / 6; + const dy = (points[1] - points[5]) / 6; let shift = dy; - let x = points[2].x; - const y = points[2].y; - const xEnd = points[3].x; + let x = points[4]; + const y = points[5]; + const xEnd = points[6]; buffer.push(`${x} ${y + shift} m`); do { x += 2; @@ -52465,7 +57794,7 @@ class SquigglyAnnotation extends MarkupAnnotation { buffer.push(`${x} ${y + shift} l`); } while (x < xEnd); buffer.push("S"); - return [points[2].x, xEnd, y - 2 * dy, y + 2 * dy]; + return [points[4], xEnd, y - 2 * dy, y + 2 * dy]; } }); } @@ -52493,8 +57822,8 @@ class StrikeOutAnnotation extends MarkupAnnotation { strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${(points[0].x + points[2].x) / 2} ` + `${(points[0].y + points[2].y) / 2} m`, `${(points[1].x + points[3].x) / 2} ` + `${(points[1].y + points[3].y) / 2} l`, "S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S"); + return [points[0], points[2], points[7], points[3]]; } }); } @@ -52590,7 +57919,7 @@ class StampAnnotation extends MarkupAnnotation { stamp.set("Border", [0, 0, 0]); stamp.set("Rotate", rotation); if (user) { - stamp.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); + stamp.set("T", stringToAsciiOrUTF16BE(user)); } if (apRef || ap) { const n = new Dict(xref); @@ -52655,6 +57984,7 @@ class FileAttachmentAnnotation extends MarkupAnnotation { + function decodeString(str) { try { return stringToUTF8String(str); @@ -52715,6 +58045,20 @@ class DatasetReader { + + + + + + + + + + + + + + class XRef { #firstXRefStmPos = null; constructor(stream, pdfManager) { @@ -53453,6 +58797,25 @@ class XRef { + + + + + + + + + + + + + + + + + + + const DEFAULT_USER_UNIT = 1.0; @@ -53707,7 +59070,8 @@ class Page { task, intent, cacheKey, - annotationStorage = null + annotationStorage = null, + modifiedIds = null }) { const contentStreamPromise = this.getContentStream(); const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); @@ -53804,13 +59168,14 @@ class Page { }; } const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), + isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), intentAny = !!(intent & RenderingIntentFlag.ANY), intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), intentPrint = !!(intent & RenderingIntentFlag.PRINT); const opListPromises = []; for (const annotation of annotations) { - if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) || intentPrint && annotation.mustBePrinted(annotationStorage)) { - opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, renderForms, annotationStorage).catch(function (reason) { + if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { + opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); return { opList: null, @@ -54963,6 +60328,7 @@ class NetworkPdfManager extends BasePdfManager { ;// CONCATENATED MODULE: ./src/shared/message_handler.js + const CallbackKind = { UNKNOWN: 0, DATA: 1, @@ -55366,6 +60732,7 @@ class MessageHandler { ;// CONCATENATED MODULE: ./src/core/worker_stream.js + class PDFWorkerStream { constructor(msgHandler) { this._msgHandler = msgHandler; @@ -55481,6 +60848,26 @@ class PDFWorkerStreamRangeReader { + + + + + + + + + + + + + + + + + + + + class WorkerTask { constructor(name) { @@ -55530,7 +60917,7 @@ class WorkerMessageHandler { docId, apiVersion } = docParams; - const workerVersion = "4.3.136"; + const workerVersion = "4.5.136"; if (apiVersion !== workerVersion) { throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); } @@ -55998,7 +61385,8 @@ class WorkerMessageHandler { task, intent: data.intent, cacheKey: data.cacheKey, - annotationStorage: data.annotationStorage + annotationStorage: data.annotationStorage, + modifiedIds: data.modifiedIds }).then(function (operatorListInfo) { finishWorkerTask(task); if (start) { @@ -56100,8 +61488,8 @@ if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && ;// CONCATENATED MODULE: ./src/pdf.worker.js -const pdfjsVersion = "4.3.136"; -const pdfjsBuild = "0cec64437"; +const pdfjsVersion = "4.5.136"; +const pdfjsBuild = "3a21f03b0"; var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler; export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; diff --git a/cps/static/js/libs/viewer.mjs b/cps/static/js/libs/viewer.mjs index 73a01686..ba57b079 100644 --- a/cps/static/js/libs/viewer.mjs +++ b/cps/static/js/libs/viewer.mjs @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -142,7 +142,7 @@ function scrollIntoView(element, spot, scrollMatches = false) { } parent.scrollTop = offsetY; } -function watchScroll(viewAreaElement, callback) { +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { const debounceScroll = function (evt) { if (rAF) { return; @@ -172,7 +172,13 @@ function watchScroll(viewAreaElement, callback) { _eventHandler: debounceScroll }; let rAF = null; - viewAreaElement.addEventListener("scroll", debounceScroll, true); + viewAreaElement.addEventListener("scroll", debounceScroll, { + useCapture: true, + signal: abortSignal + }); + abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), { + once: true + }); return state; } function parseQueryString(query) { @@ -250,9 +256,8 @@ function approximateFraction(x) { } return result; } -function roundToDivide(x, div) { - const r = x % div; - return r === 0 ? x : Math.round(x - r + div); +function floorToDivide(x, div) { + return x - x % div; } function getPageSizeInches({ view, @@ -441,7 +446,7 @@ class ProgressBar { } } setDisableAutoFetch(delay = 5000) { - if (isNaN(this.#percent)) { + if (this.#percent === 100 || isNaN(this.#percent)) { return; } if (this.#disableAutoFetchTimeout) { @@ -530,15 +535,20 @@ function toggleExpandedBtn(button, toggle, view = null) { ;// CONCATENATED MODULE: ./web/app_options.js { - var compatibilityParams = Object.create(null); + var compatParams = new Map(); const userAgent = navigator.userAgent || ""; const platform = navigator.platform || ""; const maxTouchPoints = navigator.maxTouchPoints || 1; const isAndroid = /Android/.test(userAgent); const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; - (function checkCanvasSizeLimitation() { + (function () { if (isIOS || isAndroid) { - compatibilityParams.maxCanvasPixels = 5242880; + compatParams.set("maxCanvasPixels", 5242880); + } + })(); + (function () { + if (isAndroid) { + compatParams.set("useSystemFonts", false); } })(); } @@ -547,9 +557,21 @@ const OptionKind = { VIEWER: 0x02, API: 0x04, WORKER: 0x08, + EVENT_DISPATCH: 0x10, PREFERENCE: 0x80 }; +const Type = { + BOOLEAN: 0x01, + NUMBER: 0x02, + OBJECT: 0x04, + STRING: 0x08, + UNDEFINED: 0x10 +}; const defaultOptions = { + allowedGlobalEvents: { + value: null, + kind: OptionKind.BROWSER + }, canvasMaxAreaInBytes: { value: -1, kind: OptionKind.BROWSER + OptionKind.API @@ -558,6 +580,16 @@ const defaultOptions = { value: false, kind: OptionKind.BROWSER }, + localeProperties: { + value: { + lang: navigator.language || "en-US" + }, + kind: OptionKind.BROWSER + }, + nimbusDataStr: { + value: "", + kind: OptionKind.BROWSER + }, supportsCaretBrowsingMode: { value: false, kind: OptionKind.BROWSER @@ -582,6 +614,14 @@ const defaultOptions = { value: true, kind: OptionKind.BROWSER }, + toolbarDensity: { + value: 0, + kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH + }, + altTextLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, annotationEditorMode: { value: 0, kind: OptionKind.VIEWER + OptionKind.PREFERENCE @@ -614,6 +654,14 @@ const defaultOptions = { value: false, kind: OptionKind.VIEWER + OptionKind.PREFERENCE }, + enableAltText: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableGuessAltText: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, enableHighlightEditor: { value: false, kind: OptionKind.VIEWER + OptionKind.PREFERENCE @@ -622,10 +670,6 @@ const defaultOptions = { value: false, kind: OptionKind.VIEWER + OptionKind.PREFERENCE }, - enableML: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, enablePermissions: { value: false, kind: OptionKind.VIEWER + OptionKind.PREFERENCE @@ -638,8 +682,8 @@ const defaultOptions = { value: true, kind: OptionKind.VIEWER + OptionKind.PREFERENCE }, - enableStampEditor: { - value: true, + enableUpdatedAddImage: { + value: false, kind: OptionKind.VIEWER + OptionKind.PREFERENCE }, externalLinkRel: { @@ -738,6 +782,10 @@ const defaultOptions = { value: "", kind: OptionKind.API }, + enableHWA: { + value: true, + kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE + }, enableXfa: { value: true, kind: OptionKind.API + OptionKind.PREFERENCE @@ -766,6 +814,11 @@ const defaultOptions = { value: "../web/standard_fonts/", kind: OptionKind.API }, + useSystemFonts: { + value: undefined, + kind: OptionKind.API, + type: Type.BOOLEAN + Type.UNDEFINED + }, verbosity: { value: 1, kind: OptionKind.API @@ -798,62 +851,80 @@ const defaultOptions = { value: false, kind: OptionKind.VIEWER }; - defaultOptions.locale = { - value: navigator.language || "en-US", - kind: OptionKind.VIEWER - }; } -const userOptions = Object.create(null); +const userOptions = new Map(); { - for (const name in compatibilityParams) { - userOptions[name] = compatibilityParams[name]; + for (const [name, value] of compatParams) { + userOptions.set(name, value); } } class AppOptions { + static eventBus; constructor() { throw new Error("Cannot initialize AppOptions."); } static get(name) { - return userOptions[name] ?? defaultOptions[name]?.value ?? undefined; + return userOptions.has(name) ? userOptions.get(name) : defaultOptions[name]?.value; } static getAll(kind = null, defaultOnly = false) { const options = Object.create(null); for (const name in defaultOptions) { - const defaultOption = defaultOptions[name]; - if (kind && !(kind & defaultOption.kind)) { + const defaultOpt = defaultOptions[name]; + if (kind && !(kind & defaultOpt.kind)) { continue; } - options[name] = defaultOnly ? defaultOption.value : userOptions[name] ?? defaultOption.value; + options[name] = !defaultOnly && userOptions.has(name) ? userOptions.get(name) : defaultOpt.value; } return options; } static set(name, value) { - userOptions[name] = value; + this.setAll({ + [name]: value + }); } - static setAll(options, init = false) { - if (init) { - if (this.get("disablePreferences")) { - return; - } - for (const name in userOptions) { - if (compatibilityParams[name] !== undefined) { - continue; - } - console.warn("setAll: The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option in order to prevent that.'); - break; - } - } + static setAll(options, prefs = false) { + let events; for (const name in options) { - userOptions[name] = options[name]; + const defaultOpt = defaultOptions[name], + userOpt = options[name]; + if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) { + continue; + } + const { + kind + } = defaultOpt; + if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { + continue; + } + if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { + (events ||= new Map()).set(name, userOpt); + } + userOptions.set(name, userOpt); + } + if (events) { + for (const [name, value] of events) { + this.eventBus.dispatch(name.toLowerCase(), { + source: this, + value + }); + } } } - static remove(name) { - delete userOptions[name]; - const val = compatibilityParams[name]; - if (val !== undefined) { - userOptions[name] = val; +} +{ + AppOptions._checkDisablePreferences = () => { + if (AppOptions.get("disablePreferences")) { + return true; } - } + for (const [name] of userOptions) { + if (compatParams.has(name)) { + continue; + } + console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.'); + break; + } + return false; + }; } ;// CONCATENATED MODULE: ./web/pdf_link_service.js @@ -1162,26 +1233,27 @@ class PDFLinkService { if (!(typeof zoom === "object" && typeof zoom?.name === "string")) { return false; } + const argsLen = args.length; let allowNull = true; switch (zoom.name) { case "XYZ": - if (args.length !== 3) { + if (argsLen < 2 || argsLen > 3) { return false; } break; case "Fit": case "FitB": - return args.length === 0; + return argsLen === 0; case "FitH": case "FitBH": case "FitV": case "FitBV": - if (args.length !== 1) { + if (argsLen > 1) { return false; } break; case "FitR": - if (args.length !== 4) { + if (argsLen !== 4) { return false; } allowNull = false; @@ -1231,7 +1303,6 @@ const { noContextMenu, normalizeUnicode, OPS, - Outliner, PasswordResponses, PDFDataRangeTransport, PDFDateString, @@ -1239,12 +1310,10 @@ const { PermissionFlag, PixelsPerInch, RenderingCancelledException, - renderTextLayer, setLayerDimensions, shadow, TextLayer, UnexpectedResponseException, - updateTextLayer, Util, VerbosityLevel, version, @@ -1357,9 +1426,18 @@ class EventBus { } } } -class AutomationEventBus extends EventBus { +class FirefoxEventBus extends EventBus { + #externalServices; + #globalEventNames; + #isInAutomation; + constructor(globalEventNames, externalServices, isInAutomation) { + super(); + this.#globalEventNames = globalEventNames; + this.#externalServices = externalServices; + this.#isInAutomation = isInAutomation; + } dispatch(eventName, data) { - throw new Error("Not implemented: AutomationEventBus.dispatch"); + throw new Error("Not implemented: FirefoxEventBus.dispatch"); } } @@ -1383,36 +1461,28 @@ class BaseExternalServices { updateEditorStates(data) { throw new Error("Not implemented: updateEditorStates"); } - async getNimbusExperimentData() {} + dispatchGlobalEvent(_event) {} } ;// CONCATENATED MODULE: ./web/preferences.js class BasePreferences { - #browserDefaults = Object.freeze({ - canvasMaxAreaInBytes: -1, - isInAutomation: false, - supportsCaretBrowsingMode: false, - supportsDocumentFonts: true, - supportsIntegratedFind: false, - supportsMouseWheelZoomCtrlKey: true, - supportsMouseWheelZoomMetaKey: true, - supportsPinchToZoom: true - }); #defaults = Object.freeze({ + altTextLearnMoreUrl: "", annotationEditorMode: 0, annotationMode: 2, cursorToolOnLoad: 0, defaultZoomDelay: 400, defaultZoomValue: "", disablePageLabels: false, + enableAltText: false, + enableGuessAltText: true, enableHighlightEditor: false, enableHighlightFloatingButton: false, - enableML: false, enablePermissions: false, enablePrintAutoRotate: true, enableScripting: true, - enableStampEditor: true, + enableUpdatedAddImage: false, externalLinkTarget: 0, highlightEditorColors: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", historyUpdateUrl: false, @@ -1430,10 +1500,10 @@ class BasePreferences { disableFontFace: false, disableRange: false, disableStream: false, + enableHWA: true, enableXfa: true, viewerCssTheme: 0 }); - #prefs = Object.create(null); #initializedPromise = null; constructor() { if (this.constructor === BasePreferences) { @@ -1443,16 +1513,13 @@ class BasePreferences { browserPrefs, prefs }) => { - const options = Object.create(null); - for (const [name, val] of Object.entries(this.#browserDefaults)) { - const prefVal = browserPrefs?.[name]; - options[name] = typeof prefVal === typeof val ? prefVal : val; + if (AppOptions._checkDisablePreferences()) { + return; } - for (const [name, val] of Object.entries(this.#defaults)) { - const prefVal = prefs?.[name]; - options[name] = this.#prefs[name] = typeof prefVal === typeof val ? prefVal : val; - } - AppOptions.setAll(options, true); + AppOptions.setAll({ + ...browserPrefs, + ...prefs + }, true); }); } async _writeToStorage(prefObj) { @@ -1461,58 +1528,21 @@ class BasePreferences { async _readFromStorage(prefObj) { throw new Error("Not implemented: _readFromStorage"); } - #updatePref({ - name, - value - }) { - throw new Error("Not implemented: #updatePref"); - } async reset() { await this.#initializedPromise; - const oldPrefs = structuredClone(this.#prefs); - this.#prefs = Object.create(null); - try { - await this._writeToStorage(this.#defaults); - } catch (reason) { - this.#prefs = oldPrefs; - throw reason; - } + AppOptions.setAll(this.#defaults, true); + await this._writeToStorage(this.#defaults); } async set(name, value) { await this.#initializedPromise; - const defaultValue = this.#defaults[name], - oldPrefs = structuredClone(this.#prefs); - if (defaultValue === undefined) { - throw new Error(`Set preference: "${name}" is undefined.`); - } else if (value === undefined) { - throw new Error("Set preference: no value is specified."); - } - const valueType = typeof value, - defaultType = typeof defaultValue; - if (valueType !== defaultType) { - if (valueType === "number" && defaultType === "string") { - value = value.toString(); - } else { - throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`); - } - } else if (valueType === "number" && !Number.isInteger(value)) { - throw new Error(`Set preference: "${value}" must be an integer.`); - } - this.#prefs[name] = value; - try { - await this._writeToStorage(this.#prefs); - } catch (reason) { - this.#prefs = oldPrefs; - throw reason; - } + AppOptions.setAll({ + [name]: value + }, true); + await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE)); } async get(name) { await this.#initializedPromise; - const defaultValue = this.#defaults[name]; - if (defaultValue === undefined) { - throw new Error(`Get preference: "${name}" is undefined.`); - } - return this.#prefs[name] ?? defaultValue; + return AppOptions.get(name); } get initializedPromise() { return this.#initializedPromise; @@ -2743,6 +2773,9 @@ class DOMLocalization extends Localization { this.pauseObserving(); if (this.roots.size === 0) { this.mutationObserver = null; + if (this.windowElement && this.pendingrAF) { + this.windowElement.cancelAnimationFrame(this.pendingrAF); + } this.windowElement = null; this.pendingrAF = null; this.pendingElements.clear(); @@ -2843,6 +2876,7 @@ class DOMLocalization extends Localization { ;// CONCATENATED MODULE: ./web/l10n.js class L10n { #dir; + #elements = new Set(); #lang; #l10n; constructor({ @@ -2877,11 +2911,19 @@ class L10n { return messages?.[0].value || fallback; } async translate(element) { + this.#elements.add(element); try { this.#l10n.connectRoot(element); await this.#l10n.translateRoots(); } catch {} } + async destroy() { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#l10n.pauseObserving(); + } pause() { this.#l10n.pauseObserving(); } @@ -2954,8 +2996,7 @@ class genericl10n_GenericL10n extends L10n { const bundle = await this.#createBundle(lang, baseURL, paths); if (bundle) { yield bundle; - } - if (lang === "en-us") { + } else if (lang === "en-us") { yield this.#createBundleFallback(lang); } } @@ -3064,13 +3105,19 @@ class Preferences extends BasePreferences { } class ExternalServices extends BaseExternalServices { async createL10n() { - return new genericl10n_GenericL10n(AppOptions.get("locale")); + return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang); } createScripting() { return new GenericScripting(AppOptions.get("sandboxBundleSrc")); } } class MLManager { + async isEnabledFor(_name) { + return false; + } + async deleteModel(_service) { + return null; + } async guess() { return null; } @@ -3625,13 +3672,6 @@ function download(blobUrl, filename) { } class DownloadManager { #openBlobUrls = new WeakMap(); - downloadUrl(url, filename, _options) { - if (!createValidAbsoluteUrl(url, "http://example.com")) { - console.error(`downloadUrl - not a valid URL: ${url}`); - return; - } - download(url + "#pdfjs.action=download", filename); - } downloadData(data, filename, contentType) { const blobUrl = URL.createObjectURL(new Blob([data], { type: contentType @@ -3666,8 +3706,19 @@ class DownloadManager { this.downloadData(data, filename, contentType); return false; } - download(blob, url, filename, _options) { - const blobUrl = URL.createObjectURL(blob); + download(data, url, filename, _options) { + let blobUrl; + if (data) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: "application/pdf" + })); + } else { + if (!createValidAbsoluteUrl(url, "http://example.com")) { + console.error(`download - not a valid URL: ${url}`); + return; + } + blobUrl = url + "#pdfjs.action=download"; + } download(blobUrl, filename); } } @@ -5180,6 +5231,7 @@ class PDFFindController { source: this, state, previous, + entireWord: this.#state?.entireWord ?? null, matchesCount: this.#requestMatchesCount(), rawQuery: this.#state?.query ?? null }); @@ -7711,7 +7763,8 @@ class PDFThumbnailView { optionalContentConfigPromise, linkService, renderingQueue, - pageColors + pageColors, + enableHWA }) { this.id = id; this.renderingId = "thumbnail" + id; @@ -7722,6 +7775,7 @@ class PDFThumbnailView { this.pdfPageRotate = defaultViewport.rotation; this._optionalContentConfigPromise = optionalContentConfigPromise || null; this.pageColors = pageColors || null; + this.enableHWA = enableHWA || false; this.eventBus = eventBus; this.linkService = linkService; this.renderingQueue = renderingQueue; @@ -7805,10 +7859,11 @@ class PDFThumbnailView { } this.resume = null; } - #getPageDrawContext(upscaleFactor = 1) { + #getPageDrawContext(upscaleFactor = 1, enableHWA = this.enableHWA) { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d", { - alpha: false + alpha: false, + willReadFrequently: !enableHWA }); const outputScale = new OutputScale(); canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0; @@ -7927,7 +7982,7 @@ class PDFThumbnailView { const { ctx, canvas - } = this.#getPageDrawContext(); + } = this.#getPageDrawContext(1, true); if (img.width <= 2 * canvas.width) { ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); return canvas; @@ -7974,14 +8029,17 @@ class PDFThumbnailViewer { eventBus, linkService, renderingQueue, - pageColors + pageColors, + abortSignal, + enableHWA }) { this.container = container; this.eventBus = eventBus; this.linkService = linkService; this.renderingQueue = renderingQueue; this.pageColors = pageColors || null; - this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this)); + this.enableHWA = enableHWA || false; + this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this), abortSignal); this.#resetView(); } #scrollUpdated() { @@ -8102,7 +8160,8 @@ class PDFThumbnailViewer { optionalContentConfigPromise, linkService: this.linkService, renderingQueue: this.renderingQueue, - pageColors: this.pageColors + pageColors: this.pageColors, + enableHWA: this.enableHWA }); this._thumbnails.push(thumbnail); } @@ -8365,6 +8424,9 @@ class AnnotationLayerBuilder { } this.div.hidden = true; } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } #updatePresentationModeState(state) { if (!this.div) { return; @@ -8932,13 +8994,6 @@ class TextLayerBuilder { this.div.tabIndex = 0; this.div.className = "textLayer"; } - #finishRendering() { - this.#renderingDone = true; - const endOfContent = document.createElement("div"); - endOfContent.className = "endOfContent"; - this.div.append(endOfContent); - this.#bindMouse(endOfContent); - } async render(viewport, textContentParams = null) { if (this.#renderingDone && this.#textLayer) { this.#textLayer.update({ @@ -8964,7 +9019,11 @@ class TextLayerBuilder { this.highlighter?.setTextMapping(textDivs, textContentItemsStr); this.accessibilityManager?.setTextMapping(textDivs); await this.#textLayer.render(); - this.#finishRendering(); + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); this.#onAppend?.(this.div); this.highlighter?.enable(); this.accessibilityManager?.enable(); @@ -9097,7 +9156,9 @@ const DEFAULT_LAYER_PROPERTIES = null; const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); class PDFPageView { #annotationMode = AnnotationMode.ENABLE_FORMS; + #enableHWA = false; #hasRestrictedScaling = false; + #isEditing = false; #layerProperties = null; #loadingId = null; #previousRotation = null; @@ -9129,6 +9190,7 @@ class PDFPageView { this.imageResourcesPath = options.imageResourcesPath || ""; this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); this.pageColors = options.pageColors || null; + this.#enableHWA = options.enableHWA || false; this.eventBus = options.eventBus; this.renderingQueue = options.renderingQueue; this.l10n = options.l10n; @@ -9251,6 +9313,9 @@ class PDFPageView { this.reset(); this.pdfPage?.cleanup(); } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } get _textHighlighter() { return shadow(this, "_textHighlighter", new TextHighlighter({ pageIndex: this.id - 1, @@ -9427,6 +9492,19 @@ class PDFPageView { this._resetZoomLayer(); } } + toggleEditingMode(isEditing) { + if (!this.hasEditableAnnotations()) { + return; + } + this.#isEditing = isEditing; + this.reset({ + keepZoomLayer: true, + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true + }); + } update({ scale = 0, rotation = null, @@ -9739,7 +9817,8 @@ class PDFPageView { canvasWrapper.append(canvas); this.canvas = canvas; const ctx = canvas.getContext("2d", { - alpha: false + alpha: false, + willReadFrequently: !this.#enableHWA }); const outputScale = this.outputScale = new OutputScale(); if (this.maxCanvasPixels === 0) { @@ -9760,13 +9839,13 @@ class PDFPageView { } const sfx = approximateFraction(outputScale.sx); const sfy = approximateFraction(outputScale.sy); - canvas.width = roundToDivide(width * outputScale.sx, sfx[0]); - canvas.height = roundToDivide(height * outputScale.sy, sfy[0]); + canvas.width = floorToDivide(width * outputScale.sx, sfx[0]); + canvas.height = floorToDivide(height * outputScale.sy, sfy[0]); const { style } = canvas; - style.width = roundToDivide(width, sfx[1]) + "px"; - style.height = roundToDivide(height, sfy[1]) + "px"; + style.width = floorToDivide(width, sfx[1]) + "px"; + style.height = floorToDivide(height, sfy[1]) + "px"; this.#viewportMap.set(canvas, viewport); const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; const renderContext = { @@ -9776,7 +9855,8 @@ class PDFPageView { annotationMode: this.#annotationMode, optionalContentConfigPromise: this._optionalContentConfigPromise, annotationCanvasMap: this._annotationCanvasMap, - pageColors + pageColors, + isEditing: this.#isEditing }; const renderTask = this.renderTask = pdfPage.render(renderContext); renderTask.onContinue = renderContinueCallback; @@ -9870,8 +9950,8 @@ class PDFPageView { const DEFAULT_CACHE_SIZE = 10; const PagesCountLimit = { - FORCE_SCROLL_MODE_PAGE: 15000, - FORCE_LAZY_PAGE_INIT: 7500, + FORCE_SCROLL_MODE_PAGE: 10000, + FORCE_LAZY_PAGE_INIT: 5000, PAUSE_EAGER_PAGE_INIT: 250 }; function isValidAnnotationEditorMode(mode) { @@ -9933,10 +10013,14 @@ class PDFViewer { #annotationEditorUIManager = null; #annotationMode = AnnotationMode.ENABLE_FORMS; #containerTopLeft = null; + #enableHWA = false; #enableHighlightFloatingButton = false; #enablePermissions = false; + #enableUpdatedAddImage = false; #eventAbortController = null; #mlManager = null; + #onPageRenderedCallback = null; + #switchAnnotationEditorModeTimeoutId = null; #getAllTextInProgress = false; #hiddenCopyElement = null; #interruptCopyCondition = false; @@ -9946,7 +10030,7 @@ class PDFViewer { #scaleTimeoutId = null; #textLayerMode = TextLayerMode.ENABLE; constructor(options) { - const viewerVersion = "4.3.136"; + const viewerVersion = "4.5.136"; if (version !== viewerVersion) { throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); } @@ -9973,6 +10057,7 @@ class PDFViewer { this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true; this.imageResourcesPath = options.imageResourcesPath || ""; this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; this.removePageBorders = options.removePageBorders || false; @@ -9982,6 +10067,7 @@ class PDFViewer { this.#enablePermissions = options.enablePermissions || false; this.pageColors = options.pageColors || null; this.#mlManager = options.mlManager || null; + this.#enableHWA = options.enableHWA || false; this.defaultRenderingQueue = !options.renderingQueue; if (this.defaultRenderingQueue) { this.renderingQueue = new PDFRenderingQueue(); @@ -9989,7 +10075,16 @@ class PDFViewer { } else { this.renderingQueue = options.renderingQueue; } - this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); + const { + abortSignal + } = options; + abortSignal?.addEventListener("abort", () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, { + once: true + }); + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal); this.presentationModeState = PresentationModeState.UNKNOWN; this._resetView(); if (this.removePageBorders) { @@ -10254,10 +10349,14 @@ class PDFViewer { return; } this.#getAllTextInProgress = true; - const savedCursor = this.container.style.cursor; - this.container.style.cursor = "wait"; - const interruptCopy = ev => this.#interruptCopyCondition = ev.key === "Escape"; - window.addEventListener("keydown", interruptCopy); + const { + classList + } = this.viewer; + classList.add("copyAll"); + const ac = new AbortController(); + window.addEventListener("keydown", ev => this.#interruptCopyCondition = ev.key === "Escape", { + signal: ac.signal + }); this.getAllText().then(async text => { if (text !== null) { await navigator.clipboard.writeText(text); @@ -10267,8 +10366,8 @@ class PDFViewer { }).finally(() => { this.#getAllTextInProgress = false; this.#interruptCopyCondition = false; - window.removeEventListener("keydown", interruptCopy); - this.container.style.cursor = savedCursor; + ac.abort(); + classList.remove("copyAll"); }); event.preventDefault(); event.stopPropagation(); @@ -10364,7 +10463,7 @@ class PDFViewer { if (pdfDocument.isPureXfa) { console.warn("Warning: XFA-editing is not implemented."); } else if (isValidAnnotationEditorMode(mode)) { - this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#altTextManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#mlManager); + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#altTextManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#mlManager); eventBus.dispatch("annotationeditoruimanager", { source: this, uiManager: this.#annotationEditorUIManager @@ -10401,7 +10500,8 @@ class PDFViewer { maxCanvasPixels: this.maxCanvasPixels, pageColors, l10n: this.l10n, - layerProperties: this._layerProperties + layerProperties: this._layerProperties, + enableHWA: this.#enableHWA }); this._pages.push(pageView); } @@ -10522,6 +10622,7 @@ class PDFViewer { this.viewer.removeAttribute("lang"); this.#hiddenCopyElement?.remove(); this.#hiddenCopyElement = null; + this.#cleanupSwitchAnnotationEditorMode(); } #ensurePageViewVisible() { if (this._scrollMode !== ScrollMode.PAGE) { @@ -10894,6 +10995,34 @@ class PDFViewer { location: this._location }); } + #switchToEditAnnotationMode() { + const visible = this._getVisiblePages(); + const pagesToRefresh = []; + const { + ids, + views + } = visible; + for (const page of views) { + const { + view + } = page; + if (!view.hasEditableAnnotations()) { + ids.delete(view.id); + continue; + } + pagesToRefresh.push(page); + } + if (pagesToRefresh.length === 0) { + return null; + } + this.renderingQueue.renderHighestPriority({ + first: pagesToRefresh[0], + last: pagesToRefresh.at(-1), + views: pagesToRefresh, + ids + }); + return ids; + } containsElement(element) { return this.container.contains(element); } @@ -11326,6 +11455,16 @@ class PDFViewer { get containerTopLeft() { return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; } + #cleanupSwitchAnnotationEditorMode() { + if (this.#onPageRenderedCallback) { + this.eventBus._off("pagerendered", this.#onPageRenderedCallback); + this.#onPageRenderedCallback = null; + } + if (this.#switchAnnotationEditorModeTimeoutId !== null) { + clearTimeout(this.#switchAnnotationEditorModeTimeoutId); + this.#switchAnnotationEditorModeTimeoutId = null; + } + } get annotationEditorMode() { return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; } @@ -11346,12 +11485,47 @@ class PDFViewer { if (!this.pdfDocument) { return; } - this.#annotationEditorMode = mode; - this.eventBus.dispatch("annotationeditormodechanged", { - source: this, - mode - }); - this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard); + const { + eventBus + } = this; + const updater = () => { + this.#cleanupSwitchAnnotationEditorMode(); + this.#annotationEditorMode = mode; + this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard); + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + }; + if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) { + const isEditing = mode !== AnnotationEditorType.NONE; + if (!isEditing) { + this.pdfDocument.annotationStorage.resetModifiedIds(); + } + for (const pageView of this._pages) { + pageView.toggleEditingMode(isEditing); + } + const idsToRefresh = this.#switchToEditAnnotationMode(); + if (isEditing && idsToRefresh) { + this.#cleanupSwitchAnnotationEditorMode(); + this.#onPageRenderedCallback = ({ + pageNumber + }) => { + idsToRefresh.delete(pageNumber); + if (idsToRefresh.size === 0) { + this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0); + } + }; + const { + signal + } = this.#eventAbortController; + eventBus._on("pagerendered", this.#onPageRenderedCallback, { + signal + }); + return; + } + } + updater(); } set annotationEditorParams({ type, @@ -11549,26 +11723,26 @@ class SecondaryToolbar { eventDetails } of buttons) { if ( element !== null ) { - element.addEventListener("click", evt => { - if (eventName !== null) { - eventBus.dispatch(eventName, { - source: this, - ...eventDetails - }); + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id } - if (close) { - this.close(); - } - eventBus.dispatch("reporttelemetry", { - source: this, - details: { - type: "buttons", - data: { - id: element.id - } - } - }); + } }); + }); } } eventBus._on("cursortoolchanged", this.#cursorToolChanged.bind(this)); @@ -11659,7 +11833,7 @@ class SecondaryToolbar { class Toolbar { #opts; - constructor(options, eventBus) { + constructor(options, eventBus, toolbarDensity = 0) { this.#opts = options; this.eventBus = eventBus; const buttons = [{ @@ -11744,8 +11918,13 @@ class Toolbar { break; } }); + eventBus._on("toolbardensity", this.#updateToolbarDensity.bind(this)); + this.#updateToolbarDensity({ + value: toolbarDensity + }); this.reset(); } + #updateToolbarDensity() {} #setAnnotationEditorUIManager(uiManager, parentContainer) { const colorPicker = new ColorPicker({ uiManager @@ -12016,7 +12195,6 @@ class ViewHistory { const FORCE_PAGES_LOADED_TIMEOUT = 10000; -const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; const ViewOnLoad = { UNKNOWN: -1, PREVIOUS: 0, @@ -12048,20 +12226,21 @@ const PDFViewerApplication = { store: null, downloadManager: null, overlayManager: null, - preferences: null, + preferences: new Preferences(), toolbar: null, secondaryToolbar: null, eventBus: null, l10n: null, annotationEditorParams: null, isInitialViewSet: false, - downloadComplete: false, isViewerEmbedded: window.parent !== window, url: "", baseUrl: "", + mlManager: null, _downloadUrl: "", _eventBusAbortController: null, _windowAbortController: null, + _globalAbortController: new AbortController(), documentInfo: null, metadata: null, _contentDispositionFilename: null, @@ -12077,11 +12256,9 @@ const PDFViewerApplication = { _printAnnotationStoragePromise: null, _touchInfo: null, _isCtrlKeyDown: false, - _nimbusDataPromise: null, _caretBrowsing: null, _isScrolling: false, async initialize(appConfig) { - let l10nPromise; this.appConfig = appConfig; try { await this.preferences.initializedPromise; @@ -12103,8 +12280,7 @@ const PDFViewerApplication = { if (mode) { document.documentElement.classList.add(mode); } - l10nPromise = this.externalServices.createL10n(); - this.l10n = await l10nPromise; + this.l10n = await this.externalServices.createL10n(); document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); this.l10n.translate(appConfig.appContainer || document.documentElement); if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { @@ -12193,7 +12369,9 @@ const PDFViewerApplication = { } } if (params.has("locale")) { - AppOptions.set("locale", params.get("locale")); + AppOptions.set("localeProperties", { + lang: params.get("locale") + }); } }, async _initializeViewerComponents() { @@ -12202,7 +12380,8 @@ const PDFViewerApplication = { externalServices, l10n } = this; - const eventBus = AppOptions.get("isInAutomation") ? new AutomationEventBus() : new EventBus(); + let eventBus; + eventBus = new EventBus(); this.eventBus = eventBus; this.overlayManager = new OverlayManager(); const pdfRenderingQueue = new PDFRenderingQueue(); @@ -12236,6 +12415,7 @@ const PDFViewerApplication = { foreground: AppOptions.get("pageColorsForeground") } : null; const altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null; + const enableHWA = AppOptions.get("enableHWA"); const pdfViewer = new PDFViewer({ container, viewer, @@ -12252,12 +12432,15 @@ const PDFViewerApplication = { annotationEditorMode, annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"), imageResourcesPath: AppOptions.get("imageResourcesPath"), enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), maxCanvasPixels: AppOptions.get("maxCanvasPixels"), enablePermissions: AppOptions.get("enablePermissions"), pageColors, - mlManager: this.mlManager + mlManager: this.mlManager, + abortSignal: this._globalAbortController.signal, + enableHWA }); this.pdfViewer = pdfViewer; pdfRenderingQueue.setViewer(pdfViewer); @@ -12269,7 +12452,9 @@ const PDFViewerApplication = { eventBus, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, - pageColors + pageColors, + abortSignal: this._globalAbortController.signal, + enableHWA }); pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); } @@ -12285,9 +12470,6 @@ const PDFViewerApplication = { } if (appConfig.annotationEditorParams) { if (annotationEditorMode !== AnnotationEditorType.DISABLE) { - if (AppOptions.get("enableStampEditor")) { - appConfig.toolbar?.editorStampButton?.classList.remove("hidden"); - } const editorHighlightButton = appConfig.toolbar?.editorHighlightButton; if (editorHighlightButton && AppOptions.get("enableHighlightEditor")) { editorHighlightButton.hidden = false; @@ -12310,7 +12492,7 @@ const PDFViewerApplication = { }); } if (appConfig.toolbar) { - this.toolbar = new Toolbar(appConfig.toolbar, eventBus); + this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity")); } if (appConfig.secondaryToolbar) { this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); @@ -12367,7 +12549,6 @@ const PDFViewerApplication = { } }, async run(config) { - this.preferences = new Preferences(); await this.initialize(config); const { appConfig, @@ -12378,7 +12559,7 @@ const PDFViewerApplication = { const params = parseQueryString(queryString); file = params.get("file") ?? AppOptions.get("defaultUrl"); validateFileURL(file); - /* const fileInput = this._openFileInput = document.createElement("input"); + /*const fileInput = this._openFileInput = document.createElement("input"); fileInput.id = "fileInput"; fileInput.hidden = true; fileInput.type = "file"; @@ -12395,24 +12576,28 @@ const PDFViewerApplication = { source: this, fileInput: evt.target }); - });*/ + }); appConfig.mainContainer.addEventListener("dragover", function (evt) { - evt.preventDefault(); - evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + for (const item of evt.dataTransfer.items) { + if (item.type === "application/pdf") { + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + evt.preventDefault(); + evt.stopPropagation(); + return; + } + } }); appConfig.mainContainer.addEventListener("drop", function (evt) { - evt.preventDefault(); - const { - files - } = evt.dataTransfer; - if (!files || files.length === 0) { + if (evt.dataTransfer.files?.[0].type !== "application/pdf") { return; } - /*eventBus.dispatch("fileinputchange", { + evt.preventDefault(); + evt.stopPropagation(); + eventBus.dispatch("fileinputchange", { source: this, fileInput: evt.dataTransfer - });*/ - }); + }); + });*/ if (!AppOptions.get("supportsDocumentFonts")) { AppOptions.set("disableFontFace", true); this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { @@ -12440,9 +12625,6 @@ const PDFViewerApplication = { get externalServices() { return shadow(this, "externalServices", new ExternalServices()); }, - get mlManager() { - return shadow(this, "mlManager", AppOptions.get("enableML") === true ? new MLManager() : null); - }, get initialized() { return this._initializedCapability.settled; }, @@ -12523,12 +12705,10 @@ const PDFViewerApplication = { let title = pdfjs_getPdfFilenameFromUrl(url, ""); if (!title) { try { - title = decodeURIComponent(getFilenameFromUrl(url)) || url; - } catch { - title = url; - } + title = decodeURIComponent(getFilenameFromUrl(url)); + } catch {} } - this.setTitle(title); + this.setTitle(title || url); }, setTitle(title = this._title) { this._title = title; @@ -12574,7 +12754,6 @@ const PDFViewerApplication = { this.pdfLinkService.externalLinkEnabled = true; this.store = null; this.isInitialViewSet = false; - this.downloadComplete = false; this.url = ""; this.baseUrl = ""; this._downloadUrl = ""; @@ -12647,25 +12826,12 @@ const PDFViewerApplication = { }); }); }, - _ensureDownloadComplete() { - if (this.pdfDocument && this.downloadComplete) { - return; - } - throw new Error("PDF document not downloaded."); - }, async download(options = {}) { - const url = this._downloadUrl, - filename = this._docFilename; + let data; try { - this._ensureDownloadComplete(); - const data = await this.pdfDocument.getData(); - const blob = new Blob([data], { - type: "application/pdf" - }); - await this.downloadManager.download(blob, url, filename, options); - } catch { - await this.downloadManager.downloadUrl(url, filename, options); - } + data = await this.pdfDocument.getData(); + } catch {} + this.downloadManager.download(data, this._downloadUrl, this._docFilename, options); }, async save(options = {}) { if (this._saveInProgress) { @@ -12673,15 +12839,9 @@ const PDFViewerApplication = { } this._saveInProgress = true; await this.pdfScriptingManager.dispatchWillSave(); - const url = this._downloadUrl, - filename = this._docFilename; try { - this._ensureDownloadComplete(); const data = await this.pdfDocument.saveDocument(); - const blob = new Blob([data], { - type: "application/pdf" - }); - await this.downloadManager.download(blob, url, filename, options); + this.downloadManager.download(data, this._downloadUrl, this._docFilename, options); } catch (reason) { console.error(`Error when saving the document: ${reason.message}`); await this.download(options); @@ -12699,12 +12859,13 @@ const PDFViewerApplication = { }); } }, - downloadOrSave(options = {}) { - if (this.pdfDocument?.annotationStorage.size > 0) { - this.save(options); - } else { - this.download(options); - } + async downloadOrSave(options = {}) { + const { + classList + } = this.appConfig.appContainer; + classList.add("wait"); + await (this.pdfDocument?.annotationStorage.size > 0 ? this.save(options) : this.download(options)); + classList.remove("wait"); }, async _documentError(key, moreInfo = null) { this._unblockDocumentLoadEvent(); @@ -12735,11 +12896,8 @@ const PDFViewerApplication = { return message; }, progress(level) { - if (!this.loadingBar || this.downloadComplete) { - return; - } const percent = Math.round(level * 100); - if (percent <= this.loadingBar.percent) { + if (!this.loadingBar || percent <= this.loadingBar.percent) { return; } this.loadingBar.percent = percent; @@ -12753,7 +12911,6 @@ const PDFViewerApplication = { length }) => { this._contentLength = length; - this.downloadComplete = true; this.loadingBar?.hide(); firstPagePromise.then(() => { this.eventBus.dispatch("documentloaded", { @@ -13355,9 +13512,6 @@ const PDFViewerApplication = { }); } addWindowResolutionChange(); - window.addEventListener("visibilitychange", webViewerVisibilityChange, { - signal - }); window.addEventListener("wheel", webViewerWheel, { passive: false, signal @@ -13471,6 +13625,14 @@ const PDFViewerApplication = { this._windowAbortController?.abort(); this._windowAbortController = null; }, + async testingClose() { + this.unbindEvents(); + this.unbindWindowEvents(); + this._globalAbortController?.abort(); + this._globalAbortController = null; + this.findBar?.close(); + await Promise.all([this.l10n?.destroy(), this.close()]); + }, _accumulateTicks(ticks, prop) { if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { this[prop] = 0; @@ -13674,9 +13836,9 @@ function webViewerHashchange(evt) { originalUrl: file.name }); }; - /*var webViewerOpenFile = function (evt) { + var webViewerOpenFile = function (evt) { PDFViewerApplication._openFileInput?.click(); - };*/ + }; } function webViewerPresentationMode() { PDFViewerApplication.requestPresentationMode(); @@ -13768,6 +13930,7 @@ function webViewerUpdateFindMatchesCount({ function webViewerUpdateFindControlState({ state, previous, + entireWord, matchesCount, rawQuery }) { @@ -13775,6 +13938,7 @@ function webViewerUpdateFindControlState({ PDFViewerApplication.externalServices.updateFindControlState({ result: state, findPrevious: previous, + entireWord, matchesCount, rawQuery }); @@ -13808,20 +13972,6 @@ function webViewerPageChanging({ function webViewerResolutionChange(evt) { PDFViewerApplication.pdfViewer.refresh(); } -function webViewerVisibilityChange(evt) { - if (document.visibilityState === "visible") { - setZoomDisabledTimeout(); - } -} -let zoomDisabledTimeout = null; -function setZoomDisabledTimeout() { - if (zoomDisabledTimeout) { - clearTimeout(zoomDisabledTimeout); - } - zoomDisabledTimeout = setTimeout(function () { - zoomDisabledTimeout = null; - }, WHEEL_ZOOM_DISABLED_TIMEOUT); -} function webViewerWheel(evt) { const { pdfViewer, @@ -13839,7 +13989,7 @@ function webViewerWheel(evt) { const origin = [evt.clientX, evt.clientY]; if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { evt.preventDefault(); - if (PDFViewerApplication._isScrolling || zoomDisabledTimeout || document.visibilityState === "hidden" || PDFViewerApplication.overlayManager.active) { + if (PDFViewerApplication._isScrolling || document.visibilityState === "hidden" || PDFViewerApplication.overlayManager.active) { return; } if (isPinchToZoom && supportsPinchToZoom) { @@ -14066,14 +14216,14 @@ function webViewerKeyDown(evt) { }); handled = true; break; - /*case 79: + case 79: { eventBus.dispatch("openfile", { source: window }); handled = true; } - break;*/ + break; } } if (cmd === 3 || cmd === 10) { @@ -14267,14 +14417,20 @@ function webViewerReportTelemetry({ }) { PDFViewerApplication.externalServices.reportTelemetry(details); } +function webViewerSetPreference({ + name, + value +}) { + PDFViewerApplication.preferences.set(name, value); +} ;// CONCATENATED MODULE: ./web/viewer.js -const pdfjsVersion = "4.3.136"; -const pdfjsBuild = "0cec64437"; +const pdfjsVersion = "4.5.136"; +const pdfjsBuild = "3a21f03b0"; const AppConstants = { LinkTarget: LinkTarget, RenderingStates: RenderingStates, diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 6b183b07..2dbea6bc 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -160,15 +160,21 @@ $(document).ready(function() { $(".session").click(function() { window.sessionStorage.setItem("back", window.location.pathname); + window.sessionStorage.setItem("search", window.location.search); }); $("#back").click(function() { var loc = sessionStorage.getItem("back"); + var param = sessionStorage.getItem("search"); if (!loc) { loc = $(this).data("back"); } sessionStorage.removeItem("back"); - window.location.href = loc; + sessionStorage.removeItem("search"); + if (param === null) { + param = ""; + } + window.location.href = loc + param; }); @@ -606,6 +612,8 @@ $(function() { $("#auth_za").toggleClass("disabled"); $("#pub_new").toggleClass("disabled"); $("#pub_old").toggleClass("disabled"); + $("#shelf_new").toggleClass("disabled"); + $("#shelf_old").toggleClass("disabled"); var alternative_text = $("#toggle_order_shelf").data('alt-text'); $("#toggle_order_shelf").data('alt-text', $("#toggle_order_shelf").html()); $("#toggle_order_shelf").html(alternative_text); diff --git a/cps/static/js/reading/epub.js b/cps/static/js/reading/epub.js index 5047b1d3..a552da05 100644 --- a/cps/static/js/reading/epub.js +++ b/cps/static/js/reading/epub.js @@ -79,6 +79,6 @@ var reader; } // Default settings load - const theme = localStorage.getItem("calibre.reader.theme") ?? Object.keys(themes)[0]; + const theme = localStorage.getItem("calibre.reader.theme") ?? "lightTheme"; selectTheme(theme); })(); diff --git a/cps/static/locale/br/viewer.ftl b/cps/static/locale/br/viewer.ftl index 9049f68f..471b9a5d 100644 --- a/cps/static/locale/br/viewer.ftl +++ b/cps/static/locale/br/viewer.ftl @@ -49,12 +49,6 @@ pdfjs-download-button = # Length of the translation matters since we are in a mobile context, with limited screen estate. pdfjs-download-button-label = Pellgargañ pdfjs-bookmark-button-label = Pajenn a-vremañ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Digeriñ en arload -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Digeriñ en arload ## Secondary toolbar and context menu @@ -214,6 +208,7 @@ pdfjs-find-next-button = pdfjs-find-next-button-label = War-lerc'h pdfjs-find-highlight-checkbox = Usskediñ pep tra pdfjs-find-match-case-checkbox-label = Teurel evezh ouzh ar pennlizherennoù +pdfjs-find-match-diacritics-checkbox-label = Doujañ d’an tiredoù pdfjs-find-entire-word-checkbox-label = Gerioù a-bezh pdfjs-find-reached-top = Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz pdfjs-find-reached-bottom = Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h @@ -311,3 +306,7 @@ pdfjs-editor-alt-text-save-button = Enrollañ ## Color picker + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + diff --git a/cps/static/locale/is/viewer.ftl b/cps/static/locale/is/viewer.ftl index d3afef3e..620c0fc2 100644 --- a/cps/static/locale/is/viewer.ftl +++ b/cps/static/locale/is/viewer.ftl @@ -51,12 +51,6 @@ pdfjs-download-button-label = Sækja pdfjs-bookmark-button = .title = Núverandi síða (Skoða vefslóð frá núverandi síðu) pdfjs-bookmark-button-label = Núverandi síða -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Opna í smáforriti -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Opna í smáforriti ## Secondary toolbar and context menu @@ -284,7 +278,7 @@ pdfjs-text-annotation-type = ## Password -pdfjs-password-label = Sláðu inn lykilorð til að opna þessa PDF skrá. +pdfjs-password-label = Settu inn lykilorð til að opna þessa PDF-skrá. pdfjs-password-invalid = Ógilt lykilorð. Reyndu aftur. pdfjs-password-ok-button = Í lagi pdfjs-password-cancel-button = Hætta við @@ -304,8 +298,6 @@ pdfjs-editor-stamp-button-label = Bæta við eða breyta myndum pdfjs-editor-highlight-button = .title = Áherslulita pdfjs-editor-highlight-button-label = Áherslulita -pdfjs-highlight-floating-button = - .title = Áherslulita pdfjs-highlight-floating-button1 = .title = Áherslulita .aria-label = Áherslulita diff --git a/cps/static/locale/ja/viewer.ftl b/cps/static/locale/ja/viewer.ftl index 2246cfd4..a9c90fe9 100644 --- a/cps/static/locale/ja/viewer.ftl +++ b/cps/static/locale/ja/viewer.ftl @@ -279,7 +279,7 @@ pdfjs-text-annotation-type = ## Password pdfjs-password-label = この PDF ファイルを開くためのパスワードを入力してください。 -pdfjs-password-invalid = 無効なパスワードです。もう一度やり直してください。 +pdfjs-password-invalid = パスワードが正しくありません。もう一度試してください。 pdfjs-password-ok-button = OK pdfjs-password-cancel-button = キャンセル pdfjs-web-fonts-disabled = ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。 @@ -298,8 +298,6 @@ pdfjs-editor-stamp-button-label = 画像を追加または編集 pdfjs-editor-highlight-button = .title = 強調します pdfjs-editor-highlight-button-label = 強調 -pdfjs-highlight-floating-button = - .title = 強調 pdfjs-highlight-floating-button1 = .title = 強調 .aria-label = 強調します diff --git a/cps/static/locale/kab/viewer.ftl b/cps/static/locale/kab/viewer.ftl index 5f16478e..cfe0ba33 100644 --- a/cps/static/locale/kab/viewer.ftl +++ b/cps/static/locale/kab/viewer.ftl @@ -51,12 +51,6 @@ pdfjs-download-button-label = Sader pdfjs-bookmark-button = .title = Asebter amiran (Sken-d tansa URL seg usebter amiran) pdfjs-bookmark-button-label = Asebter amiran -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Ldi deg usnas -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Ldi deg usnas ## Secondary toolbar and context menu @@ -301,8 +295,27 @@ pdfjs-editor-ink-button-label = Suneɣ pdfjs-editor-stamp-button = .title = Rnu neɣ ẓreg tugniwin pdfjs-editor-stamp-button-label = Rnu neɣ ẓreg tugniwin -pdfjs-editor-remove-button = - .title = Kkes +pdfjs-editor-highlight-button = + .title = Derrer +pdfjs-editor-highlight-button-label = Derrer +pdfjs-highlight-floating-button1 = + .title = Derrer + .aria-label = Derrer +pdfjs-highlight-floating-button-label = Derrer + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Kkes asuneɣ +pdfjs-editor-remove-freetext-button = + .title = Kkes aḍris +pdfjs-editor-remove-stamp-button = + .title = Kkes tugna +pdfjs-editor-remove-highlight-button = + .title = Kkes aderrer + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Initen pdfjs-editor-free-text-size-input = Teɣzi @@ -312,6 +325,8 @@ pdfjs-editor-ink-opacity-input = Tebrek pdfjs-editor-stamp-add-image-button = .title = Rnu tawlaft pdfjs-editor-stamp-add-image-button-label = Rnu tawlaft +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tuzert pdfjs-free-text = .aria-label = Amaẓrag n uḍris pdfjs-free-text-default-content = Bdu tira... @@ -335,3 +350,37 @@ pdfjs-editor-alt-text-decorative-tooltip = Yettwacreḍ d adlag ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-label-top-left = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-label-top-middle = Talemmat n ufella — semsawi teɣzi +pdfjs-editor-resizer-label-top-right = Tiɣmert n ufella n yeffus — semsawi teɣzi +pdfjs-editor-resizer-label-middle-right = Talemmast tayeffust — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-right = Tiɣmert n wadda n yeffus — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-middle = Talemmat n wadda — semsawi teɣzi +pdfjs-editor-resizer-label-bottom-left = Tiɣmert n wadda n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-label-middle-left = Talemmast tazelmdaḍt — semsawi teɣzi + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ini n uderrer +pdfjs-editor-colorpicker-button = + .title = Senfel ini +pdfjs-editor-colorpicker-dropdown = + .aria-label = Afran n yiniten +pdfjs-editor-colorpicker-yellow = + .title = Awraɣ +pdfjs-editor-colorpicker-green = + .title = Azegzaw +pdfjs-editor-colorpicker-blue = + .title = Amidadi +pdfjs-editor-colorpicker-pink = + .title = Axuxi +pdfjs-editor-colorpicker-red = + .title = Azggaɣ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Sken akk +pdfjs-editor-highlight-show-all-button = + .title = Sken akk diff --git a/cps/static/locale/nn-NO/viewer.ftl b/cps/static/locale/nn-NO/viewer.ftl index 476e4c15..e32b147c 100644 --- a/cps/static/locale/nn-NO/viewer.ftl +++ b/cps/static/locale/nn-NO/viewer.ftl @@ -51,12 +51,6 @@ pdfjs-download-button-label = Last ned pdfjs-bookmark-button = .title = Gjeldande side (sjå URL frå gjeldande side) pdfjs-bookmark-button-label = Gjeldande side -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Opne i app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Opne i app ## Secondary toolbar and context menu @@ -301,9 +295,24 @@ pdfjs-editor-ink-button-label = Teikne pdfjs-editor-stamp-button = .title = Legg til eller rediger bilde pdfjs-editor-stamp-button-label = Legg til eller rediger bilde +pdfjs-editor-highlight-button = + .title = Markere +pdfjs-editor-highlight-button-label = Markere +pdfjs-highlight-floating-button1 = + .title = Markere + .aria-label = Markere +pdfjs-highlight-floating-button-label = Markere ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = Fjern teikninga +pdfjs-editor-remove-freetext-button = + .title = Fjern tekst +pdfjs-editor-remove-stamp-button = + .title = Fjern bildet +pdfjs-editor-remove-highlight-button = + .title = Fjern utheving ## @@ -316,6 +325,10 @@ pdfjs-editor-ink-opacity-input = Ugjennomskinleg pdfjs-editor-stamp-add-image-button = .title = Legg til bilde pdfjs-editor-stamp-add-image-button-label = Legg til bilde +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tjukkleik +pdfjs-editor-free-highlight-thickness-title = + .title = Endre tjukn når du markerer andre element enn tekst pdfjs-free-text = .aria-label = Tekstredigering pdfjs-free-text-default-content = Byrje å skrive… @@ -345,9 +358,23 @@ pdfjs-editor-alt-text-textarea = ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-label-top-left = Øvste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-top-middle = Øvst i midten — endre størrelse +pdfjs-editor-resizer-label-top-right = Øvste høgre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-right = Midt til høgre – endre størrelse +pdfjs-editor-resizer-label-bottom-right = Nedste høgre hjørne – endre størrelse +pdfjs-editor-resizer-label-bottom-middle = Nedst i midten — endre størrelse +pdfjs-editor-resizer-label-bottom-left = Nedste venstre hjørne – endre størrelse +pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge +pdfjs-editor-colorpicker-button = + .title = Endre farge +pdfjs-editor-colorpicker-dropdown = + .aria-label = Fargeval pdfjs-editor-colorpicker-yellow = .title = Gul pdfjs-editor-colorpicker-green = @@ -358,3 +385,10 @@ pdfjs-editor-colorpicker-pink = .title = Rosa pdfjs-editor-colorpicker-red = .title = Raud + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle diff --git a/cps/static/locale/sl/viewer.ftl b/cps/static/locale/sl/viewer.ftl index 7cda4ec2..841dfccb 100644 --- a/cps/static/locale/sl/viewer.ftl +++ b/cps/static/locale/sl/viewer.ftl @@ -302,6 +302,10 @@ pdfjs-editor-stamp-button-label = Dodajanje ali urejanje slik pdfjs-editor-highlight-button = .title = Označevalnik pdfjs-editor-highlight-button-label = Označevalnik +pdfjs-highlight-floating-button1 = + .title = Označi + .aria-label = Označi +pdfjs-highlight-floating-button-label = Označi ## Remove button for the various kind of editor. diff --git a/cps/string_helper.py b/cps/string_helper.py new file mode 100644 index 00000000..b2d0cf81 --- /dev/null +++ b/cps/string_helper.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web) +# Copyright (C) 2024 OzzieIsaacs +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import re + + +def strip_whitespaces(text): + return re.sub("(^[\s\u200B-\u200D\ufeff]+)|([\s\u200B-\u200D\ufeff]+$)","", text) + diff --git a/cps/tasks/tempFolder.py b/cps/tasks/clean.py similarity index 58% rename from cps/tasks/tempFolder.py rename to cps/tasks/clean.py index e740cd1e..1a1681b4 100644 --- a/cps/tasks/tempFolder.py +++ b/cps/tasks/clean.py @@ -16,31 +16,48 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from urllib.request import urlopen +import datetime from flask_babel import lazy_gettext as N_ +from sqlalchemy.sql.expression import or_ -from cps import logger, file_helper +from cps import logger, file_helper, ub from cps.services.worker import CalibreTask -class TaskDeleteTempFolder(CalibreTask): +class TaskClean(CalibreTask): def __init__(self, task_message=N_('Delete temp folder contents')): - super(TaskDeleteTempFolder, self).__init__(task_message) + super(TaskClean, self).__init__(task_message) self.log = logger.create() + self.app_db_session = ub.get_new_session_instance() def run(self, worker_thread): + # delete temp folder try: file_helper.del_temp_dir() except FileNotFoundError: pass except (PermissionError, OSError) as e: self.log.error("Error deleting temp folder: {}".format(e)) + # delete expired session keys + self.log.debug("Deleted expired session_keys" ) + expiry = int(datetime.datetime.now().timestamp()) + try: + self.app_db_session.query(ub.User_Sessions).filter(or_(ub.User_Sessions.expiry < expiry, + ub.User_Sessions.expiry == None)).delete() + self.app_db_session.commit() + except Exception as ex: + self.log.debug('Error deleting expired session keys: ' + str(ex)) + self._handleError('Error deleting expired session keys: ' + str(ex)) + self.app_db_session.rollback() + return + self._handleSuccess() + self.app_db_session.remove() @property def name(self): - return "Delete Temp Folder" + return "Clean up" @property def is_cancellable(self): diff --git a/cps/tasks/convert.py b/cps/tasks/convert.py index e6af356f..b163ecfe 100644 --- a/cps/tasks/convert.py +++ b/cps/tasks/convert.py @@ -39,6 +39,7 @@ from cps.file_helper import get_temp_dir from cps.tasks.mail import TaskEmail from cps import gdriveutils, helper from cps.constants import SUPPORTED_CALIBRE_BINARIES +from cps.string_helper import strip_whitespaces log = logger.create() @@ -107,7 +108,7 @@ class TaskConvert(CalibreTask): try: EmailText = N_(u"%(book)s send to E-Reader", book=escape(self.title)) for email in self.ereader_mail.split(','): - email = email.strip() + email = strip_whitespaces(email) worker_thread.add(self.user, TaskEmail(self.settings['subject'], self.results["path"], filename, @@ -255,7 +256,7 @@ class TaskConvert(CalibreTask): try: # path_tmp_opf = self._embed_metadata() if config.config_embed_metadata: - quotes = [3, 5] + quotes = [5] tmp_dir = get_temp_dir() calibredb_binarypath = os.path.join(config.config_binariesdir, SUPPORTED_CALIBRE_BINARIES["calibredb"]) my_env = os.environ.copy() diff --git a/cps/tasks/database.py b/cps/tasks/database.py index e5aa26da..c9c30d43 100644 --- a/cps/tasks/database.py +++ b/cps/tasks/database.py @@ -16,11 +16,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from urllib.request import urlopen - from flask_babel import lazy_gettext as N_ -from cps import config, logger +from cps import config, logger, db, ub from cps.services.worker import CalibreTask @@ -28,18 +26,12 @@ class TaskReconnectDatabase(CalibreTask): def __init__(self, task_message=N_('Reconnecting Calibre database')): super(TaskReconnectDatabase, self).__init__(task_message) self.log = logger.create() - self.listen_address = config.get_config_ipaddress() - self.listen_port = config.config_port + self.calibre_db = db.CalibreDB(expire_on_commit=False, init=True) def run(self, worker_thread): - address = self.listen_address if self.listen_address else 'localhost' - port = self.listen_port if self.listen_port else 8083 - - try: - urlopen('http://' + address + ':' + str(port) + '/reconnect') - self._handleSuccess() - except Exception as ex: - self._handleError('Unable to reconnect Calibre database: ' + str(ex)) + self.calibre_db.reconnect_db(config, ub.app_DB_path) + self.calibre_db.session.close() + self._handleSuccess() @property def name(self): diff --git a/cps/tasks/mail.py b/cps/tasks/mail.py index 4f85eefa..f332e267 100644 --- a/cps/tasks/mail.py +++ b/cps/tasks/mail.py @@ -34,6 +34,7 @@ from cps.services import gmail from cps.embed_helper import do_calibre_export from cps import logger, config from cps import gdriveutils +from cps.string_helper import strip_whitespaces import uuid log = logger.create() @@ -127,9 +128,9 @@ class TaskEmail(CalibreTask): try: # Parse out the address from the From line, and then the domain from that from_email = parseaddr(self.settings["mail_from"])[1] - msgid_domain = from_email.partition('@')[2].strip() + msgid_domain = strip_whitespaces(from_email.partition('@')[2]) # This can sometimes sneak through parseaddr if the input is malformed - msgid_domain = msgid_domain.rstrip('>').strip() + msgid_domain = strip_whitespaces(msgid_domain.rstrip('>')) except Exception: msgid_domain = '' return msgid_domain or 'calibre-web.com' diff --git a/cps/tasks/thumbnail.py b/cps/tasks/thumbnail.py index 2921ffc9..884ae0c3 100644 --- a/cps/tasks/thumbnail.py +++ b/cps/tasks/thumbnail.py @@ -20,14 +20,13 @@ import os from shutil import copyfile, copyfileobj from urllib.request import urlopen from io import BytesIO +from datetime import datetime, timezone from .. import constants from cps import config, db, fs, gdriveutils, logger, ub from cps.services.worker import CalibreTask, STAT_CANCELLED, STAT_ENDED -from datetime import datetime from sqlalchemy import func, text, or_ from flask_babel import lazy_gettext as N_ - try: from wand.image import Image use_IM = True @@ -36,7 +35,7 @@ except (ImportError, RuntimeError) as e: def get_resize_height(resolution): - return int(225 * resolution) + return int(255 * resolution) def get_resize_width(resolution, original_width, original_height): @@ -70,11 +69,11 @@ class TaskGenerateCoverThumbnails(CalibreTask): self.log = logger.create() self.book_id = book_id self.app_db_session = ub.get_new_session_instance() - # self.calibre_db = db.CalibreDB(expire_on_commit=False, init=True) self.cache = fs.FileSystem() self.resolutions = [ constants.COVER_THUMBNAIL_SMALL, - constants.COVER_THUMBNAIL_MEDIUM + constants.COVER_THUMBNAIL_MEDIUM, + constants.COVER_THUMBNAIL_LARGE ] def run(self, worker_thread): @@ -124,7 +123,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): .query(ub.Thumbnail) \ .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_COVER) \ .filter(ub.Thumbnail.entity_id == book_id) \ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.now(timezone.utc))) \ .all() def create_book_cover_thumbnails(self, book): @@ -166,7 +165,7 @@ class TaskGenerateCoverThumbnails(CalibreTask): self.app_db_session.rollback() def update_book_cover_thumbnail(self, book, thumbnail): - thumbnail.generated_at = datetime.utcnow() + thumbnail.generated_at = datetime.now(timezone.utc) try: self.app_db_session.commit() @@ -198,7 +197,8 @@ class TaskGenerateCoverThumbnails(CalibreTask): img.format = thumbnail.format img.save(filename=filename) else: - with open(filename, 'rb') as fd: + stream.seek(0) + with open(filename, 'wb') as fd: copyfileobj(stream, fd) except Exception as ex: @@ -323,12 +323,12 @@ class TaskGenerateSeriesThumbnails(CalibreTask): .all() def get_series_thumbnails(self, series_id): - return self.app_db_session \ - .query(ub.Thumbnail) \ - .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_SERIES) \ - .filter(ub.Thumbnail.entity_id == series_id) \ - .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.utcnow())) \ - .all() + return (self.app_db_session + .query(ub.Thumbnail) + .filter(ub.Thumbnail.type == constants.THUMBNAIL_TYPE_SERIES) + .filter(ub.Thumbnail.entity_id == series_id) + .filter(or_(ub.Thumbnail.expiration.is_(None), ub.Thumbnail.expiration > datetime.now(timezone.utc))) + .all()) def create_series_thumbnail(self, series, series_books, resolution): thumbnail = ub.Thumbnail() @@ -347,7 +347,7 @@ class TaskGenerateSeriesThumbnails(CalibreTask): self.app_db_session.rollback() def update_series_thumbnail(self, series_books, thumbnail): - thumbnail.generated_at = datetime.utcnow() + thumbnail.generated_at = datetime.now(timezone.utc) try: self.app_db_session.commit() diff --git a/cps/tasks_status.py b/cps/tasks_status.py index fc3c9914..268200d4 100644 --- a/cps/tasks_status.py +++ b/cps/tasks_status.py @@ -17,7 +17,7 @@ from markupsafe import escape from flask import Blueprint, jsonify -from flask_login import login_required, current_user +from .cw_login import current_user from flask_babel import gettext as _ from flask_babel import format_datetime from babel.units import format_unit @@ -26,6 +26,7 @@ from . import logger from .render_template import render_title_template from .services.worker import WorkerThread, STAT_WAITING, STAT_FAIL, STAT_STARTED, STAT_FINISH_SUCCESS, STAT_ENDED, \ STAT_CANCELLED +from .usermanagement import user_login_required tasks = Blueprint('tasks', __name__) @@ -33,14 +34,14 @@ log = logger.create() @tasks.route("/ajax/emailstat") -@login_required +@user_login_required def get_email_status_json(): tasks = WorkerThread.get_instance().tasks return jsonify(render_task_status(tasks)) @tasks.route("/tasks") -@login_required +@user_login_required def get_tasks_status(): # if current user admin, show all email, otherwise only own emails return render_title_template('tasks.html', title=_("Tasks"), page="tasks") @@ -81,6 +82,7 @@ def render_task_status(tasklist): ret['task_id'] = task.id ret['stat'] = task.stat ret['is_cancellable'] = task.is_cancellable + ret['error'] = task.error rendered_tasklist.append(ret) diff --git a/cps/templates/detail.html b/cps/templates/detail.html index bca7b1c8..b52a231b 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -20,7 +20,7 @@ {{ _('Download') }} : {% for format in entry.data %} - {{ format.format }} @@ -36,7 +36,7 @@ diff --git a/cps/templates/locales/en/translation.json b/cps/templates/locales/en/translation.json deleted file mode 100644 index 655669ee..00000000 --- a/cps/templates/locales/en/translation.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "input": { - "placeholder": "a placeholder" - }, - "nav": { - "home": "Home", - "page1": "Page One", - "page2": "Page Two" - } -} \ No newline at end of file diff --git a/cps/templates/search_form.html b/cps/templates/search_form.html index cf2fac04..cdce85a5 100644 --- a/cps/templates/search_form.html +++ b/cps/templates/search_form.html @@ -158,21 +158,41 @@ {% if cc|length > 0 %} {% for c in cc %}
+ {% if c.datatype == 'bool' %} {% endif %} {% if c.datatype == 'int' %} - +
+
+ + +
+
+ + +
+
{% endif %} - {% if c.datatype == 'float' %} - +
+
+ + +
+
+ + +
+
+ {% endif %} {% if c.datatype == 'datetime' %} diff --git a/cps/templates/shelf.html b/cps/templates/shelf.html index bf0b1ab4..d0fdb399 100644 --- a/cps/templates/shelf.html +++ b/cps/templates/shelf.html @@ -25,6 +25,8 @@ + +
{% endif %} {% endif %} diff --git a/cps/templates/shelfdown.html b/cps/templates/shelfdown.html index 19a42b01..cb183a03 100644 --- a/cps/templates/shelfdown.html +++ b/cps/templates/shelfdown.html @@ -55,7 +55,7 @@ {% if entry.Books.data|length %}
{% for format in entry.Books.data %} - + {{format.format}} ({{ format.uncompressed_size|filesizeformat }}) {% endfor %} diff --git a/cps/templates/tasks.html b/cps/templates/tasks.html index 4d645aa5..83d4e804 100644 --- a/cps/templates/tasks.html +++ b/cps/templates/tasks.html @@ -16,6 +16,7 @@ {{_('Progress')}} {{_('Run Time')}} {{_('Start Time')}} + {{_('Message')}} {% if current_user.role_admin() %} {{_('Actions')}} {% endif %} diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index bbb7a70d..b24c6ec0 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -25,7 +25,7 @@
{% endif %}
- +
{% if not content.role_anonymous() %} diff --git a/cps/translations/cs/LC_MESSAGES/messages.mo b/cps/translations/cs/LC_MESSAGES/messages.mo index 0ef2c43c..58388dd0 100644 Binary files a/cps/translations/cs/LC_MESSAGES/messages.mo and b/cps/translations/cs/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/cs/LC_MESSAGES/messages.po b/cps/translations/cs/LC_MESSAGES/messages.po index d9bc237a..c4414ecb 100644 --- a/cps/translations/cs/LC_MESSAGES/messages.po +++ b/cps/translations/cs/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-06-09 21:11+0100\n" "Last-Translator: Lukas Heroudek \n" "Language: cs_CZ\n" @@ -15,451 +15,451 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistika" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Server restartován, znovu načtěte stránku" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Vypínám server, zavřete okno" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Neznámý příkaz" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(eReadermail)s" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Neznámý" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Stránka správce" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Základní konfigurace" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Konfigurace uživatelského rozhraní" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Uživatel admin" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Vše" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Uživatel nenalezen" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zobrazit vše" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Nezbývá žádný správce, nelze odebrat roli správce" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Konfigurace Calibre-Web aktualizována" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Opravdu chcete odstranit Kobo token?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Jste si jisti, že chcete odstranit tuto polici?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Jste si jisti, že chcete odstranit tuto polici?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Jste si jisti, že chcete odstranit tuto polici?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Jste si jisti, že chcete odstranit tuto polici?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Opravdu chcete vypnout?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Zakázat" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Povolit" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json není nakonfigurováno pro webové aplikace" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění zápisového souboru není platné. Určete prosím platnou polohu" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění zápisového souboru pro přístup není platné. Určete prosím platnou polohu" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Prosím zadejte LDAP poskytovatele, port, DN a Identifikátor objektu uživatele" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filtr objektů skupiny LDAP musí mít jeden “%s” formátový identifikátor" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtr objektů skupiny LDAP má nesrovnatelnou závorku" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr uživatelských objektů LDAP musí mít jeden “%s” formátový identifikátor" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtr uživatelských objektů LDAP má nesrovnatelnou závorku" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Přidat nového uživatele" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Změnit SMTP nastavení" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Chyba databáze: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Při odesílání zkušebního e-mailu došlo k chybě: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Prvně nastavte svou e-mailovou adresu..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Nastavení e-mailového serveru aktualizováno" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Upravit uživatele %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Heslo pro uživatele %(user)s resetováno" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Prohlížeč log souborů" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Požadování balíčku aktualizace" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Stahování balíčku aktualizace" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Rozbalování balíčku aktualizace" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Nahrazování souborů" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Databázová připojení jsou uzavřena" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Zastavuji server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Aktualizace dokončena, klepněte na tlačítko OK a znovu načtěte stránku" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Aktualizace selhala:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Chyba připojení" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Vypršel časový limit při navazování spojení" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Všeobecná chyba" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Aktualizační soubor nemohl být uložen do Temp Dir" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Nepodařilo se vytvořit nejméně jednoho uživatele LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Chyba: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Chyba: Žádná reakce od uživatele LDAP serveru" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Nejméně jeden uživatel LDAP nenalezen v databázi" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Umístění databáze není platné, opravte prosím cestu" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Databáze není zapisovatelná" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění souboru klíčů není platné, zadejte prosím správnou cestu" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Umístění certifikátu není platné, zadejte prosím správnou cestu" @@ -477,7 +477,7 @@ msgstr "Nastavení e-mailového serveru aktualizováno" msgid "Database Configuration" msgstr "Konfigurace funkcí" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Vyplňte všechna pole!" @@ -512,7 +512,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "Nezbývá žádný správce, nemůžete jej odstranit" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -529,128 +529,128 @@ msgstr "není nainstalováno" msgid "Execution permissions missing" msgstr "Chybí povolení k exekuci" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Vlastní sloupec %(column)d neexistuje v databázi" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Žádné" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Jejda! Vybraná kniha není k dispozici. Soubor neexistuje nebo není přístupný" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata úspěšně aktualizována" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Soubor %(file)s nahrán" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Chybí zdrojový nebo cílový formát pro převod" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kniha byla úspěšně zařazena do fronty pro převod do %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Při převodu této knihy došlo k chybě: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Nahraná kniha pravděpodobně existuje v knihovně, zvažte prosím změnu před nahráním nové: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s není platným jazykem" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Soubor s příponou '%(ext)s' nelze odeslat na tento server" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Soubor s příponou '%(ext)s' nelze odeslat na tento server" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Soubor, který má být odeslán musí mít příponu" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Soubor %(filename)s nemohl být uložen do dočasného adresáře" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Nepodařilo se přesunout soubor obalu %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Formát knihy úspěšně smazán" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Kniha úspěšně smazána" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "upravit metadata" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nepodařilo se vytvořit cestu %(path)s (oprávnění odepřeno)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Uložení souboru %(file)s se nezdařilo." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formát souboru %(ext)s přidán do %(book)s" @@ -663,486 +663,486 @@ msgstr "Google Drive nastavení nebylo dokončeno, zkuste znovu deaktivovat a a msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Doména zpětného volání není ověřena, postupujte podle pokynů k ověření domény v konzole pro vývojáře google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formát pro knihu: %(book)d nenalezen" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s nenalezen na Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s nenalezen: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Poslat do Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Tento e-mail byl odeslán přes Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web zkušební e-mail" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Zkušební e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Začínáme s Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Registrační e-mail pro uživatele: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Převést %(orig)s do %(format)s a poslat do Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Poslat %(format)s do Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Poslat do Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Požadovaný soubor nelze přečíst. Možná nesprávná oprávnění?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Mazání knihy selhalo %(id)s failed: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Mazání knihy %(id)s, cesta ke knize není platná %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Přejmenování názvu z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Soubor %(file)s nenalezen na Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Přejmenování názvu z: '%(src)s' na '%(dest)s' selhalo chybou: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Cesta ke knize %(path)s nebyla nalezena na Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Zadané uživatelské jméno je již použito" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Chyba stahování obalu" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Chyba formátu obalu" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Vytvoření cesty obalu selhalo" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Soubor obalu není platný, nebo nelze uložit" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Pouze jpg/jpeg jsou podporované soubory pro obal" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Objevte" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar binární soubor nenalezen" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Chyba provádění UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Databáze není zapisovatelná" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Chybí povolení k exekuci" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Chyba provádění UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Pro získání platného api_endpoint pro zařízení Kobo, přístupte na calibre-web bez localhost" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo nastavení" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registrovat s %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "nyní jste přihlášen jako: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Připojení k %(oauth)s úspěšné" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Přihlášení selhalo, žádný uživatel s OAuth účtem" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Odpojení od %(oauth)s úspěšné" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Odpojení od %(oauth)s selhalo" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Přihlášení pomocí GitHub selhalo." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Nepodařilo se načíst informace o uživateli z GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Přihlášení pomocí Google selhalo." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Nepodařilo se načíst informace o uživateli z Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth chyba, prosím opakujte později." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth chyba, prosím opakujte později." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Přihlásit" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token nenalezen" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token vypršel" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Úspěch! Vraťte se prosím do zařízení" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Knihy" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Zobrazit nedávné knihy" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Žhavé knihy" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Zobrazit žhavé knihy" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Nejlépe hodnocené knihy" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Zobrazit nejlépe hodnocené knihy" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Přečtené knihy" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Zobrazit prečtené a nepřečtené" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Nepřečtené knihy" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Zobrazit nepřečtené" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Objevte" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Zobrazit náhodné knihy" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategorie" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Zobrazit výběr kategorie" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Série" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Zobrazit výběr sérií" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autoři" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Zobrazit výběr autora" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Vydavatelé" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Zobrazit výběr vydavatele" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Jazyky" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Zobrazit výběr jazyka" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Hodnocení" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Zobrazit výběr hodnocení" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formáty souborů" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Zobrazit výběr formátů" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Archivované knihy" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Zobrazit archivované knihy" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Hledat" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Vydáno po " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Vydáno před " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Hodnocení <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Hodnocení >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Rozšířené hledání" @@ -1253,45 +1253,45 @@ msgstr "Veřejná police s názvem '%(title)s' již existuje." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Osobní police s názvem ‘%(title)s’ již existuje." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Police: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Chyba otevírání police. Police neexistuje nebo není přístupná" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Úlohy" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Čekám" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Selhalo" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Spuštěno" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Dokončeno" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Neznámý stav" @@ -1324,178 +1324,178 @@ msgstr "Nová aktualizace k dispozici. Klepnutím na tlačítko níže aktualizu msgid "No release information available" msgstr "Nejsou k dispozici žádné informace o verzi" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Objevte (Náhodné knihy)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Žhavé knihy (Nejstahovanější)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autoři: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavatel: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnocení: %(rating)s stars" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Soubor formátů: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Jazyky: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Stáhnutí" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Seznam hodnocení" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Seznam formátů" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Při odesílání této knihy došlo k chybě: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrovat" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Váš e-mail nemá povolení k registraci" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Potvrzovací e-mail byl odeslán na váš účet." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Nelze aktivovat ověření LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "nyní jste přihlášen jako: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Záložní přihlášení jako: ‘%(nickname)s’, server LDAP není dosažitelný nebo neznámý uživatel" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Nelze se přihlásit: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Špatné uživatelské jméno nebo heslo" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nové heslo bylo zasláno na vaši emailovou adresu" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Neznámá chyba. Opakujte prosím později." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Zadejte platné uživatelské jméno pro obnovení hesla" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "nyní jste přihlášen jako: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s profil" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profil aktualizován" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." @@ -1504,54 +1504,58 @@ msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu." msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Poslat do Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre převaděč %(tool)s nenalezen" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-převaděč selhal: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Převedený soubor nebyl nalezen nebo více než jeden soubor ve složce %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Převaděč eknih selhal: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Převaděč eknih selhal: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1560,11 +1564,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "upravit metadata" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1602,7 +1602,7 @@ msgstr "Přezdívka" msgid "Email" msgstr "E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Poslat do Kindle e-mailová adresa" @@ -1835,7 +1835,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Zrušit" @@ -1887,7 +1887,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "redukovat" @@ -1994,12 +1994,12 @@ msgid "Language" msgstr "Jazyk" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ano" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Ne" @@ -2163,7 +2163,7 @@ msgid "Enter " msgstr "Identifikátory" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Jste si opravdu jisti?" @@ -2942,7 +2942,7 @@ msgstr "Chyba" msgid "Upload done, processing, please wait..." msgstr "Nahrávání hotovo, zpracovávám, čekejte prosím..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Nastavení" @@ -3079,7 +3079,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Kniha" @@ -3088,36 +3088,76 @@ msgstr "Kniha" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web katalog eknih" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "Čtečka PDF" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Světlý" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Tmavý" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Zpět" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Po otevření postranních panelů přeformátujte text." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Smazat" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Čekám" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Svisle" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Přečteno" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3319,11 +3359,11 @@ msgstr "Datum vydání od" msgid "Published Date To" msgstr "Datum vydání do" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3360,11 +3400,13 @@ msgstr "Hodnoceni více než" msgid "Rating Below" msgstr "Hodnocení méně než" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3388,6 +3430,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Sdílet se všemi" @@ -3456,15 +3506,19 @@ msgstr "Průběh" msgid "Run Time" msgstr "Doba spuštění" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3472,6 +3526,10 @@ msgstr "" msgid "Reset user Password" msgstr "Resetovat uživatelské heslo" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Zobrazit knihy s jazykem" diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index 0c47e64c..41756d9f 100644 Binary files a/cps/translations/de/LC_MESSAGES/messages.mo and b/cps/translations/de/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/de/LC_MESSAGES/messages.po b/cps/translations/de/LC_MESSAGES/messages.po index 3da542fb..531cfc8e 100644 --- a/cps/translations/de/LC_MESSAGES/messages.po +++ b/cps/translations/de/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" -"PO-Revision-Date: 2023-10-21 15:45+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" +"PO-Revision-Date: 2024-08-17 13:49+0200\n" "Last-Translator: Ozzie Isaacs\n" "Language: de\n" "Language-Team: \n" @@ -16,439 +16,439 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistiken" -#: cps/admin.py:150 +#: cps/admin.py:151 msgid "Server restarted, please reload page." msgstr "Server neu gestartet, Seite bitte neu laden." -#: cps/admin.py:152 +#: cps/admin.py:153 msgid "Performing Server shutdown, please close window." msgstr "Server wird heruntergefahren, Fenster bitte schließen." -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "Datenbank wurde erneut verbunden" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Unbekannter Befehl" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Bücher wurden für Metadaten Backup eingereiht, für das Ergebnis bitte Aufgaben überprüfen" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Unbekannt" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Admin Seite" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Basiskonfiguration" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Benutzeroberflächenkonfiguration" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Benutzer bearbeiten" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alle" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Benutzer nicht gefunden" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} Benutzer erfolgreich gelöscht" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zeige alle" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Ungültige Anfrage" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Guest Name kann nicht geändert werden" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Guest Benutzer kann diese Rolle nicht haben" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Kein Admin Benutzer verblieben Admin Berechtigung kann nicht entfernt werden" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Wert muss true oder false sein" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Ungültige Rolle" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Guest Benutzer kann diese Sichtbarkeit nicht haben" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Ungültige Sichtbarkeit" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Guest Sprache wird automatisch bestimmt und kann nicht eingestellt werden" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Keine gültige Sprache gewählt" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Keine gültige Buchsprache gewählt" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter wurde nicht gefunden" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Ungültige Lese Spalte" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Ungültiger Spaltenname für Einschränkung" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Konfiguration von Calibre-Web wurde aktualisiert" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Möchten Sie wirklich den Kobo Token löschen?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Möchten Sie wirklich diese Domain löschen?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Möchten Sie wirklich diesen Benutzer löschen?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Möchten Sie wirklich dieses Bücherregal löschen?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Möchten Sie wirklich die Anzeigesprache der ausgewählten Benutzer ändern?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Möchten Sie wirklich die Büchersprachen für die ausgewählten Benutzer ändern?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Möchten Sie wirklich die ausgewählte Rolle für die ausgewählten Benutzer verändern?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Möchten Sie wirklich die ausgewählten Sichtbarkeitsbeschränkungen der ausgewählten Benutzer ändern?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Möchten Sie wirklich die Sichtbarkeiten für die ausgewählten Benutzer verändern?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Möchten Sie wirklich die Synchronisation von Bücherregalen für die ausgewählten Benutzer verändern?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Ort der Calibre Datenbank editieren?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web wird nach neuen Covern suchen und Cover Miniaturansichten aktualisieren, dies kann eine Weile dauern?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Möchten Sie wirklich die Synchronisationsdatenbank von Calibre-Web löschen, um eine komplette Synchronisation zu erzwingen?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Verbieten" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Erlauben" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} Synchronisationseinträge gelöscht" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Tag nicht gefunden" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ungültige Aktion" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json ist nicht für Web Anwendungen konfiguriert" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Logdatei Pfad ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Zugriffs Logdatei Pfad ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Bitte einen LDAP Server, Port, DN und Benutzer Objekt angeben" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Bitte einen LDAP Service Account und Password eingeben" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Bitte einen LDAP Service Account eingeben" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Gruppen Objekt Filter benötigt genau eine \"%s\" Format Kennung" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP Gruppen Objekt Filter hat ungleiche Anzahl von Klammern" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Benutzer Objekt Filter benötigt genau eine \"%s\" Format Kennung" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP Benutzer Objekt Filter hat ungleiche Anzahl von Klammern" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Der LDAP Member User Filter benötigt genau eine \"%s\" Formatierungsmarkierung" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP Member User Filter hat eine ungleiche Anzahl von geöffneten und geschlossenen Klammern" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-Zertifikat, Zertifikat oder Key Datei ist kein gültiger Pfad" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Neuen Benutzer hinzufügen" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP-Einstellungen ändern" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "G-Mail Konto verifiziert." -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Datenbankfehler: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail an %(email)s wurde zum Senden in die Warteschlange eingereiht, für das Ergebnis bitte Aufgaben überprüfen" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Es trat ein Fehler beim Versenden der Test-E-Mail auf: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Bitte zuerst E-Mail Adresse konfigurieren..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Einstellungen des E-Mail-Servers aktualisiert" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Einstellungen für Geplante Aufgaben" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Ungültigen Startzeitpunkt für Aufgaben spezifiziert" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Ungültige Laufzeit für Aufgaben spezifiziert" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Einstellungen für Geplante Aufgaben aktualisiert" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Einstellungsdatenbank ist nicht schreibbar" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Benutzer %(nick)s bearbeiten" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Logdatei Anzeige" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Frage Update an" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Lade Update herunter" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Entpacke Update" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Ersetze Dateien" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Schließe Datenbankverbindungen" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Stoppe Server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Update fehlgeschlagen:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Fehler" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Verbindungsfehler" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Timeout beim Verbindungsaufbau" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Allgemeiner Fehler" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Updatedatei konnte nicht in Temporärem Ordner gespeichert werden" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Dateien konnten während des Updates nicht ausgetauscht werden" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht extrahiert werden" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Mindestens ein LDAP Benutzer konnte nicht erzeugt werden" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fehler: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Fehler: Keine Benutzerinformationen von LDAP Server empfangen" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Mindestens ein LDAP Benutzer wurde nicht in der Datenbank gefudnen" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Benutzer erfolgreich importiert" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB Pfad ist nicht gültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Datenbank ist nicht schreibbar" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Schlüsseldatei ist ungültig, bitte einen gültigen Pfad angeben" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Zertifikatsdatei ist ungültig, bitte einen gültigen Pfad angeben" @@ -464,7 +464,7 @@ msgstr "Datenbankeinstellung aktualisiert" msgid "Database Configuration" msgstr "Datenbank-Konfiguration" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Bitte alle Felder ausfüllen." @@ -498,7 +498,7 @@ msgstr "Guest Benutzer kann nicht gelöscht werden" msgid "No admin user remaining, can't delete user" msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "E-Mail kann nicht leer sein und muss gültig sein" @@ -515,128 +515,127 @@ msgstr "Nicht installiert" msgid "Execution permissions missing" msgstr "Ausführeberechtigung fehlt" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Benutzerdefinierte Spalte Nr. %(column)d ist nicht in Calibre Datenbank vorhanden" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Keine" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Benutzer hat keine Berechtigung Cover hochzuladen" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDs unterscheiden nicht Groß-Kleinschreibung, alte ID wird überschrieben" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadaten wurden erfolgreich aktualisiert" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Fehler beim editieren des Buches: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Datei %(file)s hochgeladen" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Quell- oder Zielformat für Konvertierung fehlt" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Buch wurde erfolgreich für die Konvertierung nach %(book_format)s eingereiht" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Es trat ein Fehler beim Konvertieren des Buches auf: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Das hochgeladene Buch existiert evtl. schon in der Bibliothek: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' ist keine gültige Sprache" -#: cps/editbooks.py:756 cps/editbooks.py:1192 -#, fuzzy +#: cps/editbooks.py:766 cps/editbooks.py:1202 msgid "File type isn't allowed to be uploaded to this server" -msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden" +msgstr "Dateityp kann nicht auf diesen Server hochgeladen werden" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Dateien müssen eine Erweiterung haben, um hochgeladen zu werden" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Die Datei %(filename)s konnte nicht im temporären Ordner gespeichert werden" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Fehler beim Verschieben der Cover Datei %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Buch Format erfolgreich gelöscht" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Buch erfolgreich gelöscht" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Keine Erlaubnis zum Bücher löschen" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "Metadaten editieren" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" -msgstr "%(seriesindex)s ist keine gültige Zahl, Eintrag wird ignoriert" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" +msgstr "Serien index %(seriesindex)s ist keine gültige Zahl, Eintrag wird ignoriert" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Benutzer hat kein Recht zusätzliche Dateiformate hochzuladen" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Fehler beim Speichern der Datei %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" @@ -649,470 +648,468 @@ msgstr "Google Drive Setup is nicht komplett, bitte versuche Google Drive zu dea msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Callback Domain ist nicht verifiziert, bitte Domain in der Google Developer Console verifizieren" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s Format für Buch-ID %(book)d nicht gefunden" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s nicht gefunden: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "An E-Reader senden" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "Diese E-Mail wurde durch Calibre-Web versendet." -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "Calibre-Web Test-E-Mail" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "Test E-Mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Loslegen mit Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "Registrierungs-E-Mail für Benutzer: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Konvertiere %(orig)s nach %(format)s und sende an E-Reader" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, python-format msgid "Send %(format)s to eReader" msgstr "Sende %(format)s an E-Reader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, python-format msgid "%(book)s send to eReader" msgstr "%(book)s an E-Reader gesendet" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Gelesenen Status konnte nicht aktualisiert werden: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Löschen des Ordners für Buch %(id)s ist fehlgeschlagen, der Pfad hat Unterordner: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Löschen von Buch %(id)s fehlgeschlagen: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Lösche Buch %(id)s nur aus Datenbank, Pfad zum Buch in Datenbank ist nicht gültig: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Umbenennen des Autors '%(src)s' zu '%(dest)s' schlug fehl: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Umbenennen des Titels '%(src)s' zu '%(dest)s' schlug fehl: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "Es existiert bereits ein Benutzerkonto für diese E-Mail Adresse" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Benutzername ist schon vorhanden" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "Ungültiges E-Mail Adressformat" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "Passwort stimmt nicht mit den Passwortregln überein" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Python Module 'advocate' ist nicht installiert, wird aber für das Cover hochladen benötigt" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Fehler beim Herunterladen des Covers" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Coverdatei fehlerhaft" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Keine Berechtigung Cover von Localhost oder dem lokalen Netzwerk hochzuladen" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Fehler beim Erzeugen des Ordners für die Coverdatei" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Cover Datei ist keine gültige Bilddatei, kann nicht gespeichert werden" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Nur jpg/jpeg/png/webp/bmp Dateien werden als Coverdatei unterstützt" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Ungültiger Cover Dateiinhalt" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Es werden nur jpg/jpeg Dateien als Cover untertützt" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "Titelbild" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar Programm nicht gefunden" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Fehler beim Ausführen von UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" -msgstr "" +msgstr "Angegebener Ordner konnte nicht gefunden werden" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" -msgstr "" +msgstr "Bitte keine Datei sondern einen Ordner angeben" -#: cps/helper.py:1064 -#, fuzzy +#: cps/helper.py:1042 msgid "Calibre binaries not viable" -msgstr "Datenbank ist nicht schreibbar" +msgstr "Calibre Programm ist nicht nutzbar" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" -msgstr "" +msgstr "Fehlende Calibre Binärdateien: %(missing)s" -#: cps/helper.py:1075 -#, fuzzy, python-format +#: cps/helper.py:1053 +#, python-format msgid "Missing executable permissions: %(missing)s" -msgstr "Ausführeberechtigung fehlt" +msgstr "Ausführeberechtigung fehlt: %(missing)s" -#: cps/helper.py:1080 -#, fuzzy +#: cps/helper.py:1058 msgid "Error executing Calibre" -msgstr "Fehler beim Ausführen von UnRar" +msgstr "Fehler beim Ausführen von Calibre" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Alle Bücher für Metadaten Backup einreihen" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Bitte nicht von \"localhost\" auf Calibre-Web zugreifen, um einen gültigen api_endpoint für Kobo Geräte zu erhalten" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo Setup" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Anmelden mit %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Verbindung mit %(oauth)s erfolgreich" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Login fehlgeschlagen, es ist kein Benutzer mit diesem Account verbunden" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Verbindung zu %(oauth)s erfolgreich getrennt" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Verbindung mit %(oauth)s fehlgeschlagen" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Nicht mit %(oauth)s verbunden" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Login mit Github fehlgeschlagen." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Laden der Benutzerinformationen von Github fehlgeschlagen." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Login mit Google fehlgeschlagen." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Laden der Benutzerinformationen von Google fehlgeschlagen." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth Fehler, bitte später erneut versuchen." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Github Oauth Fehler {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth Fehler, bitte später erneut versuchen." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth Fehler: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Sterne" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Login" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token wurde nicht gefunden" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token ist abgelaufen" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Erfolg! Bitte zum Gerät zurückkehren" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Bücher" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Zeige kürzlich hinzugefügte Bücher" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Beliebte Bücher" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Zeige beliebte Bücher" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Heruntergeladene Bücher" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Zeige heruntergeladene Bücher" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Best bewertete Bücher" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Bestbewertete Bücher anzeigen" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Gelesene Bücher" -#: cps/render_template.py:64 +#: cps/render_template.py:63 msgid "Show Read and Unread" msgstr "Zeige gelesene/ungelesene Bücher" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Ungelesene Bücher" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Zeige Ungelesene" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Entdecke" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Zeige zufällige Bücher" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategorien" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 msgid "Show Category Section" msgstr "Zeige Kategorienauswahl" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Serien" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 msgid "Show Series Section" msgstr "Zeige Serienauswahl" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autoren" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 msgid "Show Author Section" msgstr "Zeige Autorenauswahl" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Verleger" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 msgid "Show Publisher Section" msgstr "Zeige Verlegerauswahl" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Sprachen" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 msgid "Show Language Section" msgstr "Zeige Sprachauswahl" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Bewertungen" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 msgid "Show Ratings Section" msgstr "Zeige Bewertungsauswahl" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Dateiformate" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 msgid "Show File Formats Section" msgstr "Zeige Dateiformatauswahl" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Archivierte Bücher" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 msgid "Show Archived Books" msgstr "Zeige archivierte Bücher" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Bücherliste" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Zeige Bücherliste" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Suche" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Herausgegeben nach dem " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Herausgegeben vor dem " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Bewertung <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Bewertung >= %(rating)s" -#: cps/search.py:221 -#, fuzzy, python-format +#: cps/search.py:234 +#, python-format msgid "Read Status = '%(status)s'" -msgstr "Lesestatus = %(status)s" +msgstr "Lesestatus = '%(status)s'" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fehler bei der Suche nach eigenen Spalten, bitte Calibre-Web neustarten" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Erweiterte Suche" @@ -1132,7 +1129,7 @@ msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s" #: cps/shelf.py:77 #, python-format msgid "%(book_id)s is a invalid Book Id. Could not be added to Shelf" -msgstr "" +msgstr "%(book_id)s ist einen ungültige Buch ID. Buch konnte nicht zu Bücherregal hinzugefügt werden" #: cps/shelf.py:97 #, python-format @@ -1220,45 +1217,45 @@ msgstr "Es existiert bereit ein öffentliches Bücherregal mit dem Name '%(title msgid "A private shelf with the name '%(title)s' already exists." msgstr "Es existiert bereit ein privates Bücherregal mit dem Name '%(title)s'." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Bücherregal: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fehler beim Öffnen des Bücherregals. Bücherregal exisitert nicht oder ist nicht zugänglich" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Aufgaben" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Wartend" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Fehlgeschlagen" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Gestartet" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Beendet" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Beendet" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Abgebrochen" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Unbekannter Status" @@ -1291,170 +1288,169 @@ msgstr "Ein neues Update ist verfügbar. Klicke auf den Button unten, um auf Ver msgid "No release information available" msgstr "Keine Releaseinformationen verfügbar" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Entdecke (Zufällige Bücher)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Beliebte Bücher (am meisten Downloads)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Von %(user)s heruntergeladene Bücher" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Verleger: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Bewertung: Keine" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Bewertung: %(rating)s Sterne" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Dateiformat: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategorie: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Sprache: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Bewertungsliste" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Liste der Dateiformate" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Buch erfolgreich zum Senden an %(eReadermail)s eingereiht" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Bitte zuerst die E-Reader E-Mailadresse konfigurieren." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" -msgstr "Bitte eine Minute warten vor der Registrierung des nächsten Benutzers " +msgstr "Bitte eine Minute warten vor der Registrierung des nächsten Benutzers" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrieren" -#: cps/web.py:1281 cps/web.py:1385 -#, fuzzy +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" -msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren." +msgstr "Verbindugnsfehler zu Limiter Backend, bitte Administrator kontaktieren" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren." -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen." -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "LDAP-Authentifizierung kann nicht aktiviert werden" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" -msgstr "Bitte eine Minute vor dem nächsten Loginversuche warten " +msgstr "Bitte eine Minute vor dem nächsten Loginversuche warten" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Rückfall Login als: '%(nickname)s', LDAP Server ist nicht erreichbar, oder der Nutzer ist unbekannt" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "Login nicht erfolgreich: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 msgid "Wrong Username or Password" msgstr "Falscher Benutzername oder Passwort" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." -#: cps/web.py:1429 +#: cps/web.py:1430 msgid "Please enter valid username to reset password" msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Du bist nun eingeloggt als: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s's Profil" -#: cps/web.py:1511 +#: cps/web.py:1519 msgid "Success! Profile Updated" msgstr "Profil aktualisiert" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." @@ -1462,54 +1458,58 @@ msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse." msgid "Found no valid gmail.json file with OAuth information" msgstr "Keine gültige gmail.json Datei mit Oauth informationen gefunden" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "Temp Ordner Inhalt löschen" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s an E-Reader gesendet" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre E-Book Konverter %(tool)s nicht gefunden" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s Format nicht gefunden" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "EBook Converter mit unbekanntem Fehler fehlgeschlagen" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify Konverter Aufruf fehlgeschlagen: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konvertierte Datei nicht gefunden, oder mehr als eine Datei im Pfad %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Fehler des EBook-Converters: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre fehlgeschlagen mit Fehler: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Fehler des EBook-Converters: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Konvertiere" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Calibre Datenbank wird neu verbunden" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-Mail" @@ -1517,11 +1517,7 @@ msgstr "E-Mail" msgid "Backing up Metadata" msgstr "Metadaten Backup läuft" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "%(count)s Cover Miniaturansichten erzeugt" @@ -1559,7 +1555,7 @@ msgstr "Benutzername" msgid "Email" msgstr "E-Mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "An E-Reader E-Mail Adresse senden" @@ -1724,7 +1720,7 @@ msgstr "Mit Calibre Bibliothek neuverbinden" #: cps/templates/admin.html:190 cps/templates/schedule_edit.html:41 msgid "Generate Metadata Backup Files" -msgstr "Metadaten Backup Datei erzeugen " +msgstr "Metadaten Backup Datei erzeugen" #: cps/templates/admin.html:197 msgid "Refresh Thumbnail Cache" @@ -1790,7 +1786,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Abbruch" @@ -1842,7 +1838,7 @@ msgstr "Sortiere nach Herausgabedatum, Älteste zuerst" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "Reduzieren" @@ -1949,12 +1945,12 @@ msgid "Language" msgstr "Sprache" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ja" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nein" @@ -2115,7 +2111,7 @@ msgid "Enter " msgstr "Eingeben " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Sicher?" @@ -2137,7 +2133,7 @@ msgstr "Speicherort der Calibre-Datenbank" #: cps/templates/config_db.html:21 msgid "Separate Book Files from Library" -msgstr "" +msgstr "Bücherdateien von Bibliotheksdatei separieren" #: cps/templates/config_db.html:34 msgid "Use Google Drive?" @@ -2221,7 +2217,7 @@ msgstr "Nicht-englische Zeichen in Titel und Autor beim Speichern auf Festplatte #: cps/templates/config_edit.html:108 msgid "Embed Metadata to Ebook File on Download/Conversion/e-mail (needs Calibre/Kepubify binaries)" -msgstr "" +msgstr "Metadaten bei Download/Konvertierung/E-Mail zu Ebook Datei hinzufügen (benötigt Calibre/Kepubify)" #: cps/templates/config_edit.html:112 msgid "Enable Uploads" @@ -2411,9 +2407,8 @@ msgid "External binaries" msgstr "Externe Programme" #: cps/templates/config_edit.html:325 -#, fuzzy msgid "Path to Calibre Binaries" -msgstr "Pfad zum Calibre E-Book Konverter" +msgstr "Pfad zu Calibre Dateien" #: cps/templates/config_edit.html:333 msgid "Calibre E-Book Converter Settings" @@ -2424,7 +2419,6 @@ msgid "Path to Kepubify E-Book Converter" msgstr "Pfad zum Kepubify E-Book Konverter" #: cps/templates/config_edit.html:344 -#, fuzzy msgid "Location of Unrar binary" msgstr "Pfad zur UnRar-Binärdatei" @@ -2438,15 +2432,15 @@ msgstr "Login Fehlversuche begrenzen" #: cps/templates/config_edit.html:372 msgid "Configure Backend for Limiter" -msgstr "" +msgstr "Backend für Limiter konfigurieren" #: cps/templates/config_edit.html:376 msgid "Options for Limiter Backend" -msgstr "" +msgstr "Optionen für Limiter Backend" #: cps/templates/config_edit.html:382 msgid "Check if file extensions matches file content on upload" -msgstr "" +msgstr "Überprüfe bei Upload ob Dateiinhalt zur Endung passt" #: cps/templates/config_edit.html:385 msgid "Session protection" @@ -2482,7 +2476,7 @@ msgstr "Erzwinge Großbuchstaben" #: cps/templates/config_edit.html:414 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" -msgstr "" +msgstr "Zeichen erzwingen (erforderlich für chinesische/japanische/koreanische Zeichen)" #: cps/templates/config_edit.html:418 msgid "Enforce special characters" @@ -2615,9 +2609,8 @@ msgid "Mark As Read" msgstr "Als gelesen markieren" #: cps/templates/detail.html:254 -#, fuzzy msgid "Mark Book as Read or Unread" -msgstr "Als ungelesen markieren" +msgstr "Buch als gelesen oder ungelesen markieren" #: cps/templates/detail.html:254 cps/templates/listenmp3.html:159 msgid "Read" @@ -2633,12 +2626,11 @@ msgstr "Zum Archiv hinzufügen" #: cps/templates/detail.html:267 msgid "Mark Book as archived or not, to hide it in Calibre-Web and delete it from Kobo Reader" -msgstr "" +msgstr "Buch als archiviert oder nicht markieren, um es in Calibre-Web auszublenden und vom Kobo Reader zu löschen" #: cps/templates/detail.html:267 -#, fuzzy msgid "Archive" -msgstr "Archiviert" +msgstr "Archiv" #: cps/templates/detail.html:278 cps/templates/listenmp3.html:177 msgid "Description:" @@ -2885,7 +2877,7 @@ msgstr "Fehler" msgid "Upload done, processing, please wait..." msgstr "Hochladen beendet, verarbeite Daten, bitte warten..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Einstellungen" @@ -3022,7 +3014,7 @@ msgstr "Übergeordnetes Verzeichnis" msgid "Select" msgstr "Auswahl" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3030,34 +3022,70 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web E-Book-Katalog" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "epub-Leser" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Hell" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Dunkel" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sepia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Schwarz" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Text umbrechen, wenn Seitenleiste geöffnet ist." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "Schriftgröße" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "Schriftart" + +#: cps/templates/read.html:106 +msgid "Default" +msgstr "Standard" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "Yahei" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "SimSun" + +#: cps/templates/read.html:109 +msgid "KaiTi" +msgstr "KaiTi" + +#: cps/templates/read.html:110 +msgid "Arial" +msgstr "Arial" + +#: cps/templates/read.html:113 +msgid "Spread" +msgstr "Aufteilung" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "Zwei Spalten" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "Eine Spalte" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Comic-Leser" @@ -3254,13 +3282,13 @@ msgstr "Herausgabedatum von" msgid "Published Date To" msgstr "Herausgabedatum bis" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" -msgstr "" +msgstr "Beliebig" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" -msgstr "" +msgstr "Leer" #: cps/templates/search_form.html:60 msgid "Exclude Tags" @@ -3294,11 +3322,13 @@ msgstr "Bewertungen größer als" msgid "Rating Below" msgstr "Bewertungen kleiner als" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Von:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Bis:" @@ -3322,6 +3352,14 @@ msgstr "Manuelles Sortieren deaktivieren" msgid "Enable Change order" msgstr "Manuelles Sortieren aktivieren" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "Sortiere nach Buch zu Bücherregal hinzugefügt, Neuestes zuerst" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "Sortiere nach Buch zu Bücherregal hinzugefügt, Ältestes zuerst" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Bücherregal mit anderen Benutzern teilen" @@ -3390,15 +3428,19 @@ msgstr "Fortschritt" msgid "Run Time" msgstr "Laufzeit" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "Meldung" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Aktionen" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Diese Aufgabe wird abgebrochen. Der Fortschritt wird gespeichert." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Dies ist eine geplante Aufgabe, sie wird zur geplanten Zeit erneut ausgeführt." @@ -3406,6 +3448,10 @@ msgstr "Dies ist eine geplante Aufgabe, sie wird zur geplanten Zeit erneut ausge msgid "Reset user Password" msgstr "Benutzerpasswort zurücksetzen" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "An die E-Mail-Adresse des E-Readers senden. Kommas verwenden, um E-Mails für mehrere E-Reader zu trennen" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Zeige nur Bücher mit dieser Sprache" diff --git a/cps/translations/el/LC_MESSAGES/messages.mo b/cps/translations/el/LC_MESSAGES/messages.mo index cb38d170..221927ff 100644 Binary files a/cps/translations/el/LC_MESSAGES/messages.mo and b/cps/translations/el/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/el/LC_MESSAGES/messages.po b/cps/translations/el/LC_MESSAGES/messages.po index 05799f87..a9327026 100644 --- a/cps/translations/el/LC_MESSAGES/messages.po +++ b/cps/translations/el/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Depountis Georgios\n" "Language: el\n" @@ -15,451 +15,451 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Στατιστικά" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Ο διακομιστής επανεκκίνησε, παρακαλούμε φόρτωσε ξανά τη σελίδα" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Πραγματοποιείται κλείσιμο του διακομιστή, παρακαλούμε κλείσε το παράθυρο" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Άγνωστη εντολή" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Το βιβλίο έχει επιτυχώς μπει σε σειρά για αποστολή στο %(eReadermail)s" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "ʼΑγνωστο" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Σελίδα διαχειριστή" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Βασική Διαμόρφωση" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "UI Διαμόρφωση" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Χρήστης Διαχειριστής" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Όλα" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Δεν βρέθηκε χρήστης" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Προβολή Όλων" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να αφαιρεθεί ο ρόλος διαχειριστή" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Ενημερώθηκε η διαμόρφωση Calibre-Web" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Θέλεις πραγματικά να διαγράψεις τη Μονάδα Kobo;" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτό το ράφι;" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτό το ράφι;" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτό το ράφι;" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτό το ράφι;" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Είσαι σίγουρος/η πως θέλεις να κάνεις κλείσιμο;" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Απόρριψη" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Επιτρέπεται" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Δεν Έχει Διαμορφωθεί Για Διαδικτυακή Εφαρμογή" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Το Φύλλο Καταγραφής Τοποθεσίας δεν είναι Έγκυρο, Παρακαλούμε Συμπλήρωσε Τη Σωστή Πορεία" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Η Πρόσβαση Φύλλου Καταγραφης Τοποθεσίας δεν είναι έγκυρη, Παρακαλούμε Συμπλήρωσε Τη Σωστή Πορεία" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Παρακαλούμε Συμπλήρωσε ένα Πάροχο LDAP, Θύρα, DN και Αντικείμενο Αναγνώρισης Χρήστη" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Παρακαλούμε συμπλήρωσε ένα έγκυρο όνομα χρήστη για επαναφορά του κωδικού" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Το Αντικείμενο Φίλτρου Ομάδας LDAP Πρέπει να Έχει Μια \"%s\" Αναγνώριση Μορφής" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Το Αντικείμενο Φίλτρου Ομάδας LDAP Έχει Παρενθέσεις Που Δεν Ταιριάζουν" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Το Αντικείμενο Φίλτρου Χρήστη LDAP πρέπει να Έχει Μια \"%s\" Αναγνώριση Μορφής" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Το Αντικείμενο Φίλτρου Χρήστη LDAP Έχει Παρενθέσεις Που Δεν Ταιριάζουν" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Προσθήκη Νέου Χρήστη" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Επεξεργασία Ρυθμίσεων E-mail Διακομιστή" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Σφάλμα βάσης δεδομένων: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Παρουσιάστηκε σφάλμα κατά την αποστολή του δοκιμαστικού e-mail:% (res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Παρακαλούμε ρύθμισε πρώτα τη διεύθυνση e-mail σου..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομιστή" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Προέκυψε ένα άγνωστο σφάλμα. Παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Επεξεργασία χρήστη %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Κωδικός για επαναφορά %(user) χρήστη/ών" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Παρακαλούμε διαμόρφωσε πρώτα τις ρυθμίσεις ταχυδρομείου SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Προβολέας αρχείου φύλλου καταγραφής" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Αίτημα πακέτου ενημέρωσης" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Κατεβάζει πακέτο ενημέρωσης" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Ανοίγει πακέτο ενημέρωσης" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Αντικατάσταση αρχείων" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Οι συνδέσεις βάσης δεδομένων είναι κλειστές" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Σταματάει το διακομιστή" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Η ενημέρωση τελειώσε, παρακαλούμε πιέστε το εντάξει και φορτώστε ξανά τη σελίδα" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Η ενημέρωση απέτυχε:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Σφάλμα" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Σφάλμα σύνδεσης" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Τελείωσε ο χρόνος κατά την προσπάθεια δημιουργίας σύνδεσης" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Γενικό σφάλμα" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Το Αρχείο Ενημέρωσης Δεν Μπόρεσε Να Αποθηκευτεί σε" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Αποτυχία Δημιουργίας Τουλάχιστον Ενός Χρήστη LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Αποτυχία Δημιουργίας Τουλάχιστον Ενός Χρήστη LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Σφάλμα: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Σφάλμα: Δεν επιστράφηκε χρήστης σε απάντηση του διακομιστή LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Τουλάχιστον Ένας Χρήστης LDAP Δεν Βρέθηκε Στη Βάση Δεδομένων" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Η Τοποθεσία DB δεν είναι Έγκυρη, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Η DB δεν μπορεί να Γραφτεί" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Το Αρχειο Κλειδί Τοποθεσίας δεν είναι Έγκυρο, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Η Τοποθεσία Certfile δεν είναι Έγκυρη, Παρακαλούμε Συμπληρώστε Τη Σωστή Πορεία" @@ -477,7 +477,7 @@ msgstr "Ενημερώθηκαν οι ρυθμίσεις E-mail διακομισ msgid "Database Configuration" msgstr "Διαμόρφωση Λειτουργίας" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Παρακαλούμε συμπλήρωσε όλα τα πεδία!" @@ -512,7 +512,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "Δεν έχει απομείνει χρήστης διαχειριστής, δεν μπορεί να διαγραφεί ο χρήστης" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -529,128 +529,128 @@ msgstr "δεν εγκαταστάθηκε" msgid "Execution permissions missing" msgstr "Λείπουν άδειες εκτέλεσης" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Η ειδικά προσαρμοσμένη στήλη No.%(column)d δεν υπάρχει στο επίπεδο βάσης δεδομένων" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Κανένα" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oυπς! Ο επιλεγμένος τίτλος βιβλίου δεν είναι διαθέσιμος. Το αρχείο δεν υπάρχει ή δεν είναι προσβάσιμο" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Τα αναγνωριστικά δεν έχουν Διάκριση Πεζών-Κεφαλαίων Γραμμάτων, Αντικατάσταση Παλιού Αναγνωριστικού" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Τα μεταδεδομένα ενημερώθηκαν επιτυχώς" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Το αρχείο %(file)s ανέβηκε" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Η δομή πηγής ή προορισμού για μετατροπή λείπει" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Το βιβλίο είναι σε σειρά επιτυχώς για μετατροπή σε %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Υπήρξε ένα σφάλμα στη μετατροπή αυτού του βιβλίου: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Το βιβλίο που ανέβηκε πιθανόν να υπάρχει στη βιβλιοθήκη, σκέψου να το αλλάξεις πριν ανεβάσεις νέο: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s δεν είναι μια έγκυρη γλώσσα" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Η επέκταση αρχείου '%(ext)s' δεν επιτρέπεται να ανέβει σε αυτό το διακομιστή" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Η επέκταση αρχείου '%(ext)s' δεν επιτρέπεται να ανέβει σε αυτό το διακομιστή" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Το αρχείο προς ανέβασμα πρέπει να έχει μια επέκταση" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Το αρχείο %(filename)s δεν μπόρεσε να αποθηκευτεί σε temp dir" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Αποτυχία Μετακίνησης Αρχείου Φόντου %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Η μορφή βιβλίου Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Το Βιβλίο Διαγράφηκε Επιτυχώς" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "επεξεργασία μεταδεδομένων" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Αποτυχεία δημιουργίας πορείας %(path)s (Η άδεια απορρήφθηκε)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Αποτυχία αποθήκευσης αρχείου %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Μορφή αρχείου %(ext)s προστέθηκε σε %(book)s" @@ -663,486 +663,486 @@ msgstr "Η ρύθμιση του Google Drive δεν ολοκληρώθηκε, msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Η ανάκληση ονόματος δεν έχει επαληθευτεί, παρακαλούμε ακολούθησε τα βήματα για την επαλήθευση ονόματος στην κονσόλα προγραμματιστή google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s η δομή δεν βρέθηκε για την ταυτότητα βιβλίου: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s δεν βρέθηκε στο Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s δεν βρέθηκε: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Αποστολή στο Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Αυτό το e-mail έχει σταλεί μέσω Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web δοκιμαστικό e-mail" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Δοκιμαστικό e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Ξεκινήστε με το Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "e-mail εγγραφής για χρήστη: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Μετατροπή %(orig)s σε %(format)s και αποστολή στο Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Αποστολή %(format)s στο Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Αποστολή στο Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Το αρχείου που χητήθηκε δεν μπορεί να διαβαστεί. Μπορεί να υπάρχουν λαθασμένες άδειες;" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Η διαγραφή φακέλου βιβλίου για το βιβλίο %(id)s απέτυχε, η πορεία έχει υπό-φακέλους: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Η διαγραφή βιβλίου %(id)s απέτυχε: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Διαγραφή βιβλίου %(id)s, η πορεία βιβλίου δεν είναι έγκυρη: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Η μετονομασία τίτλου από: '%(src)s' σε '%(dest)s' απέτυχε με σφάλμα: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Το αρχείο %(file)s δεν βρέθηκε στο Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Η μετονομασία τίτλου από: '%(src)s' σε '%(dest)s' απέτυχε με σφάλμα: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Η πορεία βιβλίου %(path)s δεν βρέθηκε στο Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Αυτό το όνομα χρήστη έχει ήδη παρθεί" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Σφάλμα Κατεβάσματος Φόντου" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Σφάλμα Μορφής Φόντου" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Αποτυχία δημιουργίας πορείας για φόντο" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Το αρχείο φόντου δεν είναι ένα έγκυρο αρχείο εικόνας, ή δεν μπόρεσε να αποθηκευτεί" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Μόνο jpg/jpeg αρχεία υποστηρίζονται ως αρχεία φόντου" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Ανακάλυψε" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Δεν βρέθηκε δυαδικό αρχείο UnRar" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Σφάλμα εκτέλεσης UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Η DB δεν μπορεί να Γραφτεί" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Λείπουν άδειες εκτέλεσης" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Σφάλμα εκτέλεσης UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Παρακαλούμε λάβε πρόσβαση στο calibre-web από ένα μη τοπικό εξηπηρετητή για να λάβεις μια έγκυρη api_endpoint για συσκευή kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Καθορισμός Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Εγγραφή με %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Η Σύνδεση στο %(oauth)s Πέτυχε" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Η σύνδεση απέτυχε, Δεν Υπάρχει Συνδεδεμένος Χρήστης Με Λογαριασμό OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Η αφαίρεση σύνδεσης με το %(oauth)s Πέτυχε" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Η αφαίρεση σύνδεσης με το %(oauth)s Απέτυχε" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Δεν Είναι Συνδεδεμένο με το %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Αποτυχία σύνδεσης με GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Αποτυχία συγκέντρωσης πληροφοριών χρήστη από το GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Αποτυχία σύνδεσης με το Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Αποτυχία συγκέντρωσης πληροφοριών χρήστη από το Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth σφάλμα, παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth σφάλμα, παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Σύνδεση" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Η μάρκα δεν βρέθηκε" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Η μάρκα έχει λήξει" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Επιτυχία! Παρακαλούμε επέστρεψε στη συσκευή σου" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Βιβλία" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Προβολή πρόσφατων βιβλίων" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Βιβλία στη Μόδα" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Προβολή Βιβλίων στη Μόδα" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Κατεβασμένα Βιβλία" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Προβολή Κατεβασμένων Βιβλίων" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Βιβλία με Κορυφαία Αξιολόγηση" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Προβολή Βιβλίων με Κορυφαία Αξιολόγηση" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Βιβλία που Διαβάστηκαν" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Προβολή διαβασμένων και αδιάβαστων" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Βιβλία που δεν Διαβάστηκαν" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Προβολή αδιάβαστων" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Ανακάλυψε" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Προβολή Τυχαίων Βιβλίων" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Κατηγορίες" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Προβολή επιλογών κατηγορίας" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Σειρές" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Προβολή επιλογών σειράς" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Συγγραφείς" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Προβολή επιλογών συγγραφέα" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Εκδότες" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Προβολή επιλογών εκδότη" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Γλώσσες" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Προβολή επιλογών γλώσσας" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Αξιολογήσεις" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Προβολή επιλογών αξιολόγησης" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Μορφές αρχείου" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Προβολή επιλογών μορφής αρχείου" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Αρχειοθετημένα Βιβλία" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Προβολή αρχειοθετημένων βιβλίων" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Λίστα Βιβλίων" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Προβολή Λίστας Βιβλίων" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Αναζήτηση" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Εκδόθηκε μετά" -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Εκδόθηκε πριν" -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Αξιολόγηση <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Αξιολόγηση >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Προχωρημένη Αναζήτηση" @@ -1253,45 +1253,45 @@ msgstr "Ένα δημόσιο ράφι με το όνομα '%(title)s' υπάρ msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ένα ιδιωτικό ράφι με το όνομα '%(title)s' υπάρχει ήδη." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Ράφι: '%(name)s" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Σφάλμα κατά το άνοιγμα του ραφιού. Το ράφι δεν υπάρχει ή δεν είναι προσβάσιμο" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Εργασίες" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Αναμονή" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Απέτυχε" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Ξεκίνησε" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Τελείωσε" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "ʼΑγνωστη κατάσταση" @@ -1324,178 +1324,178 @@ msgstr "Μια νέα ενημέρωση είναι διαθέσιμη. Κάνε msgid "No release information available" msgstr "Δεν υπάρχουν διαθέσιμες πληροφορίες αποδέσμευσης" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Ανακάλυψε (Τυχαία Βιβλία)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Βιβλία στη Μόδα (Με τα περισσότερα κατεβάσματα)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Κατεβασμένα βιβλία από %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Συγγραφέας: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Εκδότης: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Σειρές: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Αξιολόγηση: %(rating)s stars" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Μορφή αρχείου: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Κατηγορία: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Γλώσσα: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Κατεβασμένα" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Λίστα αξιολογήσεων" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Λίστα μορφών αρχείου" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Παρακαλούμε διαμόρφωσε πρώτα τις ρυθμίσεις ταχυδρομείου SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Το βιβλίο έχει επιτυχώς μπει σε σειρά για αποστολή στο %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oυπς! Υπήρξε ένα σφάλμα κατά την αποστολή αυτού του βιβλίου: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Παρακαλούμε ενημέρωσε το προφίλ σου με μια έγκυρη Διεύθυνση E-mail Αποστολής στο Kindle." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Εγγραφή" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Ο διακομιστής E-Mail δεν έχει διαμορφωθεί, παρακαλούμε επικοινώνησε με το διαχειριστή σου!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Η διεύθυνση e-mail σου δεν επιτρέπεται να εγγραφεί" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Το e-mail επιβεβαίωσης έχει σταλεί στον e-mail λογαριασμό σου." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Δεν μπόρεσε να ενεργοποιηθεί η επαλήθευση LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Εναλλακτική Σύνδεση ως: '%(nickname)s', Ο Διακομιστής LDAP δεν είναι προσβάσιμος, ή ο χρήστης δεν είναι γνωστός" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Δεν μπόρεσε να συνδεθεί: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Λανθασμένο Όνομα Χρήστη ή Κωδικός" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Ο Νέος Κωδικός έχει σταλεί στη διεύθυνση email σου" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Προέκυψε ένα άγνωστο σφάλμα. Παρακαλούμε δοκίμασε ξανά αργότερα." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Παρακαλούμε συμπλήρωσε ένα έγκυρο όνομα χρήστη για επαναφορά του κωδικού" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "τώρα έχεις συνδεθεί ως: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s's προφίλ" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Το προφίλ ενημερώθηκε" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Βρέθηκε ένας ήδη υπάρχον λογαριασμός για αυτή τη διεύθυνση e-mail." @@ -1504,54 +1504,58 @@ msgstr "Βρέθηκε ένας ήδη υπάρχον λογαριασμός γ msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Αποστολή στο Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Το εργαλείο μετατροπής Calibre ebook %(tool)s δεν βρέθηκε" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s μορφή δεν βρέθηκε σε δίσκο" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Ο μετατροπέας Ebook απέτυχε με άγνωστο σφάλμα" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Ο μετατροπέας Kepubify απέτυχε: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Το τροποποιημένο αρχείο δεν βρέθηκε ή υπάρχουν περισσότερα από ένα αρχεία στο φάκελο %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ο μετατροπέας Ebook απέτυχε: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Το Calibre απέτυχε με σφάλμα: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ο μετατροπέας Ebook απέτυχε: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1560,11 +1564,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "επεξεργασία μεταδεδομένων" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1602,7 +1602,7 @@ msgstr "Όνομα Χρήστη" msgid "Email" msgstr "Διεύθυνση E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Διεύθυνση E-mail Αποστολής στο Kindle" @@ -1835,7 +1835,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Ακύρωση" @@ -1887,7 +1887,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "μείωση" @@ -1994,12 +1994,12 @@ msgid "Language" msgstr "Γλώσσα" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ναι" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Όχι" @@ -2163,7 +2163,7 @@ msgid "Enter " msgstr "Αναγνωριστικά" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Είσαι πραγματικά σίγουρος/η;" @@ -2942,7 +2942,7 @@ msgstr "Σφάλμα" msgid "Upload done, processing, please wait..." msgstr "Το ανέβασμα έγινε, γίνεται επεξεργασία, παρακαλούμε περίμενε..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Ρυθμίσεις" @@ -3079,7 +3079,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Βιβλίο" @@ -3088,36 +3088,76 @@ msgstr "Βιβλίο" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web Κατάλογος eBook" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF πρόγραμμα ανάγνωσης" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Φωτεινό" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Σκοτεινό" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Πίσω" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Επανάληψη ροής κειμένου όταν οι μπάρες στο πλάι είναι ανοιχτές." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Διαγραφή" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Αναμονή" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Κάθετο" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Διαβάστηκε" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3319,11 +3359,11 @@ msgstr "Ημερομηνία Έκδοσης Από" msgid "Published Date To" msgstr "Ημερομηνία Έκδοσης Μέχρι" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3360,11 +3400,13 @@ msgstr "Βαθμολογία Πάνω από" msgid "Rating Below" msgstr "Βαθμολογία Κάτω από" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3388,6 +3430,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Κοινοποίηση με Όλους" @@ -3456,15 +3506,20 @@ msgstr "Πρόοδος" msgid "Run Time" msgstr "Χρόνος Λειτουργίας" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Συγχώνευση" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3472,6 +3527,10 @@ msgstr "" msgid "Reset user Password" msgstr "Επαναφορά Κωδικού χρήστη" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Γλώσσα Βιβλίων" diff --git a/cps/translations/es/LC_MESSAGES/messages.mo b/cps/translations/es/LC_MESSAGES/messages.mo index 58e8775e..3ff7c608 100644 Binary files a/cps/translations/es/LC_MESSAGES/messages.mo and b/cps/translations/es/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/es/LC_MESSAGES/messages.po b/cps/translations/es/LC_MESSAGES/messages.po index dc42003a..070be83a 100644 --- a/cps/translations/es/LC_MESSAGES/messages.po +++ b/cps/translations/es/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-05-25 17:22+0200\n" "Last-Translator: minakmostoles \n" "Language: es\n" @@ -18,452 +18,452 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" # "Last-Translator: victorhck \n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Estadísticas" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Servidor reiniciado. Por favor, recargue la página" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "El servidor se está apagando. Por favor, cierre la ventana" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Comando desconocido" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Puesto en cola un correo electrónico de prueba enviado a %(email)s, por favor, comprueba el resultado en Tareas" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Desconocido" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Página de administración" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configuración de la interfaz de usuario" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Editar usuarios" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Todo" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Usuario no encontrado" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} usuarios eliminados con éxito" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar todo" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Petición mal formulada" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "El nombre de invitado no se puede cambiar" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "El invitado no puede tener ese rol" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "No queda ningún usuario administrador, no se puede eliminar al usuario" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Valor tiene que ser verdadero o falso" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Rol inválido" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "El invitado no puede tener esta vista" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Vista no válida" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "El sitio del invitado se determina automáticamente y no puede ser cambiado" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "No hay un sitio válido" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "No se ha indicado un idioma válido para el libro" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parámetro no encontrado" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Columna de lectura no válida" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Columna restringida no válida" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Configuración de Calibre-Web actualizada" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "¿Realmente quieres borrar el Token de Kobo?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "¿Realmente deseas borrar este dominio?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "¿Realmente quieres borrar este usuario?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "¿Realmente quieres eliminar este estante?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "¿Realmente quieres cambiar el idioma de los usuarios seleccionados?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "¿Realmente quieres cambiar los idiomas visibles del libro de los usuarios seleccionados?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "¿Realmente quieres cambiar el rol seleccionado de el usuario seleccionado?" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "¿Realmente quieres cambiar las restricciones de los usuarios seleccionados?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "¿Realmente quieres cambiar las restricciones de visibilidad de los usuarios seleccionados?" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "¿Realmente quieres cambiar el comportamiento de sincronización de estante del usuario seleccionado?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "¿Realmente quieres cambiar la ubicación de la biblioteca Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Denegar" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Etiqueta no encontrada" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Acción no válida" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json no está configurado para la aplicación web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Logfile no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Access Logfile no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Por favor, Introduce un proveedor LDAP, puerto, DN y el User Object Identifier" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, introduce una cuenta de servicio LDAP y su contraseña" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, introduce una cuenta de servicio LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "El LDAP Group Object Filter tiene un paréntesis diferente" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "El LDAP Group Object Filter tiene un paréntesis diferente" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "El filtro de usuarios LDAP necesita tener un identificador de formato \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "El filtro de LDAP \"Member User\" tiene paréntesis no coincidentes" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Ubicaciones del certificado de la CA del LDAP, del certificado o de la clave no válidos. Por favor introduce la ruta correcta" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Añadir nuevo usuario" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Cambiar parámetros de correo" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Error en la base de datos: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Puesto en cola un correo electrónico de prueba enviado a %(email)s, por favor, comprueba el resultado en Tareas" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocurrió un error enviando el correo electrónico de prueba: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure su correo electrónico primero..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Actualizados los ajustes del servidor de correo electrónico" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Contraseña para el usuario %(user)s reinicializada" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Configura primero los parámetros del servidor SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visor del fichero de log" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Remplazando archivos" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Los conexiones con la base datos están cerradas" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Parando el servidor" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Falló la actualización:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Error HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Error de conexión" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tiempo agotado mientras se trataba de establecer la conexión" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Error general" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "La actualización del archivo no pudo guardarse en el directorio temporal (Temp Dir)" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Error al crear al menos un usuario LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Error al crear al menos un usuario LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Error: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Error: el servidor LDAP no ha devuelto ningún usuario" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Al menos, un usuario LDAP no se ha encontrado en la base de datos" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Usuario importado con éxito" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "La ruta de la base de datos no es válida. Por favor, Introduce la ruta correcta" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "La base de datos no es modificable" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta del Keyfile no es válida, por favor, Introduce la ruta correcta" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "La ruta de Certfile no es válida, por favor, Introduce la ruta correcta" @@ -481,7 +481,7 @@ msgstr "Actualizados los ajustes del servidor de correo electrónico" msgid "Database Configuration" msgstr "Configuración de la base de datos" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "¡Por favor, rellena todos los campos!" @@ -516,7 +516,7 @@ msgstr "No puedes borrar al Usuario Invitado" msgid "No admin user remaining, can't delete user" msgstr "No queda ningún usuario administrador, no se puede borrar al usuario" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -533,128 +533,128 @@ msgstr "no instalado" msgid "Execution permissions missing" msgstr "Faltan permisos de ejecución" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Columna personalizada No.%(column)d no existe en la base de datos calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ninguno" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "oh, oh, el libro seleccionado no está disponible. El archivo no existe o no es accesible" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Los identificadores no distinguen entre mayúsculas y minúsculas, sobrescribiendo el identificador antiguo" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadatos actualizados con éxito" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "El fichero %(file)s ha sido subido" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Falta la fuente o el formato de destino para la conversión" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro puesto a la cola para su conversión a %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocurrió un error al convertir este libro: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "El libro cargado probablemente existe en la biblioteca, considera cambiarlo antes de subirlo de nuevo: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s no es un idioma válido" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "El archivo a subir debe tener una extensión" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "El archivo %(filename)s no pudo salvarse en el directorio temporal (Temp Dir)" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Fallo al mover el archivo de cubierta %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Formato de libro eliminado con éxito" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Libro eliminado con éxito" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "editar metadatos" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex) no es un número válido, saltando" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Fallo al crear la ruta %(path)s (permiso denegado)" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Fallo al guardar el archivo %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Archivo con formato %(ext)s añadido a %(book)s" @@ -667,487 +667,487 @@ msgstr "La configuración de Google Drive no se ha completado, intente desactiva msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "El dominio Callback no se ha verificado, siga los pasos para verificarlo en la consola de desarrollador de Google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formato no encontrado para el id del libro: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s no encontrado en Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s no encontrado: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Enviar al Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Este correo electrónico ha sido enviado usando Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Correo de prueba de Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Comprobar correo electrónico" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Primeros pasos con Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Correo electrónico de registro para el usuario: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Convertir %(orig)s a %(format)s y enviar al Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Enviado %(format)s al Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Enviar al Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "El archivo solicitado no puede ser leído. ¿Quizás existen problemas con los permisos?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Fallo al intentar borrar la carpeta del libro %(id)s, la ruta tiene subcarpetas: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "El eliminado del libro %(id)s falló: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Borrando el libro %(id)s, la ruta del libro es no válida: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con el error: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Fichero %(file)s no encontrado en Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con el error: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Este nombre de usuario ya está en uso" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Dirección de correo no válida" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Error al descargar la cubierta" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Error en el formato de la cubierta" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Error al crear una ruta para la cubierta" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "El archivo de cubierta no es una imágen válida" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Sólo se admiten como portada los archivos jpg/jpeg/png/webp/bmp" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Sólo se admiten como portada los archivos jpg/jpeg" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Descubrir" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "No se encuentra el archivo binario UnRar" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Error ejecutando UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "La base de datos no es modificable" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Faltan permisos de ejecución" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Error ejecutando UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Por favor, accede a calibre-web desde una ubicación que no sea localhost para obtener una api_endpoint válida para tu dispositivo Kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configuración de Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registrado con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "has iniciado sesión como : '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "El enlace a %(oauth)s se ha realizado con éxito" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Acceso erróneo, ningún usuario enlazado con la cuenta OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "%(oauth)s desenlazado con éxito" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Error al desenlazar %(oauth)s" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "No vinculado con %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Error al iniciar sesión con GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Error al obtener la información del usuario de GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Error al iniciar sesión con Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Error al obtener información del usuario de Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Error en GitHub Oauth, por favor, vuelva a intentarlo más tarde." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Error GitHub Oauth {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Error en Google Oauth, por favor vuelva a intentarlo más tarde." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Error Google Oauth {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Estrellas" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Inicio de sesión" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token no encontrado" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "El token ha expirado" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "¡Correcto! Por favor regrese a su dispositivo" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Libros" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Mostrar libros recientes" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Libros populares" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Mostrar libros populares" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Libros Descargados" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Mostrar Libros Descargados" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Libros mejor valorados" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Mostrar libros mejor valorados" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Libros leídos" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Mostrar leídos y no leídos" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Libros no leídos" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Mostrar no leído" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Descubrir" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mostrar libros al azar" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorías" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Mostrar selección de categorías" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Series" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Mostrar selección de series" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autores" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Mostrar selección de autores" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Editores" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Mostrar selección de editores" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Idiomas" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Mostrar selección de idiomas" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Calificaciones" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Mostrar selección de calificaciones" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formatos de archivo" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Mostrar selección de formatos de archivo" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Libros archivados" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Mostrar libros archivados" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Lista de Libros" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Mostrar Lista de Libros" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Buscar" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publicado después de " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publicado antes de " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Calificación <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Calificación >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Estado de lectura = $(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Error en la búsqueda de columnas personalizadas, por favor reinicia Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Búsqueda avanzada" @@ -1258,45 +1258,45 @@ msgstr "Ya existe un estante público con el nombre '%(title)s'." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Ya existe un estante privado con el nombre '%(title)s'." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Error al abrir un estante. El estante no existe o no es accesible" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tareas" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Esperando" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Fallido" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Comenzado" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Finalizado" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Estado desconocido" @@ -1329,178 +1329,178 @@ msgstr "Hay una nueva actualización disponible. Haz clic en el botón de abajo msgid "No release information available" msgstr "No hay información del lanzamiento disponible" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Descubrir (Libros al azar)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Libros populares (los más descargados)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libros descargados por %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autor/es: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Editor/es: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Series: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Calificación: %(rating)s estrellas" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Formato del archivo: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Descargas" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Lista de calificaciones" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista de formatos" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Configura primero los parámetros del servidor SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Libro puesto en la cola de envío a %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Ha sucedido un error en el envío del libro: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Por favor actualiza tu perfil con la dirección de correo de su kindle..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registro" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "El servidor de correo no está configurado, por favor, ¡avisa a tu administrador!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "El servidor de correo no está configurado, por favor, ¡avisa a tu administrador!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Su correo electrónico no está permitido para registrarse" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "No se puede activar la autenticación LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "has iniciado sesión como : '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login como: '%(nickname)s', no se puede acceder al servidor LDAP o usuario desconocido" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "No se pudo entrar: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Usuario o contraseña inválido" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Una nueva contraseña se ha enviado a su cuenta de correo electrónico" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Por favor, introduce un usuario válido para restablecer la contraseña" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "has iniciado sesión como : '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Perfil actualizado" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico" @@ -1509,54 +1509,58 @@ msgstr "Encontrada una cuenta existente para esa dirección de correo electróni msgid "Found no valid gmail.json file with OAuth information" msgstr "No se ha encontrado ningún archivo gmail.json válido con información OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Enviar al Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s no encontrado" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format no encontrado en disco" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "El conversor de Ebook falló con un error desconocido" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter falló: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Archivo convertido no encontrado, o más de un archivo en el directorio %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Falló Ebook-converter: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falló con el error: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Falló Ebook-converter: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1565,11 +1569,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "editar metadatos" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1607,7 +1607,7 @@ msgstr "Nombre de usuario" msgid "Email" msgstr "Correo electrónico" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Enviar al correo de Kindle" @@ -1841,7 +1841,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" @@ -1893,7 +1893,7 @@ msgstr "Ordenar en base a fecha de publicación, menos reciente primero" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "reducir" @@ -2000,12 +2000,12 @@ msgid "Language" msgstr "Idioma" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Sí" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "No" @@ -2169,7 +2169,7 @@ msgid "Enter " msgstr "Identificadores" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "¿Estás realmente seguro?" @@ -2949,7 +2949,7 @@ msgstr "Error" msgid "Upload done, processing, please wait..." msgstr "Carga hecha, procesando, por favor espere ..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Ajustes" @@ -3086,7 +3086,7 @@ msgstr "Directorio padre" msgid "Select" msgstr "Seleccionar" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Ok" @@ -3095,36 +3095,77 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Catálogo de ebooks de Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "Lector PDF" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Claro" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Oscuro" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Regresar" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Redimensionar el texto cuando las barras laterales están abiertas." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Borrar" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Esperando" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Leído" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Columna de lectura no válida" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3326,11 +3367,11 @@ msgstr "Fecha de publicación desde" msgid "Published Date To" msgstr "Fecha de publicación hasta" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3367,11 +3408,13 @@ msgstr "Clasificación mayor que" msgid "Rating Below" msgstr "Clasificación menor que" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "De:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Para:" @@ -3395,6 +3438,16 @@ msgstr "Deshabilitar cambio de orden" msgid "Enable Change order" msgstr "Habilitar cambio de orden" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Ordenar en base a fecha del libro, más reciente primero" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Ordenar en base a fecha del libro, menos reciente primero" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Compartir con todos" @@ -3463,15 +3516,20 @@ msgstr "Progreso" msgid "Run Time" msgstr "Tiempo de ejecución" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Fusionar" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3479,6 +3537,10 @@ msgstr "" msgid "Reset user Password" msgstr "Resetear contraseña de usuario" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Mostrar libros con idioma" diff --git a/cps/translations/fi/LC_MESSAGES/messages.mo b/cps/translations/fi/LC_MESSAGES/messages.mo index 4eea2624..ce99721e 100644 Binary files a/cps/translations/fi/LC_MESSAGES/messages.mo and b/cps/translations/fi/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/fi/LC_MESSAGES/messages.po b/cps/translations/fi/LC_MESSAGES/messages.po index a14dfeda..d3d17a36 100644 --- a/cps/translations/fi/LC_MESSAGES/messages.po +++ b/cps/translations/fi/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-01-12 13:56+0100\n" "Last-Translator: Samuli Valavuo \n" "Language: fi\n" @@ -16,448 +16,448 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Tilastot" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Palvelin uudelleenkäynnistetty, ole hyvä ja päivitä sivu" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Palvelinta sammutetaan, ole hyvä ja sulje sivu" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(eReadermail)s" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Tuntematon" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Ylläpitosivu" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Perusasetukset" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Käyttöliittymän asetukset" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Pääkäyttäjä" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Kaikki" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Näytä kaikki" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web asetukset päivitetty" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Oletko varma, että haluat poistaa hyllyn?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Oletko varma, että haluat poistaa hyllyn?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Oletko varma, että haluat poistaa hyllyn?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Oletko varma, että haluat poistaa hyllyn?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Haluatko varmasti pysäyttää Calibre-Webin?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Muuta SMTP asetuksia" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Testisähköpostin lähetyksessä tapahtui virhe: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Sähköpostipalvelimen tiedot päivitetty" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Muokkaa käyttäjää %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Käyttäjän %(user)s salasana palautettu" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Lokitiedoston katselin" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Haetaan päivitystiedostoa" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Ladataan päivitystiedostoa" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Puretaan päivitystiedostoa" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Korvataan tiedostoja" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Tietokantayhteydet on katkaistu" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Sammutetaan palvelin" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Päivitys valmistui, ole hyvä ja paina OK ja lataa sivu uudelleen" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Päivitys epäonnistui:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP virhe" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Yhteysvirhe" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Aikakatkaisu yhteyttä luotaessa" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Yleinen virhe" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -475,7 +475,7 @@ msgstr "Sähköpostipalvelimen tiedot päivitetty" msgid "Database Configuration" msgstr "Ominaisuuksien asetukset" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Ole hyvä ja täytä kaikki kentät!" @@ -510,7 +510,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "Pääkäyttäjiä ei jää jäljelle, käyttäjää ei voi poistaa" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -527,128 +527,128 @@ msgstr "ei asennettu" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ei mitään" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Virhe eKirjan avaamisessa. Tiedostoa ei ole tai se ei ole saatavilla:" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata päivitetty onnistuneesti" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Tiedosto %(file)s tallennettu" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Lähteen tai kohteen tiedostomuoto puuttuu" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kirja lisätty muutosjonoon muotoon %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Kirjan muunnoksessa tapahtui virhe: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s ei ole kelvollinen kieli" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Tiedostopääte '%(ext)s' ei ole sallittujen palvelimelle ladattavien listalla" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Tiedostopääte '%(ext)s' ei ole sallittujen palvelimelle ladattavien listalla" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Ladattavalla tiedostolla on oltava tiedostopääte" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "muokkaa metadataa" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Polun %(path)s luonti epäonnistui (Ei oikeutta)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Tiedoston %(file)s tallennus epäonnistui." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Tiedostoformaatti %(ext)s lisätty %(book)s" @@ -661,482 +661,482 @@ msgstr "Google Drive asetukset ei ole valmiit. Koita poistaa Google Drive käyt msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Paluuosoitteen domain ei ole varmistettu, seuraa ohjeita vamistaaksesi sen googlen kehittäjäkonsolissa" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s tiedostomuotoa ei löytynyt kirjalle: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s ei löytynyt Google Drivesta: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s ei löydy: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Lähetä Kindleen" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Tämä sähköposti on lähetetty Calibre-Web:sta." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web testisähköposti" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Testi sähköposti" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Aloita Calibre-Web:in käyttö" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Rekiströintisähköposti käyttäjälle: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Muunna %(orig)s muotoon %(format)s ja lähetä Kindleen" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Lähetä %(format)s Kindleen" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Lähetä Kindleen" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Haettua tiedostoa ei pystytty lukemaan. Ehkä vaäärät oikeudet?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Tiedon muuttaminen arvosta: '%(src)s' arvoon '%(dest)s' epäonnistui virheeseen: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Tiedostoa %(file)s ei löytynyt Google Drivesta" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Tiedon muuttaminen arvosta: '%(src)s' arvoon '%(dest)s' epäonnistui virheeseen: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Kirjan polkua %(path)s ei löytynyt Google Drivesta" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Löydä" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Rekisteröi tuottajalle %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "GitHubiin kirjautuminen epäonnistui." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Käyttäjätietojen haku GitHubista epäonnistui" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Googleen kirjautuminen epäonnistui." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Käyttäjätietojen haku Googlesta epäonnistui." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth virhe, yritä myöhemmin uudelleen." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth virhe, yritä myöhemmin uudelleen." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Kirjaudu sisään" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Valtuutusta ei löytynyt" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Valtuutus vanhentunut" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Onnistui! Ole hyvä ja palaa laitteellesi" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Kirjat" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Näytä viimeisimmät kirjat" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Kuumat kirjat" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Näytä kuumat kirjat" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Parhaiten arvioidut kirjat" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Näytä parhaiten arvioidut kirjat" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Luetut kirjat" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Näytä luetut ja lukemattomat" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Lukemattomat kirjat" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Näyt lukemattomat" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Löydä" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Näytä satunnausia kirjoja" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategoriat" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Näytä kategoriavalinta" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Sarjat" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Näytä sarjavalinta" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Kirjailijat" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Näytä kirjailijavalinta" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Julkaisijat" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Näytä julkaisijavalinta" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Kielet" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Näytä keilivalinta" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Arvostelut" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Näytä arvosteluvalinta" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Tiedotomuodot" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Näytä tiedostomuotovalinta" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Näytä viimeisimmät kirjat" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Hae" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Julkaistu alkaen " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Julkaisut ennen " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Arvostelu <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Arvostelu >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Edistynyt haku" @@ -1247,45 +1247,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylly: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Virhe hyllyn avauksessa. Hyllyä ei ole tai se ei ole saatavilla" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tehtävät" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Odottaa" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Epäonnistui" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Aloitettu" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Valmistui" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Tuntematon tila" @@ -1318,176 +1318,176 @@ msgstr "Uusi päivitys saatavilla. Paina alla olevaa nappia päivittääksesi ve msgid "No release information available" msgstr "Ei päivitystietoa saatavilla" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Löydä (satunnaiset kirjat)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Kuumat kirjat (ladatuimmat)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Kirjailija: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Julkaisija: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Sarja: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Arvostelu: %(rating)s tähteä" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Tiedostomuoto: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Kieli: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "DLS" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Arvostelulistaus" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Tiedostomuotolistaus" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Ole hyvä ja aseta SMTP postiasetukset ensin..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Kirja lisätty onnistuneeksi lähetettäväksi osoitteeseen %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Kirjan: %(res)s lähettämisessa tapahtui virhe" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Ole hyvä ja aseta Kindle sähköpostiosoite ensin..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Rekisteröi" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Sähköpostiosoitteellasi ei ole sallittua rekisteröityä" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Vahvistusviesti on lähetetty sähköpostiosoitteeseesi." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "LDAP autnetikoinnin aktivointi ei onnistu" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Väärä käyttäjätunnus tai salasana" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Tapahtui tuntematon virhe. Yritä myöhemmin uudelleen." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Väärä käyttäjätunnus tai salasana" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "olet nyt kirjautunut tunnuksella: \"%(nickname)s\"" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)sn profiili" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profiili päivitetty" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus." @@ -1496,54 +1496,58 @@ msgstr "Tälle sähköpostiosoitteelle läytyi jo käyttäjätunnus." msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Lähetä Kindleen" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "E-kirjan muunnos epäonnistui: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "E-kirjan muunnos epäonnistui: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1552,11 +1556,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "muokkaa metadataa" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1594,7 +1594,7 @@ msgstr "Lempinimi" msgid "Email" msgstr "Sähköposti" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle" @@ -1827,7 +1827,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" @@ -1879,7 +1879,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "vähennä" @@ -1986,12 +1986,12 @@ msgid "Language" msgstr "Kieli" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Kyllä" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Ei" @@ -2155,7 +2155,7 @@ msgid "Enter " msgstr "Rekisteröi" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Oletko aivan varma?" @@ -2930,7 +2930,7 @@ msgstr "Virhe" msgid "Upload done, processing, please wait..." msgstr "Lataus tehty, prosessoidaan, ole hyvä ja odota..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Asetukset" @@ -3067,7 +3067,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Kirja" @@ -3076,36 +3076,76 @@ msgstr "Kirja" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-kirjaluettelo" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF lukija" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Vaalea" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Tumma" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Palaa" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Uudelleenjärjestä teksti kun sivut on auki." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Poista" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Odottaa" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Pystysuunta" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Luettu" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3307,11 +3347,11 @@ msgstr "Julkaisupäivästä" msgid "Published Date To" msgstr "Julkaisupäivään" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3348,11 +3388,13 @@ msgstr "Arvio enemmän kun" msgid "Rating Below" msgstr "Arvio vähemmän kun" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3376,6 +3418,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "pitäisikö hyllyn olla julkinen?" @@ -3444,15 +3494,19 @@ msgstr "Edistyminen" msgid "Run Time" msgstr "Ajoaika" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3460,6 +3514,10 @@ msgstr "" msgid "Reset user Password" msgstr "Nollaa käyttäjän salasana" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Näytä kirjat kielellä" diff --git a/cps/translations/fr/LC_MESSAGES/messages.mo b/cps/translations/fr/LC_MESSAGES/messages.mo index 91be39e6..28077dea 100644 Binary files a/cps/translations/fr/LC_MESSAGES/messages.mo and b/cps/translations/fr/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 5f9de4a4..a2aec347 100644 --- a/cps/translations/fr/LC_MESSAGES/messages.po +++ b/cps/translations/fr/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-06-07 06:47+0200\n" "Last-Translator: \n" "Language: fr\n" @@ -31,451 +31,451 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistiques" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Serveur redémarré, merci de rafraîchir la page" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Arrêt du serveur en cours, merci de fermer la fenêtre" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Commande inconnue" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Teste les courriels en file d’attente pour l’envoi à %(email)s, veuillez vérifier le résultat des tâches" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Inconnu" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Page admin" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configuration principale" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configuration de l’interface utilisateur" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Éditer les utilisateurs" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tout" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "L'utilisateur n'a pas été trouvé" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} utilisateurs supprimés avec succès" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Montrer tout" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Demande malformée" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Le nom de l’invité ne peut pas être modifié" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "L’invité ne peut pas avoir ce rôle" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Aucun utilisateur admin restant, impossible de supprimer le rôle admin" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "La valeur doit être vraie ou fausse" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Rôle invalide" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "L’invité ne peut pas avoir cette vue" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Vue invalide" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Les paramètres régionaux de l’invité sont déterminés automatiquement et ne peuvent pas être définis" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Aucun paramètre régional valide n’est donné" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Aucune langue de livre valide donnée" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Paramètre non trouvé" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Colonne de lecture non valide" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Colonne restreinte non valide" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Configuration de Calibre-Web mise à jour" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Voulez-vous vraiment supprimer le jeton Kobo ?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Voulez-vous vraiment supprimer ce domaine ?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Voulez-vous vraiment supprimer cet utilisateur ?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Voulez-vous vraiment supprimer l’étagère ?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Voulez-vous vraiment supprimer l’étagère ?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Voulez-vous vraiment modifier les langues de livre visibles pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Voulez-vous vraiment modifier le rôle sélectionné pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Voulez-vous vraiment modifier les restrictions sélectionnées pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Voulez-vous vraiment modifier les restrictions de visibilité sélectionnées pour le ou les utilisateurs sélectionnés ?" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Voulez-vous vraiment supprimer l’étagère?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Voulez-vous vraiment arrêter Calibre-Web ?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Êtes-vous certain de vouloir supprimer la base de données de synchronisation de Calibre-Web pour forcer une synchronisation complète avec votre liseuse Kobo ?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Refuser" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Autoriser" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} entrées de synchronisation supprimées" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Étiquette introuvable" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Action invalide" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json n'est pas configuré pour l'application Web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier logfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Access Logfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Veuillez saisir un fournisseur LDAP, Port, DN et l'identifiant objet de l'utilisateur" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Veuillez entrer un nom d'utilisateur valide pour réinitialiser le mot de passe" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Veuillez entrer un compte de service LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Le filtre objet du groupe LDAP a besoin d'un identifiant de format \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Le filtre objet du groupe LDAP a une parenthèse non gérée" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Le filtre objet de l'utilisateur LDAP a besoin d'un identifiant de format \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Le filtre objet de l'utilisateur LDAP a une parenthèse non gérée" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Le filtre utilisateur des membres LDAP doit avoir un identificateur de format \"%s\\ »" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Le filtre utilisateur de membre LDAP a des parenthèses non appariées" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertificat, certificat ou emplacement de clé non valide, veuillez entrer le chemin correct" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Ajouter un nouvel utilisateur" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Modifier les paramètres du serveur de courriels" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Erreur de la base de données: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Teste les courriels en file d’attente pour l’envoi à %(email)s, veuillez vérifier le résultat des tâches" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Il y a eu une erreur pendant l’envoi du courriel de test : %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Veuillez d'abord configurer votre adresse de courriel..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Les paramètres du serveur de courriels ont été mis à jour" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Veuillez configurer les paramètres SMTP au préalable..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visualiseur de fichier journal" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Demande de mise à jour" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Téléchargement de la mise à jour" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Remplacement des fichiers" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Les connexions à la base de données ont été fermées" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Arrêt du serveur" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "La mise à jour a échoué :" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erreur HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erreur de connexion" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Délai d'attente dépassé lors de l'établissement de connexion" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erreur générale" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Le fichier de mise à jour ne peut pas être sauvegardé dans le répertoire temporaire" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Les fichiers n’ont pas pu être remplacés pendant la mise à jour" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Impossible de créer au moins un utilisateur LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Impossible de créer au moins un utilisateur LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erreur : %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Erreur : Aucun utilisateur renvoyé dans la réponse LDAP du serveur" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Au moins un utilisateur LDAP n'a pas été trouvé dans la base de données" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} utilisateur importé avec succès" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement de la base de données est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "La base de données n'est pas accessible en écriture" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Keyfile est incorrect, veuillez saisir un chemin valide" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "L'emplacement du fichier Certfile est incorrect, veuillez saisir un chemin valide" @@ -493,7 +493,7 @@ msgstr "Les paramètres du serveur de courriels ont été mis à jour" msgid "Database Configuration" msgstr "Configuration des options" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Veuillez compléter tous les champs !" @@ -528,7 +528,7 @@ msgstr "Impossible de supprimer l’utilisateur Invité" msgid "No admin user remaining, can't delete user" msgstr "Aucun utilisateur admin restant, impossible de supprimer l’utilisateur" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -545,128 +545,128 @@ msgstr "non installé" msgid "Execution permissions missing" msgstr "Les permissions d'exécutions manquantes" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "La colonne personnalisée No.%(column)d n'existe pas dans la base de données calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Aucun" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Les identificateurs ne sont pas sensibles à la casse, écrasant l’ancien identificateur" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Les métadonnées ont bien été mises à jour" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Le fichier %(file)s a été téléchargé" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Le format de conversion de la source ou de la destination est manquant" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Le livre a été mis avec succès en file de traitement pour conversion vers %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Une erreur est survenue au cours de la conversion du livre : %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Le fichier téléchargé existe probablement dans la librairie, veuillez le modifier avant de le télécharger de nouveau: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s n'est pas une langue valide" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée pour être déposée sur ce serveur" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée pour être déposée sur ce serveur" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Pour être déposé le fichier doit avoir une extension" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Le fichier %(filename)s ne peut pas être sauvegardé dans le répertoire temporaire" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Impossible de déplacer le fichier de couverture %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Le format du livre a été supprimé avec succès" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Le livre a été supprimé avec succès" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Vous n’avez par les permissions pour supprimer les livres" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "modifier les métadonnées" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s n’est pas un nombre valide, ignoré" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossible de créer le chemin %(path)s (Permission refusée)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Échec de la sauvegarde du fichier %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" @@ -679,487 +679,487 @@ msgstr "La configuration de Google Drive n’est pas terminée, essayez de désa msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Le domaine de retour d’appel (Callback domain) est non vérifié, veuillez suivre les étapes nécessaires pour vérifier le domaine dans la console de développement de Google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "le format %(format)s est introuvable pour le livre : %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "le %(format)s est introuvable sur Google Drive : %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s introuvable : %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Envoyer vers Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Ce courriel a été envoyé depuis Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Courriel de test de Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Courriel de test" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Bien démarrer avec Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Courriel d’inscription pour l’utilisateur : %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Convertir de %(orig)s vers %(format)s et envoyer au Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Envoyer %(format)s vers le Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Envoyer vers Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Le fichier demandé n’a pu être lu. Problème de permission d’accès ?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Échec de la suppression du dossier de livre pour le livre %(id)s, le chemin d’accès comporte des sous-dossiers : %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "La suppression du livre %(id)s a échoué: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Suppression du livre %(id)s, le chemin du livre est invalide : %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Le fichier %(file)s n'a pas été trouvé dans Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Le chemin du livre %(path)s n'a pas été trouvé dans Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Cet utilisateur est déjà pris" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Format de l’adresse courriel invalide" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Erreur lors du téléchargement de la couverture" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Erreur de format de couverture" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Impossible de créer le chemin pour la couverture" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Le fichier couverture n'est pas un fichier image valide, ou ne peut pas être stocké" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Seuls les fichiers jpg/jpeg/png/webp/bmp sont supportés comme fichier de couverture" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Contenu du fichier de couverture invalide" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Seuls les fichiers jpg/jpeg sont supportés comme fichier de couverture" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Découvrir" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Fichier binaire UnRar non trouvé" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Une erreur est survenue lors de l'exécution d'UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "La base de données n'est pas accessible en écriture" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Les permissions d'exécutions manquantes" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Une erreur est survenue lors de l'exécution d'UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Veuilllez ne pas accéder à calibre-web par localhost pour obtenir un api_endpoint valide pour un appareil kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configuration Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Enregistrer avec %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "vous êtes maintenant connecté comme : '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Lien vers %(oauth)s effectué avec succès" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "La connexion a échoué, aucun utilisateur lié au compte OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Suppression de la liaison vers %(oauth)s effectuée avec succès" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Suppression de la liaison vers %(oauth)s a échoué" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Non lié à %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Échec de la connexion avec GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Impossible d’obtenir les informations d’utilisateur à partir de GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Échec de la connexion avec Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Impossible d’obtenir les informations d’utilisateur avec Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Erreur Oauth GitHub, veuillez réessayer plus tard." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Erreur Oauth Github : {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Erreur Oauth Google, veuillez réessayer plus tard." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Erreur Oauth Google : {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Étoiles" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Connexion" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Jeton non trouvé" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Jeton expiré" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Réussite! Merci de vous tourner vers votre appareil" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Livres" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Afficher les livres récents" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Livres populaires" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Montrer les livres populaires" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Livres téléchargés" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Montrer les livres téléchargés" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Livres les mieux notés" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Montrer les livres les mieux notés" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Livres lus" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Montrer lus et non-lus" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Livres non-lus" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Afficher non-lus" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Découvrir" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Montrer des livres au hasard" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Catégories" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Montrer la sélection par catégories" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Séries" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Montrer la sélection par séries" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Auteurs" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Montrer la sélection par auteur" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Éditeurs" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Montrer la sélection par éditeur" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Langues" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Montrer la sélection par langue" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Notes" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Afficher la sélection des évaluations" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formats de fichier" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Afficher la sélection des formats de fichiers" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Livres archivés" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Afficher les livres archivés" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Liste des livres" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Montrer la liste des livres" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Chercher" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publié après le " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publié avant le " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Évaluation <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Évaluation >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Status de lecture = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erreur lors de la recherche de colonnes personnalisées, veuillez redémarrer Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Recherche avancée" @@ -1270,45 +1270,45 @@ msgstr "Une étagère publique avec le nom '%(title)s' existe déjà." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Une étagère privée avec le nom '%(title)s' existe déjà." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tâches" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "En attente" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Echoué" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Débuté" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Terminé" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Statut inconnu" @@ -1341,178 +1341,178 @@ msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-desso msgid "No release information available" msgstr "Aucune information concernant cette version n’est disponible" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Découvrir (Livres au hasard)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livres téléchargés par %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Auteur : %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Éditeur : '%(name)s'" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Évaluation : %(rating)s étoiles" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Format de fichier : %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Téléchargements" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Liste des évaluations" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Liste de formats de fichiers" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Veuillez configurer les paramètres SMTP au préalable..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Le livre a été mis en file de traitement avec succès pour un envoi vers %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Veuillez mettre à jour votre profil avec une adresse de courriel Kindle valide." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Créer un compte" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Le serveur de courriel n'est pas configuré, veuillez contacter votre administrateur!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Le courriel de confirmation a été envoyé à votre adresse." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Impossible d’activer l’authentification LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté comme : '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Connexion de secours comme: '%(nickname)s', le serveur LDAP est indisponible, ou l'utilisateur est inconnu" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Impossible de se connecter: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Mauvais nom d'utilisateur ou mot de passe" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Le nouveau mot de passe a été envoyé vers votre adresse de courriel" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Veuillez entrer un nom d'utilisateur valide pour réinitialiser le mot de passe" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "vous êtes maintenant connecté comme : '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Profil de %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profil mis à jour" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Un compte existant a été trouvé pour cette adresse de courriel." @@ -1521,54 +1521,58 @@ msgstr "Un compte existant a été trouvé pour cette adresse de courriel." msgid "Found no valid gmail.json file with OAuth information" msgstr "Aucun fichier gmail.json avec information OAuth valide trouvé" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Envoyer vers Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "ebook-convert calibre %(tool)s non trouvé" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Format %(format)s non trouvé sur le disque" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Le convertisseur Ebook a échoué avec une erreur inconnue" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "La commande Kepubify-converter a échouée : %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Fichier converti non trouvé ou plus d'un fichier dans le chemin %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "La commande ebook-convert a échouée : %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre a échoué avec l’erreur : %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "La commande ebook-convert a échouée : %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1577,11 +1581,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "modifier les métadonnées" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1619,7 +1619,7 @@ msgstr "Nom d'utilisateur" msgid "Email" msgstr "Adresse de courriel" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Envoyer vers une adresse de courriel Kindle" @@ -1853,7 +1853,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annuler" @@ -1905,7 +1905,7 @@ msgstr "Trier en fonction de la date de publication, le plus ancien en premier" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "réduire" @@ -2012,12 +2012,12 @@ msgid "Language" msgstr "Langue" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Oui" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Non" @@ -2181,7 +2181,7 @@ msgid "Enter " msgstr "Identifiants" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Êtes-vous vraiment sûr?" @@ -2961,7 +2961,7 @@ msgstr "Erreur" msgid "Upload done, processing, please wait..." msgstr "Téléversement terminé, traitement en cours, veuillez patienter…." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Paramètres" @@ -3098,7 +3098,7 @@ msgstr "Répertoire parent" msgid "Select" msgstr "Sélectionner" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Livre" @@ -3107,36 +3107,77 @@ msgstr "Livre" msgid "Calibre-Web eBook Catalog" msgstr "Catalogue de livres électroniques Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "Lecteur PDF" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Clair" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Sombre" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Retour" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Mettre à jour la mise en page du texte quand les bandeaux latéraux sont ouverts." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Supprimer" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "En attente" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Lu" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Colonne de lecture non valide" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3338,11 +3379,11 @@ msgstr "Date de publication (depuis)" msgid "Published Date To" msgstr "Date de publication (jusqu’à)" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3379,11 +3420,13 @@ msgstr "Évaluation supérieure à" msgid "Rating Below" msgstr "Évaluation inférieure à" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Depuis" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Vers" @@ -3407,6 +3450,16 @@ msgstr "Désactiver l’ordre de modification" msgid "Enable Change order" msgstr "Activer l’ordre de modification" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Trier en fonction de la date du livre, le plus récent en premier" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Trier en fonction de la date du livre, le plus ancien en premier" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Partager avec tout le monde" @@ -3475,15 +3528,20 @@ msgstr "Avancement" msgid "Run Time" msgstr "Durée" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Fusionner" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3491,6 +3549,10 @@ msgstr "" msgid "Reset user Password" msgstr "Réinitialiser le mot de passe de l’utilisateur" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Montrer les livres dans la langue" diff --git a/cps/translations/gl/LC_MESSAGES/messages.mo b/cps/translations/gl/LC_MESSAGES/messages.mo index 0fb693e0..99788c73 100644 Binary files a/cps/translations/gl/LC_MESSAGES/messages.mo and b/cps/translations/gl/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/gl/LC_MESSAGES/messages.po b/cps/translations/gl/LC_MESSAGES/messages.po index 6c036453..d8bf63ab 100644 --- a/cps/translations/gl/LC_MESSAGES/messages.po +++ b/cps/translations/gl/LC_MESSAGES/messages.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2022-08-11 16:46+0200\n" "Last-Translator: pollitor \n" "Language: gl\n" @@ -14,443 +14,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Estatísticas" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Servidor reiniciado. Por favor, recargue a páxina" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "O servidor estase apagando. Por favor, peche a xanela" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Orde descoñecida" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Posto en cola un correo electrónico de proba enviado a %(email)s, por favor, comproba o resultado nas Tarefas" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Descoñecido" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Páxina de administración" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configuración Básica" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configuración da Interface de Usuario" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar Usuarios" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Todo" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Usuario non atopado" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} usuarios borrados con éxito" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar Todo" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Petición mal formada" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "O nome do convidado non se pode cambiar" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "O convidado non pode ter este rol" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Non queda ningún usuario administrador, non se pode eliminar ao usuario" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "O Valor ten que ser verdadeiro ou falso" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Rol non válido" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "O convidado non pode ter esta vista" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Vista non válida" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "O sitio do convidado determínase automáticamente e non se pode cambiar" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Non hai unha localización válida" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Non se indicou unha lingua válida para o libro" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parámetro non atopado" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Columna de lectura non válida" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Columna restrinxida non válida" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Configuración de Calibre-Web actualizada" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "De verdade queres borrar o Token de Kobo?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "De verdade desexas borrar este dominio?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "De verdade queres borrar este usuario?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "De verdade queres eliminar este andel?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "De verdade queres cambiar a linguaxe dos usuarios seleccionados?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "De verdade queres cambiar as linguas visibles do libro dos usuarios seleccionados?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "De verdade queres cambiar o rol seleccionado do usuario seleccionado?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "De verdade queres cambiar as restricións escollidas dos usuarios seleccionados?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "De verdade queres cambiar as restricións de visibilidade dos usuarios seleccionados?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "De verdade queres cambiar o comportamento da sincronización do andel para o usuario seleccionado?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "De verdade queres cambiar a localización da biblioteca Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-web buscará cubertas actualizadas e miniaturas de cubertas actualizadas, isto pode levar un intre?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Está seguro que quere borrar a base de datos de sincronización de Calibre-Web para forzar unha sincronización completa co seu lector Kobo?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Denegar" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "Elimináronse {} entradas de sincronización" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Etiqueta non atopada" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Acción non válida" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json non está configurado para a aplicación web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localización do arquivo de rexistro non é válida. Por favor, Introduce a ruta correcta" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localización do rexistro de accesos non é válida. Por favor, Introduce a ruta correcta" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Por favor, Introduce un provedor LDAP, porto, DN e o User Object Identifier" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, introduce unha conta de servizo LDAP e o seu contrasinal" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, introduce unha conta de servizo LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita ter un identificador de formato \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "O LDAP Group Object Filter ten parénteses que non casan" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Group Object Filter necesita ter un identificador de formato \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "O LDAP Group Object Filter ten parénteses que non casan" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de usuarios LDAP necesita ter un identificador de formato \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "O filtro de LDAP \"Member User\" ten parénteses que non casan" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "As localizacións do certificado da CA do LDAP, do certificado ou da chave non válidos. Por favor introduce a ruta correcta" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Engadir novo usuario" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Cambiar os parámetros do correo" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Error na base de datos: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Posto en cola un correo electrónico de proba enviado a %(email)s, por favor, comproba o resultado nas Tarefas" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocurreu un error enviando o correo electrónico de proba: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure o seu correo electrónico primeiro..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Actualizáronse os axustes do servidor de correo electrónico" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Editar a Configuración das Tarefas Programadas" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Indicada unha hora incorrecta de comezo de tarefa" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Indicada unha duracción incorrecta para a tarefa" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Actualizouse a configuración das tarefas programadas" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Sucedeu un erro descoñecido. Por favor volva a intentalo máis tarde." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "A configuración da DB non se pode escribir" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Editar o Usuario %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Reiniciada a contrasinal para o usuario %(user)s" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Configura primeiro os parámetros do servidor SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visor do ficheiro de rexistro" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Descomprimendo paquete de actualización" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Remplazando archivos" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "As conexións coa base datos están pechadas" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Detendo o servidor" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Actualización finalizada. Por favor, prema OK e recargue a páxina" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "A actualización fallou:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erro de conexión" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo esgotado mentras se trataba de establecer a conexión" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erro xeral" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "A actualización do arquivo non se puido gardar no directorio temporal (Temp Dir)" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Non se puideron substituír os ficheiros durante a actualización" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Erro ao extraer polo menos un usuario LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Erro ao crear polo menos un usuario LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: o servidor LDAP non devolveu ningún usuario" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Polo menos, un usuario LDAP non se atopou na base de datos" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "Usuario {} importado con éxito" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "A localización da base de datos non é válida. Por favor, Introduce a ruta correcta" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "A base de datos non é modificable" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "A localización do Keyfile non é válida, por favor, Introduce a ruta correcta" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "A localización do Certfile non é válida, por favor, Introduce a ruta correcta" @@ -466,7 +466,7 @@ msgstr "Actualizados os axustes da base de datos" msgid "Database Configuration" msgstr "Configuración da base de datos" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Por favor, cubra todos os campos!" @@ -500,7 +500,7 @@ msgstr "Non se pode borrar ao Usuario Invitado" msgid "No admin user remaining, can't delete user" msgstr "Non queda ningún usuario administrador, non se pode borrar ao usuario" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -517,128 +517,128 @@ msgstr "non instalado" msgid "Execution permissions missing" msgstr "Faltan permisos de execución" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Columna personalizada No.%(column)d non existe na base de datos calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ningún" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "oh, oh, o libro seleccionado non está disponible. O arquivo non existe ou non está accesible" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "O usuario non ten permisos para subir a cuberta" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Os identificadores non distinguen entre maiúsculas e minúsculas, sobrescribindo o identificador antigo" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadatos actualizados con éxito" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Erro editando libro: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "O ficheiro %(file)s subiuse" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Falta a fonte ou o formato de destino para a conversión" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro posto na cola para a súa conversión a %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Houbo un erro ao convertir este libro: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "O libro cargado probablemente existe na biblioteca, considera cambialo antes de subilo outra vez: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s non é unha lingua válida" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Non se permite subir arquivos coa extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Non se permite subir arquivos coa extensión '%(ext)s' a este servidor" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "O arquivo que se vai cargar debe ter unha extensión" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "El archivo %(filename)s non puido gravarse no directorio temporal (Temp Dir)" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Fallo ao mover o arquivo de cuberta %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Formato de libro eliminado con éxito" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Libro eliminado con éxito" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Vostede non ten permisos para borrar libros" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "editar metadatos" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s non é un número válido, saltando" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "O usuario non ten permisos para cargar formatos de ficheiro adicionais" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Fallo ao crear a ruta %(path)s (permiso denegado)" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Fallo ao gardar o arquivo %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Arquivo con formato %(ext)s engadido a %(book)s" @@ -651,484 +651,484 @@ msgstr "A configuración de Google Drive non se completou, intente desactivar e msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "O dominio Callback non se comprobou, siga os pasos para comprobalo na consola de desenvolvedor de Google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formato non atopado para o id do libro: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s non atopado en Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s non atopado: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Enviar ao Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Este correo electrónico enviouse empregando Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Correo de proba de Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Comprobar correo electrónico" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Primeiros pasos con Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Correo electrónico de rexistro para o usuario: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Convertir %(orig)s a %(format)s e enviar ao Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Enviado %(format)s ao Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Enviar ao Kindle %(book)s" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "O arquivo solicitado non pode lerse. Quizais existen problemas cos permisos?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "O estado de lectura non pode fixarse: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Fallo ao intentar borrar a carpeta do libro %(id)s, a ruta ten subcarpetas: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "O borrado do libro %(id)s fallou: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Borrando o libro %(id)s, a ruta de libro non é válida: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "O renomeado do título de: '%(src)s' a '%(dest)s' fallou co erro: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Ficheiro %(file)s non atopado en Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "O renomeado do título de: '%(src)s' a '%(dest)s' fallou co erro: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "A ruta %(path)s do libro non se atopou en Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Este nome de usuario xa está en uso" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Enderezo de correo non válido" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "O módulo Python 'advocate' non está instalado pero se necesita para as cargas de cubertas" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Erro ao descargar a cuberta" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Erro no formato da cuberta" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Non ten permiso para acceder a localhost ou á rede local para as cargas de cubertas" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Erro ao crear unha ruta para a cuberta" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "O arquivo de cuberta non é unha imaxe válida" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Soamente se admiten como cuberta os arquivos jpg/jpeg/png/webp/bmp" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Contido do arquivo de cuberta non válido" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Soamente se admiten como cuberta os arquivos jpg/jpeg" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Descubrir" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Non se atopa o arquivo binario de UnRar" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Erro executando UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "A base de datos non é modificable" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Faltan permisos de execución" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Erro executando UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Por favor, accede a calibre-web dende unha ubicación que non sexa localhost para obter unha api_endpoint válida para o teu dispositivo Kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configuración de Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Rexistrado con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Iniciou sesión como : '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "O enlace a %(oauth)s realizouse con éxito" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Acceso errado, ningún usuario enlazado coa conta OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "%(oauth)s desenlazado con éxito" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Erro ao desenlazar %(oauth)s" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Non vinculado con %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Erro ao iniciar sesión con GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Erro ao obter a información do usuario de GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Erro ao iniciar sesión con Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Erro ao obter información do usuario de Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Erro en GitHub Oauth, por favor, volva a intentalo máis tarde." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Erro GitHub Oauth {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Erro en Google Oauth, por favor volva a intentalo máis tarde." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Erro Google Oauth {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Estrelas" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Inicio de sesión" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token non atopado" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "O token expirou" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Correcto! Por favor volte ao seu dispositivo" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Libros" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Mostrar libros recentes" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Libros populares" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Mostrar libros populares" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Libros descargados" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Mostrar libros descargados" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Libros mellor valorados" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Mostrar libros mellor valorados" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Libros lidos" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Mostrar lidos e non lidos" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Libros non lidos" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Mostrar non lidos" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Descubrir" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mostrar libros ao chou" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorías" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Mostrar selección de categorías" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Series" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Mostrar selección de series" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autores" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Mostrar selección de autores" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Editores" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Mostrar selección de editores" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Linguas" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Mostrar selección de linguas" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Valoracións" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Mostrar selección de valoracións" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formatos de arquivo" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Mostrar selección de formatos de arquivo" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Libros arquivados" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Mostrar libros arquivados" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Lista de libros" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Mostrar lista de libros" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Buscar" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publicado despóis de " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publicado antes de " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Valoración <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Valoración >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Estado de lectura = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erro na busca de columnas personalizadas, por favor reinicia Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Búsqueda avanzada" @@ -1236,45 +1236,45 @@ msgstr "Xa existe un andel público co nome '%(title)s'." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Xa existe un andel privado co nome '%(title)s'." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Andel: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erro ao abrir un andel. O andel non existe ou non se pode acceder" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tarefas" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Esperando" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Fallou" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Comezado" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Rematado" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Rematado" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Cancelado" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Estado descoñecido" @@ -1307,178 +1307,178 @@ msgstr "Hai unha nova actualización dispoñible. Preme no botón de abaixo para msgid "No release information available" msgstr "Non hai información do lanzamento dispoñible" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Descubrir (Libros ao chou)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Libros populares (os máis descargados)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libros descargados por %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autor/es: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Editor/es: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Series: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Valoración: Ningunha" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Valoración: %(rating)s estrelas" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Formato do arquivo: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categoría: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Descargas" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Lista de valoracións" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista de formatos" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Configura primeiro os parámetros do servidor SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Libro posto na cola de envío a %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oh, oh! Houbo un erro no envío do libro: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Por favor actualiza o teu perfil co enderezo de correo do teu kindle..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Rexistro" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "O servidor de correo non está configurado, por favor, avisa ao teu administrador!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "O servidor de correo non está configurado, por favor, avisa ao teu administrador!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "O seu correo electrónico non está permitido para rexistrarse" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Mandouse un correo electrónico de verificación á súa conta de correo." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Non se pode activar a autenticación LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Iniciou sesión como : '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback login como: '%(nickname)s', non se pode acceder ao servidor LDAP ou usuario descoñecido" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Non se puido entrar: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Usuario ou contrasinal no válido" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Unha nova contrasinal enviouse ao seu enderezo de correo electrónico" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Sucedeu un erro descoñecido. Por favor volva a intentalo máis tarde." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Por favor, introduce un usuario válido para restablecer a contrasinal" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Iniciou sesión como : '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Perfil actualizado" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Atopada unha conta existente para ese enderezo de correo electrónico" @@ -1486,54 +1486,58 @@ msgstr "Atopada unha conta existente para ese enderezo de correo electrónico" msgid "Found no valid gmail.json file with OAuth information" msgstr "Non se atopou ningún arquivo gmail.json válido con información OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "Enviar ao Kindle %(book)s" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Non se atopou Calibre ebook-convert %(tool)s" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "O formato %(format)s non se atopou no disco" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "O conversor de Ebook fallou cun erro descoñecido" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter fallou: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Arquivo convertido non atopado, ou máis dun arquivo no directorio %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Fallou Ebook-converter: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre fallou co erro: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Fallou Ebook-converter: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Convertir" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Reconectando a base de datos de Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "Correo electrónico" @@ -1542,11 +1546,7 @@ msgstr "Correo electrónico" msgid "Backing up Metadata" msgstr "editar metadatos" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Xeradas %(count)s miniaturas de cubertas" @@ -1584,7 +1584,7 @@ msgstr "Nome de usuario" msgid "Email" msgstr "Enderezo de correo electrónico" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Enviar ao enderezo de correo electrónico do Kindle" @@ -1816,7 +1816,7 @@ msgstr "Vale" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" @@ -1868,7 +1868,7 @@ msgstr "Ordear pola data de publicación, máis antigo primeiro" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "reducir" @@ -1975,12 +1975,12 @@ msgid "Language" msgstr "Lingua" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Sí" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Non" @@ -2141,7 +2141,7 @@ msgid "Enter " msgstr "Introduce " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "De verdade estás seguro?" @@ -2916,7 +2916,7 @@ msgstr "Erro" msgid "Upload done, processing, please wait..." msgstr "Carga feita, procesando, por favor agarde..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Axustes" @@ -3053,7 +3053,7 @@ msgstr "Directorio pai" msgid "Select" msgstr "Seleccionar" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Vale" @@ -3061,34 +3061,75 @@ msgstr "Vale" msgid "Calibre-Web eBook Catalog" msgstr "Catálogo de libros electrónicos de Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "Lector epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Claro" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Oscuro" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sepia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Negro" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Refluxo do texto cando as barras laterais están abertas." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Borrar" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Esperando" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Lido" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Columna de lectura non válida" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Lector de Cómics" @@ -3286,11 +3327,11 @@ msgstr "Data de publicación dende" msgid "Published Date To" msgstr "Data de publicación ata" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3326,11 +3367,13 @@ msgstr "Valoración superior a" msgid "Rating Below" msgstr "Valoración inferior a" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "De:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Para:" @@ -3354,6 +3397,16 @@ msgstr "Desactivar o cambio de orde" msgid "Enable Change order" msgstr "Activar o cambio de orde" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Ordear pola data do libro, máis recente primeiro" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Ordear pola data do libro, máis antigo primeiro" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Compartir con todos" @@ -3422,15 +3475,20 @@ msgstr "Progreso" msgid "Run Time" msgstr "Tempo de execución" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Unir" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Accións" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Esta tarefa cancelarase. Non se gardará ningún progreso feito por esta tarefa." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Se esta é unha tarefa programada, volverá a lanzarse na próxima hora programada." @@ -3438,6 +3496,10 @@ msgstr "Se esta é unha tarefa programada, volverá a lanzarse na próxima hora msgid "Reset user Password" msgstr "Restablecer contrasinal de usuario" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Linguaxe de libros" diff --git a/cps/translations/hu/LC_MESSAGES/messages.mo b/cps/translations/hu/LC_MESSAGES/messages.mo index 26b9f23a..36d7b14f 100644 Binary files a/cps/translations/hu/LC_MESSAGES/messages.mo and b/cps/translations/hu/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/hu/LC_MESSAGES/messages.po b/cps/translations/hu/LC_MESSAGES/messages.po index c33e9601..d9c5f5ff 100644 --- a/cps/translations/hu/LC_MESSAGES/messages.po +++ b/cps/translations/hu/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2019-04-06 23:36+0200\n" "Last-Translator: \n" "Language: hu\n" @@ -16,447 +16,447 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statisztika" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "A kiszolgáló újraindult, tölts be újra az oldalt!" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "A kiszolgáló leállítása folyamatban, zárd be ezt az ablakot" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Ismeretlen" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Rendszergazda oldala" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Alapvető beállítások" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Felhasználói felület beállításai" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Rendszergazda felhasználó" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mindent mutass" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "A Calibre-Web konfigurációja frissítve." -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Valóban törölni akarod a polcot?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Valóban törölni akarod a polcot?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Valóban törölni akarod a polcot?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Valóban törölni akarod a polcot?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Valóban le akarod állítani a Calibre-Web-et?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP beállítások változtatása" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Hiba történt a teszt levél küldése során: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Az e-mail kiszolgáló beállításai frissítve." -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ismeretlen hiba történt. Próbáld újra később!" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr " A felhasználó szerkesztése: %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "A(z) %(user)s felhasználó jelszavának alaphelyzetbe állítása" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Először be kell állítani az SMTP levelező beállításokat..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Frissítési csomag kérése" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Frissítési csomag letöltése" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Frissítési csomag kitömörítése" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Fájlok cserélése" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Adatbázis kapcsolatok lezárva" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Szerver leállítása" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "A frissítés települt, kattints az OK-ra és újra tölt az oldal" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "A frissítés nem sikerült:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP hiba" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Időtúllépés a kapcsolódás során" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Általános hiba" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -474,7 +474,7 @@ msgstr "Az e-mail kiszolgáló beállításai frissítve." msgid "Database Configuration" msgstr "Funkciók beállítása" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Az összes mezőt ki kell tölteni!" @@ -509,7 +509,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -526,128 +526,128 @@ msgstr "nincs telepítve" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Nincs" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Hiba történt az e-könyv megnyitásakor. A fájl nem létezik vagy nem érhető el:" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "A metaadatok sikeresen frissültek" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Az átalakításhoz hiányzik a forrás- vagy a célformátum!" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "A könyv sikeresen átalakításra lett jelölve a következő formátumra: %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Hiba történt a könyv átalakításakor: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "A(z) %(langname)s nem érvényes nyelv" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "A(z) \"%(ext)s\" kiterjesztésű fájlok feltöltése nincs engedélyezve ezen a szerveren." -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A(z) \"%(ext)s\" kiterjesztésű fájlok feltöltése nincs engedélyezve ezen a szerveren." -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "A feltöltendő fájlnak kiterjesztéssel kell rendelkeznie!" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "Metaadatok szerkesztése" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nem sikerült létrehozni az elérési utat (engedély megtagadva): %(path)s." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Nem sikerült elmenteni a %(file)s fájlt." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s." @@ -660,482 +660,482 @@ msgstr "A Google Drive beállítása nem fejeződött be, próbáld kikapcsolni msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "A visszahívási tartomány nem ellenőrzött, kövesd az alábbi lépéseket a tartomány ellenőrzéséhez a Google Developer Console-ban:" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "A(z) %(format)s formátum nem található a következő könyvhöz: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s nem található a Google Drive-on: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s nem található: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Küldés Kindle-re" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Ez az e-mail a Calibre-Web-en keresztül lett küldve." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web teszt e-mail" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Teszt e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Kezdő lépések a Calibre-Web-bel" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Regisztrációs e-mail a következő felhasználóhoz: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "%(orig)s konvertálása %(format)s-ra és küldés Kindle-re" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "%(format)s küldése Kindle-re" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Küldés Kindle-re" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "A kért fájl nem olvasható. Esetleg jogosultsági probléma lenne?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "A cím átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "A \"%(file)s\" fájl nem található a Google Drive-on" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "A cím átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Felfedezés" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Be vagy jelentkezve mint: %(nickname)s" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Belépés" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "A token nem található." -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "A token érvényessége lejárt." -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Sikerült! Újra használható az eszköz." -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Legutóbbi könyvek mutatása" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Kelendő könyvek" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Kelendő könyvek mutatása" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Legjobb könyvek" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Legjobbra értékelt könyvek mutatása" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Olvasott könyvek" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Mutassa az olvasva/olvasatlan állapotot" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Olvasatlan könyvek" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Felfedezés" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mutass könyveket találomra" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Címkék" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Címke választó mutatása" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Sorozatok" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Sorozat választó mutatása" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Szerzők" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Szerző választó mutatása" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Kiadók" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Kiadó választó mutatása" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Nyelvek" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Nyelv választó mutatása" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Sorozat választó mutatása" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Sorozat választó mutatása" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Legutóbbi könyvek mutatása" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Keresés" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Kiadva ezután: " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Kiadva ezelőtt: " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Értékelés <= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Részletes keresés" @@ -1246,45 +1246,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Polc: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Hiba a polc megnyitásakor. A polc nem létezik vagy nem elérhető." -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Feladatok" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Várakozás" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Nem sikerült" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Elindítva" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Végrehajtva" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Ismeretlen állapot" @@ -1317,175 +1317,175 @@ msgstr "Új frissítés érhető el. Kattints az alábbi gombra a frissítéshez msgid "No release information available" msgstr "Nincs információ a kiadásról." -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Felfedezés (könyvek találomra)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Kelendő könyvek (legtöbbet letöltöttek)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Kiadó: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Sorozat: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Címke: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Nyelv: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Letöltések" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Először be kell állítani az SMTP levelező beállításokat..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Hiba történt a könyv küldésekor: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Először be kell állítani a kindle e-mail címet..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Regisztrálás" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Jóváhagyó levél elküldve az email címedre." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Be vagy jelentkezve mint: %(nickname)s" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Ismeretlen hiba történt. Próbáld újra később!" -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Rossz felhasználó név vagy jelszó!" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Be vagy jelentkezve mint: %(nickname)s" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s profilja" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "A profil frissítve." -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Már létezik felhasználó ehhez az e-mail címhez." @@ -1494,54 +1494,58 @@ msgstr "Már létezik felhasználó ehhez az e-mail címhez." msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Küldés Kindle-re" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1550,11 +1554,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "Metaadatok szerkesztése" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1592,7 +1592,7 @@ msgstr "Felhasználói név" msgid "Email" msgstr "E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle" @@ -1825,7 +1825,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" @@ -1877,7 +1877,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "csökkentsd" @@ -1984,12 +1984,12 @@ msgid "Language" msgstr "Nyelv" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Igen" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nem" @@ -2153,7 +2153,7 @@ msgid "Enter " msgstr "Regisztrálás" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Biztosan?" @@ -2927,7 +2927,7 @@ msgstr "Hiba" msgid "Upload done, processing, please wait..." msgstr "Feltöltés kész, feldolgozás alatt, kérlek várj..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Beállítások" @@ -3064,7 +3064,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr " " @@ -3073,35 +3073,75 @@ msgstr " " msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-könyv katalógus" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Világos" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Sötét" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Vissza" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Szöveg újratördelése amikor az oldalsávok nyitva vannak" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Törlés" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Várakozás" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Függőleges" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Olvasva" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "" @@ -3300,11 +3340,11 @@ msgstr "Kiadás éve ettől: " msgid "Published Date To" msgstr "Kiadás éve eddig: " -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3341,11 +3381,13 @@ msgstr "Értékelés nagyob mint" msgid "Rating Below" msgstr "Értékelés kisebb mint" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3369,6 +3411,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Nyilvános polc" @@ -3437,15 +3487,19 @@ msgstr "Állapot" msgid "Run Time" msgstr "Futásidő" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3453,6 +3507,10 @@ msgstr "" msgid "Reset user Password" msgstr "Felhasználó jelszavának alaphelyzetbe állítása" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Mutasd a könyveket a következő nyelvvel" diff --git a/cps/translations/id/LC_MESSAGES/messages.mo b/cps/translations/id/LC_MESSAGES/messages.mo index 8af80454..d8f9f9e7 100644 Binary files a/cps/translations/id/LC_MESSAGES/messages.mo and b/cps/translations/id/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/id/LC_MESSAGES/messages.po b/cps/translations/id/LC_MESSAGES/messages.po index b425f7c1..42c84488 100644 --- a/cps/translations/id/LC_MESSAGES/messages.po +++ b/cps/translations/id/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2023-01-21 10:00+0700\n" "Last-Translator: Arief Hidayat\n" "Language: id\n" @@ -16,443 +16,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistik" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Server dimulai ulang, harap muat ulang halaman" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Mematikan server, silakan tutup jendela" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Perintah tidak diketahui" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Uji email diantrean untuk dikirim ke %(email), harap periksa Tasks untuk hasilnya" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Tidak diketahui" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Halaman Admin" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Pengaturan Dasar" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Pengaturan Antarmuka" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Edit pengguna" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Semua" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Pengguna tidak ditemukan" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} pengguna berhasil dihapus" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Tampilkan semua" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Permintaan salah" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Nama Tamu tidak dapat diganti" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Tamu tidak dapat memiliki peran ini" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Tidak ada pengguna admin yang tersisa, tidak dapat menghapus peran admin" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Nilai harus benar atau salah" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Peran tidak valid" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr " Tamu tidak dapat mengakses tampilan ini" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr " Tampilan tidak valid" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Lokal Tamu ditentukan secara otomatis dan tidak dapat disetel" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Tidak Ada Lokal yang Valid Diberikan" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Tidak Ada Bahasa Buku yang Valid Diberikan" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter tidak ditemukan" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Kolom Baca Tidak Valid" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Kolom Dibatasi Tidak Valid" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Pengaturan Calibre-Web telah diperbarui" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Apakah Anda yakin ingin menghapus Token Kobo?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Apakah Anda yakin ingin menghapus domain ini?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Apakah Anda yakin ingin menghapus pengguna ini?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Apakah Anda yakin ingin menghapus rak ini?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Apakah Anda yakin ingin merubah lokalisasi untuk pengguna yang dipilih?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Apakah Anda yakin ingin merubah bahasa buku yang terlihat untuk pengguna yang dipilih?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Apakah Anda yakin ingin merubah peran untuk pengguna yang dipilih?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Apakah Anda yakin ingin mengubah batasan yang dipilih untuk pengguna yang dipilih?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Apakah Anda yakin ingin merubah batasan visibilitas untuk pengguna yang dipilih?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Apakah Anda yakin ingin mengubah perilaku sinkronisasi rak untuk pengguna yang dipilih?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Apakah Anda yakin ingin mengubah lokasi perpustakaan Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web akan mencari Sampul yang diperbarui dan memperbarui Thumbnail Sampul, ini mungkin memakan waktu cukup lama?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Apakah Anda yakin ingin menghapus database sinkronisasi Calibre-Web untuk memaksakan sinkronisasi penuh dengan Kobo Reader Anda?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Tolak" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Izinkan" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} entri sinkronisasi dihapus" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Tag tidak ditemukan" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Tindakan Tidak Valid" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Tidak Diatur Untuk Aplikasi Web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Logfile tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Akses Logfile Catatan tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Harap Masukkan Provider LDAP, Port, DN dan User Obect Identifier" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Masukkan Akun Layanan LDAP dan Kata Sandi" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Masukkan Akun Layanan LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filter Objek Grup LDAP Harus Memiliki Satu Pengidentifikasi Format \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filter Objek Grup LDAP Memiliki Tanda kurung yang Tak Berpasangan" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter Objek Pengguna LDAP harus Memiliki Satu Pengidentifikasi Format \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filter Objek Pengguna LDAP Memiliki Tanda kurung yang Tak Berpasangan" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter Pengguna Anggota LDAP harus Memiliki Satu Pengenal Format \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filter Pengguna Anggota LDAP Memiliki Tanda Kurung yang Tak Berpasangan" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Lokasi LDAP Sertifikat CA, Sertifikat, atau Kunci tidak Valid, Harap Masukkan Jalur yang Benar " -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Tambah Pengguna Baru" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Edit Pengaturan Server Email" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Kesalahan basis data: %(error)s" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Uji email diantrean untuk dikirim ke %(email), harap periksa Tasks untuk hasilnya" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Terjadi kesalahan saat mengirim email tes: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Harap atur alamat email Anda terlebih dahulu.." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Setelan server email diperbarui" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Edit Pengaturan Tugas Terjadwal" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Waktu mulai tidak valid untuk tugas yang ditentukan" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Durasi tidak valid untuk tugas yang ditentukan" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Pengaturan tugas terjadwal diperbarui" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Terjadi kesalahan yang tidak diketahui. Coba lagi nanti." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Pengaturan DB tidak dapat ditulisi" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Edit pengguna %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Kata sandi untuk pengaturan ulang pengguna %(user) " -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Harap atur pengaturan email SMTP terlebih dahulu..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Penampil berkas log" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Meminta paket pembaruan" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Mengunduh paket pembaruan" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Mengekstrak paket pembaruan" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Mengganti berkas" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Koneksi basis data ditutup" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Menghentikan server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Pembaruan selesai, silakan tekan OK dan muat ulang halaman" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Pembaruan gagal:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Kesalahan HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Kesalahan koneksi" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Batas waktu saat membuat koneksi" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Kesalahan umum" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Berkas pembaruan tidak dapat disimpan di direktori temp" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Berkas tidak dapat diganti selama pembaruan" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Gagal mengekstrak setidaknya Satu Pengguna LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Gagal Membuat Sedikitnya Satu Pengguna LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Kesalahan: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Error: Tidak ada pengguna yang dikembalikan sebagai respons dari server LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Setidaknya Satu Pengguna LDAP Tidak Ditemukan di Basis Data" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Pengguna Berhasil Diimpor" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Basis Data tidak Valid, Harap Masukkan Jalur yang Benar" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Basis Data tidak dapat ditulisi" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi keyfile tidak Valid, Harap Masukkan Jalur yang Benar " -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Lokasi Sertifikat tidak Valid, Harap Masukkan Jalur yang Benar " @@ -468,7 +468,7 @@ msgstr "Pengaturan Basis Data diperbarui" msgid "Database Configuration" msgstr "Pengaturan Basis Data" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Harap masukkan seluruh isian!" @@ -502,7 +502,7 @@ msgstr "Tidak dapat menghapus Pengguna Tamu" msgid "No admin user remaining, can't delete user" msgstr "Tidak ada pengguna admin tersisa, tidak dapat menghapus pengguna" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "Alamat email tidak boleh kosong dan harus berupa email yang valid" @@ -519,128 +519,128 @@ msgstr "belum dipasang" msgid "Execution permissions missing" msgstr "Izin eksekusi hilang" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Kolom Kustom No.%(column)d tidak ada di basis data kaliber" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Tidak ada" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Ups! Judul buku yang dipilih tidak tersedia. Berkas tidak ada atau tidak dapat diakses" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Pengguna tidak berhak mengganti sampul" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDは大文字小文字を区別しません。元のIDを上書きします" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata berhasil diperbarui" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Kesalahan pengeditan buku: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Berkas %(file)s telah diunggah" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Format sumber atau tujuan untuk konversi tidak ada" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Buku berhasil diantrekan untuk dikonversi ke %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Terjadi kesalahan saat mengonversi buku ini: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Buku yang diunggah mungkin ada di perpustakaan, pertimbangkan untuk mengubahnya sebelum mengunggah yang baru: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' bukan bahasa yang valid" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Ekstensi berkas '%(ext)s' tidak diizinkan untuk diunggah ke server ini" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Ekstensi berkas '%(ext)s' tidak diizinkan untuk diunggah ke server ini" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Berkas yang akan diunggah harus memiliki ekstensi" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Berkas %(filename)s tidak dapat disimpan ke direktori temp" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Gagal Memindahkan Berkas Sampul %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Format Buku Berhasil Dihapus" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Buku Berhasil Dihapus" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Anda tidak memiliki izin untuk menghapus buku" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "edit metadata" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s dilewati karena bukan angka yang valid" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Pengguna tidak memiliki izin untuk mengunggah format berkas tambahan" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Gagal membuat jalur %(path)s (Izin ditolak)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Gagal menyimpan berkas %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Format berkas %(ext)s ditambahkan ke %(book)s" @@ -653,485 +653,485 @@ msgstr "Pengaturan Google Drive belum selesai, coba nonaktifkan dan aktifkan kem msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Domain panggilan balik tidak diverifikasi, ikuti langkah-langkah untuk memverifikasi domain di konsol pengembang google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s format tidak ditemukan untuk id buku: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s tidak ditemukan di Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s tidak ditemukan: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Kirim ke E-Reader" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Email ini telah dikirim melalui Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Email tes Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Email tes" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Memulai dengan Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Email pendaftaran untuk pengguna: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Ubah %(orig)s menjadi %(format)s dan kirim ke E-Reader" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Kirim %(format)s ke E-Reader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%%(buku)s telah dikirim ke E-Reader" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Berkas yang diminta tidak dapat dibaca. Mungkin izinnya salah?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Status baca tidak bisa disetel: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Menghapus folder buku untuk buku %(id)s gagal, jalur memiliki subfolder: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Gagal menghapus buku %(id)s: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Menghapus buku %(id)s hanya dari basis data, jalur buku di basis data tidak valid: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Ganti nama pengarang dari: '%(src)s' menjadi '%(dest)s' gagal dengan kesalahan: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Berkas %(file)s tidak ditemukan di Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Ganti nama judul dari: '%(src)s' menjadi '%(dest)s' gagal dengan kesalahan: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Jalur buku %(path)s tidak ditemukan di Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Nama pengguna ini sudah digunakan" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Format alamat email tidak valid" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Modul 'advocate' Python tidak diinstal tetapi diperlukan untuk unggahan sampul" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Kesalahan Mengunduh Sampul" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Kesalahan Format Sampul" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Anda tidak diizinkan mengakses localhost atau jaringan lokal untuk unggahan sampul" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Gagal membuat jalur untuk sampul" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Berkas sampul bukan berkas gambar yang valid, atau tidak dapat disimpan" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Hanya berkas jpg/jpeg/png/webp/bmp yang didukung sebagai berkas sampul" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Konten berkas sampul tidak valid" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Hanya berkas jpg/jpeg yang didukung sebagai berkas sampul" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Sampul" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Berkas biner unrar tidak ditemukan" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Kesalahan saat menjalankan UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Basis Data tidak dapat ditulisi" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Izin eksekusi hilang" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Kesalahan saat menjalankan UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Antrian semua buku untuk cadangan metadata" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Mohon akses calibre-web dari non localhost untuk mendapatkan api_endpoint yang valid untuk perangkat kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Pengaturan Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Daftar dengan %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Anda sekarang login sebagai: %(nickname)s" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Tautan ke %(oauth)s Berhasil" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Login gagal, Tidak Ada Pengguna yang Tertaut Dengan Akun OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Membatalkan tautan ke %(oauth)s Berhasil" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Membatalkan tautan ke %(oauth)s Gagal" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Tidak Tertaut ke %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Gagal masuk dengan GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Gagal mengambil info pengguna dari GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Gagal masuk dengan Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Gagal mengambil info pengguna dari Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Kesalahan GitHub Oauth, silakan coba lagi nanti." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Kesalahan GitHub OAuth: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Kesalahan Google Oauth, harap coba lagi nanti." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Kesalahan Google OAuth: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{}★" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Masuk" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token tidak ditemukan" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token telah kedaluwarsa" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Berhasil! Silakan kembali ke perangkat Anda" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Buku" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Tampilkan buku terbaru" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Buku Populer" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Tampilkan Buku Populer" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Buku yang Diunduh" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Tampilkan Buku yang Diunduh" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Buku Berperingkat Teratas" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Tampilkan Buku Berperingkat Teratas" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Buku Telah Dibaca" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Tampilkan sudah dibaca dan belum dibaca" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Buku yang Belum Dibaca" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Tampilkan belum dibaca" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Temukan" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Tampilkan Buku Acak" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategori" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Tampilkan pilihan kategori" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Seri" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Tampilkan pilihan seri" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Penulis" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Tampilkan pilihan penulis" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Penerbit" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Tampilkan pilihan penerbit" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Bahasa" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Tampilkan pilihan bahasa" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Peringkat" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Tampilkan pilihan peringkat" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Format berkas" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Tampilkan pilihan format berkas" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Buku yang Diarsipkan" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Tampilkan buku yang diarsipkan" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Daftar Buku" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Tampilkan Daftar Buku" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Telusuri" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Terbit setelah " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Terbit sebelum " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Peringkat ≤ %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Peringkat ≥ %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Status Baca = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Terjadi kesalahan saat mencari kolom khusus, harap mulai ulang Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Penelusuran Lanjutan" @@ -1239,45 +1239,45 @@ msgstr "Rak publik dengan nama '%(title)s' sudah ada." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Rak pribadi dengan nama '%(title)s' sudah ada." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Rak: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Terjadi kesalahan saat membuka rak. Rak tidak ada atau tidak dapat diakses" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tugas" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Menunggu" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Gagal" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Dimulai" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Selesai" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Berakhir" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Dibatalkan" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Status Tidak Diketahui" @@ -1310,178 +1310,178 @@ msgstr "Pembaruan tersedia. Klik tombol di bawah untuk memperbarui ke versi: %(v msgid "No release information available" msgstr "Tidak ada informasi rilis yang tersedia" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Temukan (Buku Acak)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Buku Populer (Paling Banyak Diunduh)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Buku telah diunduh oleh %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Penulis: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Penerbit: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Seri: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Peringkat: Tidak ada" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Peringkat: %(rating)s★" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Format berkas: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Bahasa: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Unduhan" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Daftar peringkat" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Daftar format berkas" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Harap atur pengaturan email SMTP terlebih dahulu..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Buku telah diantrikan untuk dikirim ke %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oops! Terjadi kesalahan saat mengirim buku: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Harap perbarui profil Anda dengan alamat e-mail Kirim ke Kindle yang valid." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Daftar" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Server email belum diatur, silakan hubungi administrator!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Server email belum diatur, silakan hubungi administrator!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Alamat email Anda tidak diizinkan untuk mendaftar" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "E-mail konfirmasi telah dikirimkan ke alamat email Anda." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Tidak dapat mengaktifkan autentikasi LDAP." -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Anda sekarang login sebagai: %(nickname)s" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Login Pengganti sebagai: '%(nickname)s', Server LDAP tidak dapat dijangkau, atau pengguna tidak diketahui." -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Tidak dapat login: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Pengguna atau Kata Sandi salah" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Kata Sandi baru telah dikirimkan ke alamat email Anda" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Terjadi kesalahan yang tidak diketahui. Coba lagi nanti." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Harap masukkan pengguna valid untuk mengatur ulang kata sandi" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Anda sekarang login sebagai: %(nickname)s" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Profil %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profil diperbarui" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Ditemukan akun yang ada untuk alamat email ini" @@ -1489,54 +1489,58 @@ msgstr "Ditemukan akun yang ada untuk alamat email ini" msgid "Found no valid gmail.json file with OAuth information" msgstr "Tidak ditemukan berkas gmail.json yang valid dengan informasi OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%%(buku)s telah dikirim ke E-Reader" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s tidak ditemukan" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format tidak ditemukan dalam disk" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Konverter ebook gagal dengan kesalahan yang tidak diketahui." -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kebupify-converter gagal: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Berkas yang telah dikonversi tidak ditemukan atau terdapat duplikat dalam folder %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook-converter gagal: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre gagal dengan kesalahan: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-converter gagal: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Konversi" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Menghubungkan kembali basis data Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "Email" @@ -1545,11 +1549,7 @@ msgstr "Email" msgid "Backing up Metadata" msgstr "Mencadangkan Metadata" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "%(count)s thumbnail sampul dibuat" @@ -1587,7 +1587,7 @@ msgstr "Nama Pengguna" msgid "Email" msgstr "Alamat Email" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Alamat E-mail untuk Kirim ke E-Reader" @@ -1819,7 +1819,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Batal" @@ -1871,7 +1871,7 @@ msgstr "Urutkan menurut tanggal penerbitan, yang terlama dulu" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "kurangi" @@ -1978,12 +1978,12 @@ msgid "Language" msgstr "Bahasa" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ya" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Tidak" @@ -2144,7 +2144,7 @@ msgid "Enter " msgstr "入力: " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Apakah Anda yakin?" @@ -2919,7 +2919,7 @@ msgstr "Terjadi Kesalahan" msgid "Upload done, processing, please wait..." msgstr "Unggahan selesai, harap tunggu, data sedang diproses..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Pengaturan" @@ -3056,7 +3056,7 @@ msgstr "Direktori Induk" msgid "Select" msgstr "Pilih" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3064,34 +3064,75 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Katalog eBook Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "Pembaca EPUB" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Terang" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Gelap" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sepia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Hitam" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Reflow teks saat sidebar terbuka." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Hapus" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Menunggu" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Baca" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Kolom Baca Tidak Valid" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Pembaca Komik" @@ -3289,11 +3330,11 @@ msgstr "Tanggal Diterbitkan Dari" msgid "Published Date To" msgstr "Tanggal Diterbitkan Hingga" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3329,11 +3370,13 @@ msgstr "Peringkat Diatas" msgid "Rating Below" msgstr "Peringkat Dibawah" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Dari:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Hingga:" @@ -3357,6 +3400,16 @@ msgstr "Nonaktifkan Ubah urutan" msgid "Enable Change order" msgstr "Aktifkan Ubah urutan" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Urutkan menurut tanggal buku, terbaru dulu" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Urutkan menurut tanggal buku, terlama dulu" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Bagikan dengan Semua Orang" @@ -3425,15 +3478,20 @@ msgstr "Kemajuan" msgid "Run Time" msgstr "Waktu Jalan" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Gabungkan" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Tindakan" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Tugas ini akan dibatalkan. Setiap kemajuan yang dibuat oleh tugas ini akan disimpan." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Jika ini adalah tugas terjadwal, ini akan dijalankan ulang selama waktu terjadwal berikutnya." @@ -3441,6 +3499,10 @@ msgstr "Jika ini adalah tugas terjadwal, ini akan dijalankan ulang selama waktu msgid "Reset user Password" msgstr "Atur ulang kata sandi pengguna" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Bahasa Buku" diff --git a/cps/translations/it/LC_MESSAGES/messages.mo b/cps/translations/it/LC_MESSAGES/messages.mo index 9046e1c9..d5162b30 100644 Binary files a/cps/translations/it/LC_MESSAGES/messages.mo and b/cps/translations/it/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index 7a0ae3ea..ae6552d0 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" -"PO-Revision-Date: 2024-07-05 04:34+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" +"PO-Revision-Date: 2024-08-06 06:34+0200\n" "Last-Translator: Massimo Pissarello \n" "Language: it\n" "Language-Team: Italian <>\n" @@ -16,439 +16,439 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistiche" -#: cps/admin.py:150 +#: cps/admin.py:151 msgid "Server restarted, please reload page." msgstr "Server riavviato, ricarica la pagina." -#: cps/admin.py:152 +#: cps/admin.py:153 msgid "Performing Server shutdown, please close window." msgstr "Esecuzione dell'arresto del server, chiudi la finestra." -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "Tutto OK! Database riconnesso" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Comando sconosciuto" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Tutto OK! Libri in coda per il backup dei metadati, controlla le attività per il risultato" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Sconosciuto" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configurazione dell'interfaccia utente" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Modifica utenti" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tutti" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Utente non trovato" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "utenti eliminati correttamente" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostra tutto" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Richiesta non valida" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Il nome dell'utente Guest (ospite) non può essere modificato" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "L'utente Guest (ospite) non può avere questo ruolo" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Non rimarrebbe nessun utente amministratore, non è possibile rimuovere il ruolo di amministratore" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Il valore deve essere vero o falso" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Ruolo non valido" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "L'utente Guest (ospite) non può visualizzare questa schermata" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Visualizzazione non valida" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Le impostazioni locali dell'utente Guest (ospite) sono determinate automaticamente e non possono essere configurate" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Nessuna lingua valida specificata" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Nessun libro valido per la lingua specificata" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parametro non trovato" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Colonna di lettura non valida" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Colonna con restrizioni non valida" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "La configurazione di Calibre-Web è stata aggiornata" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Vuoi veramente eliminare il token di Kobo?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Vuoi veramente eliminare questo dominio?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Vuoi veramente eliminare questo utente?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Sei sicuro di voler eliminare questo scaffale?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Sei sicuro di voler cambiare le impostazioni internazionali degli utenti selezionati?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Sei sicuro di voler cambiare le lingue visibili del libro per gli utenti selezionati?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Sei sicuro di voler cambiare il ruolo selezionato per gli utenti selezionati?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Sei sicuro di voler cambiare le restrizioni selezionate per gli utenti selezionati?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Sei sicuro di voler cambiare le restrizioni di visibilità selezionate per gli utenti selezionati?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Sei sicuro di voler cambiare il comportamento di sincronizzazione dello scaffale per gli utenti selezionati?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Sei sicuro di voler cambiare la posizione della biblioteca di Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web cercherà le copertine aggiornate e aggiornerà le miniature delle copertine, ma ci vorrà un po' di tempo." -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Sei sicuro di voler eliminare il database sincronizzato di Calibre-Web e forzare una sincronizzazione completa con il tuo lettore Kobo?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Nega" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Consenti" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} voci di sincronizzazione eliminate" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Etichetta non trovata" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Azione non valida" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json non è configurato per Web Application" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del file di log non è valida, per favore indica il percorso corretto" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del file del log di accesso non è valida, indica il percorso corretto" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Inserisci un provider LDAP, una porta, un DN e un identificatore oggetto utente" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Inserisci un account e una password del servizio LDAP" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Inserisci un account di servizio LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Il filtro oggetto gruppo LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Il filtro oggetto gruppo LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Il filtro oggetto utente LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Il filtro oggetto utente LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Il filtro utente membro LDAP deve avere un identificatore di formato \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Il filtro utente membro LDAP ha parentesi senza corrispondenza" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Il certificato CA LDAP, il certificato o la posizione della chiave non sono validi. Inserisci il percorso corretto" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Aggiungi nuovo utente" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Modifica le impostazioni del server e-mail" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Tutto OK! Account Gmail verificato." -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Errore nel database: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "L'e-mail di prova è stato accodata correttamente per essere spedita a %(email)s, controlla il risultato in Attività" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Si è verificato un errore nell'invio dell'e-mail di prova: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Configura prima il tuo indirizzo e-mail..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Le impostazioni del server e-mail sono state aggiornate" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Modifica le impostazioni delle attività pianificate" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Ora di inizio non valida per l'attività specificata" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Durata non valida per l'attività specificata" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Impostazioni delle attività pianificate aggiornate" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto. Per favore riprova più tardi." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Il DB delle impostazioni non è scrivibile" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Tutto OK! Password reimpostata per l'utente %(user)s" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "Per favore configura le impostazioni della posta SMTP." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visualizzatore del file di log" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Richiesta del pacchetto di aggiornamento" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Download del pacchetto di aggiornamento" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Decompressione del pacchetto di aggiornamento" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Sostituzione dei file" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Le connessioni al database sono chiuse" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Arresto del server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Aggiornamento terminato, premi OK e ricarica la pagina" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Aggiornamento non riuscito:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Errore HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Errore di connessione" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo scaduto nello stabilire la connessione" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Errore generale" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Il file di aggiornamento non può essere salvato nella cartella temporanea" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Impossibile sostituire i file durante l'aggiornamento" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Impossibile estrarre almeno un utente LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Impossibile creare almeno un utente LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Errore: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Errore: nessun utente restituito in risposta dal server LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Almeno un utente LDAP non è stato trovato nel database" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} utente importato correttamente" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "La posizione del DB non è valida, per favore indica il percorso corretto" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Il DB non è scrivibile" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del Keyfile non è valida. Inserisci il percorso corretto" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "La posizione del Certfile non è valida, indica il percorso corretto" @@ -464,7 +464,7 @@ msgstr "Impostazioni del database aggiornate" msgid "Database Configuration" msgstr "Configurazione del database" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Per favore completa tutti i campi." @@ -498,7 +498,7 @@ msgstr "Impossibile eliminare l'utente Guest (ospite)" msgid "No admin user remaining, can't delete user" msgstr "Non rimarrebbe nessun utente amministratore, non è possibile eliminare l'utente" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "L'e-mail non può essere vuota e deve essere un'e-mail valida" @@ -515,127 +515,127 @@ msgstr "non installato" msgid "Execution permissions missing" msgstr "Mancano i permessi di esecuzione" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "La colonna personalizzata no.%(column)d non esiste nel database di Calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Nessuna" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Il libro selezionato non è disponibile. Il file non esiste o non è accessibile" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "L'utente non ha i permessi per caricare le copertine" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Gli identificatori non fanno distinzione tra maiuscole e minuscole e sovrascrivono il vecchio identificatore" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadati aggiornati correttamente" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Errore nella modifica del libro: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Il file %(file)s è stato caricato" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Manca il formato di origine o di destinazione per la conversione" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Libro accodato correttamente per essere convertito in %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Si è verificato un errore durante la conversione del libro: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Probabilmente il libro caricato esiste già nella biblioteca, cambialo prima di caricarlo di nuovo:" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s non è una lingua valida" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 msgid "File type isn't allowed to be uploaded to this server" msgstr "Non è consentito caricare questo tipo di file su questo server" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Non è consentito caricare l'estensione del file '%(ext)s' su questo server" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Il file da caricare deve avere un'estensione" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Il file %(filename)s non può essere salvato nella cartella temporanea" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Impossibile spostare il file della copertina %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Il formato del libro è stato eliminato correttamente" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Il libro è stato eliminato correttamente" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Ti mancano le autorizzazioni per eliminare i libri" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "modifica i metadati" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s non è un numero valido, lo salto" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "L'utente non ha i permessi per caricare formati di file aggiuntivi" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Impossibile creare il percorso %(path)s (autorizzazione negata)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Impossibile archiviare il file %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato file %(ext)s aggiunto a %(book)s" @@ -648,468 +648,468 @@ msgstr "Configurazione di Google Drive non completata, prova a disattivare e att msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Il dominio di callback non è stato verificato, segui i passaggi per verificare il dominio nella console per sviluppatori di Google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s non trovato per l'ID libro: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s non trovato su Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s non trovato: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Invia all'eReader" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "Questa e-mail è stata inviata tramite Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "E-mail di prova di Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "E-mail di prova" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Inizia con Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "E-mail di registrazione per l'utente: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Converti %(orig)s in %(format)s e invia all'eReader" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, python-format msgid "Send %(format)s to eReader" msgstr "Invia %(format)s all'eReader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, python-format msgid "%(book)s send to eReader" msgstr "%(book)s inviato all'eReader" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Il file richiesto non può essere letto. I permessi sono corretti?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Impossibile impostare lo stato di lettura: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Eliminazione della cartella di libri per il libro %(id)s non riuscita, il percorso ha sottocartelle: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Eliminazione del libro %(id)s non riuscita: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Eliminazione del libro %(id)s solo dal database, percorso del libro nel database non valido: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modifica dell'autore da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Il file %(file) non è stato trovato su Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "La modifica del titolo da '%(src)s' a '%(dest)s' è terminata con l'errore: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Il percorso del libro %(path)s non è stato trovato su Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "Trovato un account esistente per questo indirizzo e-mail" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Questo nome utente è già utilizzato" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "Formato dell'indirizzo e-mail non valido" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "La password non è conforme alle regole di convalida della password" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Il modulo Python \"advocate\" non è installato ma è necessario per il caricamento delle copertine" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Errore nello scaricare la copertina" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Errore nel formato della copertina" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Non ti è consentito accedere all'host locale o alla rete locale per caricare le copertine" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Impossibile creare il percorso per la copertina" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Il file della copertina non è in un formato di immagine valido o non può essere salvato" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Solo i file jpg/jpeg/png/webp/bmp sono supportati come file di copertina" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Contenuto del file di copertina non valido" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Solo i file jpg/jpeg sono supportati come file di copertina" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "Copertina" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "File binario UnRar non trovato" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Errore nell'eseguire UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "Impossibile trovare la cartella specificata" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "Specifica una cartella, non un file" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "Eseguibili di Calibre non validi" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "File eseguibili di Calibre mancanti: %(missing)s" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Permessi di esecuzione mancanti: %(missing)s" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "Errore durante l'esecuzione di Calibre" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Metti in coda tutti i libri per il backup dei metadati" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Accedi a Calibre-Web da un host non locale per ottenere un api_endpoint valido per il dispositivo Kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configurazione di Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registra con %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Tutto OK! Ora sei connesso come: %(nickname)s" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Collegamento riuscito a %(oauth)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Accesso non riuscito, non c'è nessun utente collegato all'account OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Scollegamento da %(oauth)s riuscito" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Scollegamento da %(oauth)s non riuscito" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Non collegato a %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Impossibile accedere con GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Impossibile recuperare le informazioni dell'utente da GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Impossibile accedere con Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Impossibile recuperare le informazioni dell'utente da Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Errore GitHub Oauth, riprova più tardi." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Errore GitHub Oauth: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Errore OAuth di Google, riprova più tardi." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Errore OAuth di Google: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} stelle" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Accesso" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token non trovato" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Il token è scaduto" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Tutto OK! Torna al tuo dispositivo" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Libri" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Mostra Libri recenti" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Libri hot" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Mostra Libri hot" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Libri scaricati" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Mostra Libri scaricati" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Libri più votati" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Mostra Libri più votati" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Libri letti" -#: cps/render_template.py:64 +#: cps/render_template.py:63 msgid "Show Read and Unread" msgstr "Mostra Libri letti e Libri da leggere" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Libri da leggere" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Mostra da leggere" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Libri casuali" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mostra Libri casuali" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorie" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 msgid "Show Category Section" msgstr "Mostra sezione Categorie" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Serie" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 msgid "Show Series Section" msgstr "Mostra sezione Serie" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autori" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 msgid "Show Author Section" msgstr "Mostra sezione Autori" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Editori" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 msgid "Show Publisher Section" msgstr "Mostra sezione Editori" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Lingue" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 msgid "Show Language Section" msgstr "Mostra sezione Lingue" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Valutazioni" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 msgid "Show Ratings Section" msgstr "Mostra sezione Valutazioni" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formati di file" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 msgid "Show File Formats Section" msgstr "Mostra sezione Formati di file" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Libri archiviati" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 msgid "Show Archived Books" msgstr "Mostra Libri archiviati" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Elenco libri" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Mostra Elenco libri" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Cerca" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Pubblicato dopo il " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Pubblicato prima del " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Valutazione <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Valutazione >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "Stato di lettura = '%(status)s'" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Errore nella ricerca delle colonne personalizzate. Per favore riavvia Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Ricerca avanzata" @@ -1217,45 +1217,45 @@ msgstr "Esiste già uno scaffale pubblico con il nome '%(title)s'." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Esiste già uno scaffale privato con il nome '%(title)s'." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Scaffale: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Errore nell'apertura dello scaffale. Lo scaffale non esiste o non è accessibile" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Attività" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Attendi" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Non riuscito" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Avviato" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Finito" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Terminato" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Annullato" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Stato sconosciuto" @@ -1288,169 +1288,169 @@ msgstr "È disponibile un nuovo aggiornamento. Fai clic sul pulsante in basso pe msgid "No release information available" msgstr "Nessuna informazione disponibile sulla versione" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Libri casuali" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Libri hot (i più scaricati)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Libri scaricati da %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autore: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Editore: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Valutazione: nessuna" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Valutazione: %(rating)s stelle" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Formato file: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Lingua: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Scaricati" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Elenco valutazioni" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Elenco formati di file" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "Configura prima le impostazioni della posta SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Tutto OK! Libro in coda per l'invio a %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Si è verificato un errore durante l'invio del libro: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Per favore aggiorna il tuo profilo con un'e-mail eReader valida." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "Attendi un minuto per registrare il prossimo utente" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrati" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Il server e-mail non è configurato, per favore contatta l'amministratore" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "La tua email non è consentita." -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Tutto OK! L'e-mail di conferma è stata inviata." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "Impossibile attivare l'autenticazione LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "Attendi un minuto prima del prossimo accesso" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ora sei connesso come: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Accesso di riserva come: '%(nickname)s', il server LDAP non è raggiungibile o l'utente è sconosciuto" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "Impossibile accedere: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 msgid "Wrong Username or Password" msgstr "Nome utente o password errati" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "La nuova password è stata inviata al tuo indirizzo e-mail" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "Si è verificato un errore sconosciuto, riprova più tardi." -#: cps/web.py:1429 +#: cps/web.py:1430 msgid "Please enter valid username to reset password" msgstr "Inserisci un nome utente valido per reimpostare la password" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ora sei connesso come: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Profilo di %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 msgid "Success! Profile Updated" msgstr "Tutto OK! Profilo aggiornato" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Esiste già un account per questa e-mail." @@ -1458,54 +1458,58 @@ msgstr "Esiste già un account per questa e-mail." msgid "Found no valid gmail.json file with OAuth information" msgstr "Nessun file gmail.json valido con informazioni OAuth trovato" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "Elimina contenuto della cartella temporanea" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s inviato all'E-Reader" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Il convertitore di libri di Calibre %(tool)s non è stato trovato" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s non trovato sul disco" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "La conversione del libro è terminata con un errore sconosciuto" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Errore con il convertitore Kepubify: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "File convertito non trovato o più di un file nella cartella %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Errore nel convertitore: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Si è verificato un errore con Calibre: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Errore nel convertitore: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Converti" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Riconessione al database di Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-mail" @@ -1513,11 +1517,7 @@ msgstr "E-mail" msgid "Backing up Metadata" msgstr "Backup dei metadati" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "Elimina contenuto della cartella temporanea" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Sono state generate %(count)s miniature delle copertine" @@ -1555,7 +1555,7 @@ msgstr "Nome utente" msgid "Email" msgstr "E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Invia all'e-mail dell'eReader" @@ -1786,7 +1786,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annulla" @@ -1838,7 +1838,7 @@ msgstr "Ordina secondo la data di pubblicazione, prima i più vecchi" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "riduci" @@ -1945,12 +1945,12 @@ msgid "Language" msgstr "Lingua" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Sì" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "No" @@ -2111,7 +2111,7 @@ msgid "Enter " msgstr "Inserisci" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Sei veramente sicuro?" @@ -2877,7 +2877,7 @@ msgstr "Errore" msgid "Upload done, processing, please wait..." msgstr "Caricamento terminato, elaborazione in corso..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Impostazioni" @@ -3014,7 +3014,7 @@ msgstr "Cartella superiore" msgid "Select" msgstr "Seleziona" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3022,34 +3022,70 @@ msgstr "OK" msgid "Calibre-Web eBook Catalog" msgstr "Catalogo libri di Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "Lettore epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Chiaro" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Scuro" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Seppia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Nero" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Adatta il testo quando le barre laterali sono aperte." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "Dimensioni caratteri" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "Carattere" + +#: cps/templates/read.html:106 +msgid "Default" +msgstr "Predefinito" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "Yahei" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "SimSun" + +#: cps/templates/read.html:109 +msgid "KaiTi" +msgstr "KaiTi" + +#: cps/templates/read.html:110 +msgid "Arial" +msgstr "Arial" + +#: cps/templates/read.html:113 +msgid "Spread" +msgstr "Doppia pagina" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "Due colonne" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "Una colonna" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Lettore di fumetti" @@ -3246,11 +3282,11 @@ msgstr "Data di pubblicazione dal" msgid "Published Date To" msgstr "Data di pubblicazione fino al" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "Qualsiasi" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "Vuoto" @@ -3286,11 +3322,13 @@ msgstr "Valutazione superiore a" msgid "Rating Below" msgstr "Valutazione inferiore a" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Da:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "A:" @@ -3314,6 +3352,16 @@ msgstr "Disabilita la modifica della disposizione" msgid "Enable Change order" msgstr "Abilita la modifica della disposizione" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Ordina secondo la data dei libri, prima i più recenti" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Ordina secondo la data dei libri, prima i più vecchi" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Condividi con tutti" @@ -3382,15 +3430,19 @@ msgstr "Avanzamento" msgid "Run Time" msgstr "Tempo d'esecuzione" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "Messaggio" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Azioni" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Questa attività verrà annullata. Tutti i progressi compiuti da questa attività verranno salvati." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Se si tratta di un'attività pianificata, verrà eseguita nuovamente all'orario pianificato successivo." @@ -3398,6 +3450,10 @@ msgstr "Se si tratta di un'attività pianificata, verrà eseguita nuovamente all msgid "Reset user Password" msgstr "Reimposta la password dell'utente" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "Invia all'indirizzo e-mail dell'eReader. Usa la virgola per separare le email per più eReader" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Lingua dei libri" diff --git a/cps/translations/ja/LC_MESSAGES/messages.mo b/cps/translations/ja/LC_MESSAGES/messages.mo index a707f3b7..3dbf8836 100644 Binary files a/cps/translations/ja/LC_MESSAGES/messages.mo and b/cps/translations/ja/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/ja/LC_MESSAGES/messages.po b/cps/translations/ja/LC_MESSAGES/messages.po index 348eb099..f8072398 100644 --- a/cps/translations/ja/LC_MESSAGES/messages.po +++ b/cps/translations/ja/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2018-02-07 02:20-0500\n" "Last-Translator: subdiox \n" "Language: ja\n" @@ -16,443 +16,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "統計" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "サーバーを再起動しました。ページを再読み込みしてください" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "サーバーをシャットダウンしています。ページを閉じてください" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "不明なコマンド" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "%(email)s へのテストメール送信がキューに追加されました。結果を見るにはタスクを確認してください" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "不明" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "管理者ページ" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "基本設定" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "UI設定" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "ユーザーを編集" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全て" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "ユーザーが見つかりません" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{}人のユーザーが削除されました" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "全て表示" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "不正なリクエスト" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "ゲストユーザーの名前は変更できません" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "ゲストユーザーはこのロールを持つことができません" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "管理者ユーザーが残っておらず、管理者ロールを削除できません" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "値はtrueかfalseのどちらかでなければなりません" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "無効なロール" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "ゲストユーザーはこの画面を表示できません" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "無効な表示" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "ゲストユーザーの言語設定は自動的に決定されるため、固定することはできません" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "有効な言語設定がありません" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "有効な本の言語がありません" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "パラメータが見つかりません" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "無効な読み取り列" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "無効な制限列" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Webの設定を更新しました" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Koboのトークンを削除してもよろしいですか?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "このドメインを削除してもよろしいですか?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "このユーザーを削除してもよろしいですか?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "この本棚を削除してもよろしいですか?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "選択したユーザーの言語設定を変更してもよろしいですか?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "選択したユーザーが表示できる本の言語を変更してもよろしいですか?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "選択したユーザーの選択したロールを変更してもよろしいですか?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "選択したユーザーの選択した制限を変更してもよろしいですか?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "選択したユーザーの選択した表示制限を変更してもよろしいですか?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "選択したユーザーの本棚同期の動作を変更してもよろしいですか?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Calibreライブラリのパスを変更してもよろしいですか?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Webは新しい表紙を検索してそのサムネイルを更新しますが、これにはしばらく時間がかかるかもしれません" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Calibre-Webの同期DBを削除して強制的にKoboリーダーと同期してもよろしいですか?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒否" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "許可" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{}件の同期項目を削除しました" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "タグが見つかりません" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "無効なアクションです" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.jsonがWebアプリケーション用に設定されていません" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "ログファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "アクセスログファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "LDAPのプロバイダ、ポート番号、DN、ユーザーIDを入力してください" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "LDAPのサービスアカウント名とパスワードを入力してください" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "LDAPのサービスアカウント名を入力してください" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAPのグループフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAPのグループフィルタ内の括弧が一致しません" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAPのユーザーフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAPのユーザーフィルタ内の括弧が一致しません" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAPのメンバーフィルタには \"%s\" というフォーマットのIDが一つ必要です" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAPのメンバーフィルタ内の括弧が一致しません" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAPのCA証明書、証明書、キーの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "新規ユーザーを追加" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "メールサーバー設定を編集" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "DBエラー: %(error)s" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "%(email)s へのテストメール送信がキューに追加されました。結果を見るにはタスクを確認してください" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "%(res)s へのテストメール送信中にエラーが発生しました" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "初めにメールアドレスを設定してください" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "メールサーバーの設定を更新しました" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "スケジュールタスク設定を編集" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "指定したタスクの開始時刻が無効です" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "指定したタスクの期間が無効です" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "スケジュールタスクの設定を更新しました" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "設定DBが書き込みできません" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "ユーザー %(nick)s を編集" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "ユーザー %(user)s のパスワードをリセット" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "初めにSMTPメールの設定をしてください" -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "ログファイルビューア" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "更新データを要求中" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "更新データをダウンロード中" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "更新データを展開中" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "ファイルを置換中" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "DB接続を切断" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "サーバー停止中" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "アップデート完了、OKを押してページを再読み込みしてください" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "アップデート失敗:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTPエラー" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "接続エラー" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "接続確立中にタイムアウトしました" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "エラー発生" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "更新データを一時フォルダに保存できませんでした" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "更新中にファイルを置換できませんでした" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "少なくとも1人のLDAPユーザーの抽出に失敗しました" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "少なくとも1人のLDAPユーザーの作成に失敗しました" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "エラー: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "エラー: LDAPサーバーのレスポンスでユーザーが返されません" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "DB内にLDAPユーザーが1人も見つかりません" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{}人のユーザーをインポートしました" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DBの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "DBへの書き込みができません" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "キーファイルの場所が無効です。正しいパスを入力してください" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "証明書ファイルの場所が無効です。正しいパスを入力してください" @@ -468,7 +468,7 @@ msgstr "DB設定を更新しました" msgid "Database Configuration" msgstr "DB設定" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "全ての項目を入力してください" @@ -502,7 +502,7 @@ msgstr "ゲストユーザーは削除できません" msgid "No admin user remaining, can't delete user" msgstr "管理者ユーザーが残っておらず、ユーザーを削除できません" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -519,128 +519,128 @@ msgstr "インストールされていません" msgid "Execution permissions missing" msgstr "実行権限がありません" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "カスタムカラムの%(column)d列目がcalibreのDBに存在しません" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "なし" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "選択した本は利用できません。ファイルが存在しないか、アクセスできません" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "ユーザーは表紙をアップロードする権限がありません" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "IDは大文字小文字を区別しません。元のIDを上書きします" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "メタデータを更新しました" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "本編集中のエラー: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "ファイル %(file)s をアップロードしました" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "変換元の形式または変換後の形式が指定されていません" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "本の %(book_format)s への変換がキューに追加されました" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "この本の変換中にエラーが発生しました: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "アップロードした本はすでにライブラリに存在します。新しくアップロードする前に変更を加えてください: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' は有効な言語ではありません" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "ファイル拡張子 '%(ext)s' をこのサーバーにアップロードすることは許可されていません" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "ファイル拡張子 '%(ext)s' をこのサーバーにアップロードすることは許可されていません" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "アップロードするファイルには拡張子が必要です" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "ファイル %(filename)s は一時フォルダに保存できませんでした" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "表紙ファイル %(file)s の移動に失敗しました: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "本の形式を削除しました" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "本を削除しました" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "本を削除する権限がありません" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "メタデータを編集" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s は有効な数字ではありません。スキップします" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "新たなファイル形式をアップロードする権限がありません" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s の作成に失敗しました (Permission denied)。" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "ファイル %(file)s を保存できません。" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "ファイル形式 %(ext)s が %(book)s に追加されました" @@ -653,485 +653,485 @@ msgstr "Googleドライブの設定が完了していません。Googleドライ msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "コールバックドメインが認証されていません。Google Developer Consoleでドメインを認証してください" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "ID: %(book)d の本に %(format)s フォーマットはありません" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Googleドライブ: %(fn)s に %(format)s はありません" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s がありません: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "E-Readerに送信" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "このメールはCalibre-Web経由で送信されました。" -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web テストメール" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "テストメール" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Calibre-Webを始める" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "ユーザー: %(name)s 用の登録メール" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "%(orig)s を %(format)s に変換してからE-Readerに送信" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "E-Readerに %(format)s を送信" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s をE-Readerに送信" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "要求されたファイルを読み込めませんでした。権限設定が正しいか確認してください。" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "読み込みステータスを設定できません: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "%(id)s の本フォルダの削除に失敗しました。そこにはサブフォルダがあります: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "本 %(id)s の削除に失敗しました: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "本 %(id)s はDBのみから削除されます。DB内の本のパスが有効ではありません: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "エラー: %(error)s により、著者名を %(src)s から %(dest)s に変更できませんでした" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "ファイル %(file)s はGoogleドライブ上にありません" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "エラー: %(error)s により、タイトルを %(src)s から %(dest)s に変更できませんでした" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "本のパス %(path)s はGoogleドライブ上にありません" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "このユーザー名はすでに使われています" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "メールアドレスの形式が無効" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "表紙のアップロードに必要なPythonモジュール 'advocate' がインストールされていません" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "表紙のダウンロードに失敗しました" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "表紙形式エラー" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "表紙アップロードのためにlocalhostやローカルネットワークにアクセスすることは許可されていません" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "表紙ファイルの作成に失敗しました" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "表紙ファイルが有効な画像ファイルでないか、または保存できませんでした" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "表紙ファイルは jpg/jpeg/png/webp/bmp のみ対応しています" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "表紙ファイルの内容が無効です" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "表紙ファイルは jpg/jpeg のみ対応しています" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "見つける" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRarのバイナリファイルが見つかりません" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "UnRarの実行中にエラーが発生しました" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "DBへの書き込みができません" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "実行権限がありません" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "UnRarの実行中にエラーが発生しました" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "localhost以外からCalibre-Webにアクセスし、有効なKobo端末用APIエンドポイントを取得してください" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo設定" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "%(provider)s で登録" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "%(nickname)s としてログイン中" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "%(oauth)s との連携に成功しました" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "ログイン失敗、OAuthアカウントと連携しているユーザーが存在しません" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "%(oauth)s との連携解除に成功しました" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "%(oauth)s との連携解除に失敗しました" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "%(oauth)s と連携していません" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "GitHubアカウントでのログインに失敗しました。" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "GitHubからのユーザー情報取得に失敗しました。" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Googleアカウントでのログインに失敗しました。" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Googleからのユーザー情報取得に失敗しました。" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub OAuth エラー、再度お試しください。" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub OAuth エラー: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google OAuth エラー、再度お試しください。" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google OAuth エラー: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "星{}" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "ログイン" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "トークンが見つかりません" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "トークンが無効です" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "成功です!端末に戻ってください" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "本" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "最近追加された本を表示" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "人気の本" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "人気の本を表示" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "ダウンロードされた本" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "ダウンロードされた本を表示" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "高評価の本" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "高評価の本を表示" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "既読の本" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "既読の本と未読の本を表示" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "未読の本" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "未読の本を表示" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "見つける" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "ランダムに本を表示" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "カテゴリ" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "カテゴリ選択を表示" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "シリーズ" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "シリーズ選択を表示" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "著者" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "著者選択を表示" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "出版社" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "出版社選択を表示" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "言語" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "言語選択を表示" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "評価" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "評価選択を表示" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "ファイル形式" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "ファイル形式選択を表示" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "アーカイブされた本" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "アーカイブされた本を表示" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "本の一覧" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "本の一覧を表示" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "検索" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "これ以降に出版 " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "これ以前に出版 " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "評価 <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "評価 >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "既読/未読状況 = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "カスタムカラムの検索でエラーが発生しました。Calibre-Webを再起動してください" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "詳細検索" @@ -1239,45 +1239,45 @@ msgstr "'%(title)s' という名前のみんなの本棚はすでに存在しま msgid "A private shelf with the name '%(title)s' already exists." msgstr "'%(title)s' という名前の本棚はすでに存在します。" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "本棚: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "本棚を開けません。この本棚は存在しないかアクセスできません" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "タスク" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "待機中" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "失敗" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "開始" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "終了" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "終了" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "キャンセル" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "不明" @@ -1310,178 +1310,178 @@ msgstr "アップデートが利用可能です。下のボタンをクリック msgid "No release information available" msgstr "リリース情報がありません" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "本を見つける (ランダムに表示)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "人気の本 (最もダウンロードされた本)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s がダウンロードした本" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "著者: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "出版社: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "シリーズ: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "評価: なし" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "評価: 星%(rating)s" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "ファイル形式: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "カテゴリ: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "言語: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "ダウンロード数" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "評価一覧" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "ファイル形式一覧" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "初めにSMTPメールの設定をしてください" -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "本の %(eReadermail)s への送信がキューに追加されました" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "%(res)s を送信中にエラーが発生しました" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "初めにKindleのメールアドレスを設定してください" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "登録" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "メールサーバーが設定されていません。管理者に連絡してください" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "メールサーバーが設定されていません。管理者に連絡してください" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "このメールアドレスは登録が許可されていません" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "確認メールがこのメールアドレスに送信されました。" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "LDAP認証を有効化できません" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログイン中" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "代わりに '%(nickname)s' としてログインします。LDAPサーバーにアクセスできないか、ユーザーが存在しません" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "ログインできません: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "ユーザー名またはパスワードが違います" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "新しいパスワードがあなたのメールアドレスに送信されました" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "不明なエラーが発生しました。あとで再試行してください。" -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "パスワードをリセットするには、有効なユーザー名を入力してください" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "%(nickname)s としてログイン中" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s のプロフィール" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "プロフィールを更新しました" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "このメールアドレスで登録されたアカウントがすでに存在します" @@ -1489,54 +1489,58 @@ msgstr "このメールアドレスで登録されたアカウントがすでに msgid "Found no valid gmail.json file with OAuth information" msgstr "OAuth情報を含んだ有効なgmail.jsonファイルが見つかりません" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s をE-Readerに送信" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s が見つかりません" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s 形式は存在しません" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Ebook converter が不明なエラーで失敗しました" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter が失敗しました: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "変換されたファイルが見つからないか、またはフォルダー %(folder)s 内に複数存在します" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook-converter が失敗しました: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre が失敗しました: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-converter が失敗しました: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "変換" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Calibre DBと再接続中" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "メール" @@ -1545,11 +1549,7 @@ msgstr "メール" msgid "Backing up Metadata" msgstr "メタデータを編集" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "表紙サムネイルを%(count)s個生成しました" @@ -1587,7 +1587,7 @@ msgstr "ユーザー名" msgid "Email" msgstr "メールアドレス" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "E-Readerメールアドレス" @@ -1819,7 +1819,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "キャンセル" @@ -1871,7 +1871,7 @@ msgstr "発売日が古い順にソート" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "減らす" @@ -1978,12 +1978,12 @@ msgid "Language" msgstr "言語" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "既読" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "未読" @@ -2144,7 +2144,7 @@ msgid "Enter " msgstr "入力: " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "よろしいですか?" @@ -2919,7 +2919,7 @@ msgstr "エラー" msgid "Upload done, processing, please wait..." msgstr "アップロード完了。現在処理中ですのでお待ち下さい..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "設定" @@ -3056,7 +3056,7 @@ msgstr "親ディレクトリ" msgid "Select" msgstr "選択" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3064,34 +3064,75 @@ msgstr "OK" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-WebのeBookカタログ" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "EPUBリーダー" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "ライト" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "ダーク" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "セピア" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "ブラック" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "サイドバーが開いているとき、テキストを再度流し込みます。" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "削除" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "待機中" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "垂直方向" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "既読" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "無効な読み取り列" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "コミックリーダー" @@ -3289,11 +3330,11 @@ msgstr "発売日(〜から)" msgid "Published Date To" msgstr "発売日(〜まで)" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3329,11 +3370,13 @@ msgstr "評価(〜以上)" msgid "Rating Below" msgstr "評価(〜以下)" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "〜から:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "〜まで:" @@ -3357,6 +3400,16 @@ msgstr "並び順の変更を無効にする" msgid "Enable Change order" msgstr "並び順の変更を有効にする" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "追加日が新しい順にソート" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "追加日が古い順にソート" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "みんなと共有" @@ -3425,15 +3478,20 @@ msgstr "進捗" msgid "Run Time" msgstr "稼働時間" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "統合" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "アクション" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "このタスクはキャンセルされます。このタスクによる進捗はすべて保存されます。" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "これがスケジュールタスクの場合、次のスケジュールの時刻にはもう一度実行されます。" @@ -3441,6 +3499,10 @@ msgstr "これがスケジュールタスクの場合、次のスケジュール msgid "Reset user Password" msgstr "パスワードをリセット" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "本の言語" diff --git a/cps/translations/km/LC_MESSAGES/messages.mo b/cps/translations/km/LC_MESSAGES/messages.mo index 4ccbaee3..3642ed3e 100644 Binary files a/cps/translations/km/LC_MESSAGES/messages.mo and b/cps/translations/km/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/km/LC_MESSAGES/messages.po b/cps/translations/km/LC_MESSAGES/messages.po index 593a9e2e..9bae2219 100644 --- a/cps/translations/km/LC_MESSAGES/messages.po +++ b/cps/translations/km/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2018-08-27 17:06+0700\n" "Last-Translator: \n" "Language: km_KH\n" @@ -17,448 +17,448 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "ស្ថិតិ" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "ម៉ាស៊ីន server បានដំណើរការម្តងទៀត សូមបើកទំព័រជាថ្មី" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "កំពុងបិទម៉ាស៊ីន server សូមបិទផ្ទាំងនេះ" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(eReadermail)s ដោយជោគជ័យ" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "មិនដឹង" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "ទំព័ររដ្ឋបាល" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "ការកំណត់សាមញ្ញ" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "ការកំណត់ផ្ទាំងប្រើប្រាស់" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "អ្នកប្រើប្រាស់រដ្ឋបាល" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "បង្ហាញទាំងអស់" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "ប្តូរការកំណត់ SMTP" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "កំពុងស្នើសុំឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "កំពុងទាញយកឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "កំពុងពន្លាឯកសារបច្ចុប្បន្នភាព" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្នន័យត្រូវបានផ្តាច់" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "ការធ្វើបច្ចុប្បន្នភាពបានបញ្ចប់ សូមចុច okay រួចបើកទំព័រជាថ្មី" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -476,7 +476,7 @@ msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្ msgid "Database Configuration" msgstr "ការកំណត់មុខងារ" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "សូមបំពេញចន្លោះទាំងអស់!" @@ -510,7 +510,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -527,128 +527,128 @@ msgstr "មិនបានតម្លើង" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "គ្មាន" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "ឯកសារប្រភេទ '%(ext)s' មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "ឯកសារប្រភេទ '%(ext)s' មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "ឯកសារដែលត្រូវអាប់ឡូដត្រូវមានកន្ទុយឯកសារ" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "កែប្រែទិន្នន័យមេតា" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "មិនអាចបង្កើតទីតាំង %(path)s (ពុំមានសិទ្ធិ)។" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s" @@ -661,479 +661,479 @@ msgstr "" msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Callback domain មិនទាន់បានផ្ទៀងផ្ទាត់ឲប្រើទេ សូមធ្វើតាមជំហានដើម្បីផ្ទៀងផ្ទាត់ domain នៅក្នុង Google Developer Console" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "ផ្ញើទៅ Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "ផ្ញើទៅ Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "ផ្ញើទៅ Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "ឯកសារដែលបានស្នើសុំមិនអាចបើកបានទេ។ អាចនឹងខុសសិទ្ធិប្រើប្រាស់ទេដឹង?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "ស្រាវជ្រាវ" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "ចូលប្រើប្រាស់" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "រកមិនឃើញវត្ថុតាង" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "វត្ថុតាងហួសពេលកំណត់" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "បង្ហាញសៀវភៅមកថ្មី" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "សៀវភៅដែលមានប្រជាប្រិយភាព" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "បង្ហាញសៀវភៅដែលមានប្រជាប្រិយភាព" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "សៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "បង្ហាញសៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "សៀវភៅដែលបានអានរួច" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "បង្ហាញអានរួច និងមិនទាន់អាន" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "សៀវភៅដែលមិនទាន់បានអាន" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "ស្រាវជ្រាវ" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "បង្ហាញសៀវភៅចៃដន្យ" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "ប្រភេទនានា" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "បង្ហាញជម្រើសប្រភេទ" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "ស៊េរី" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "បង្ហាញជម្រើសស៊េរី" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "អ្នកនិពន្ធ" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "បង្ហាញជម្រើសអ្នកនិពន្ធ" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "បង្ហាញជម្រើសស៊េរី" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "ភាសានានា" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "បង្ហាញផ្នែកភាសា" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "បង្ហាញជម្រើសស៊េរី" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "បង្ហាញជម្រើសស៊េរី" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "បង្ហាញសៀវភៅមកថ្មី" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "ស្វែងរក" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "បានបោះពុម្ភក្រោយ " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "បានបោះពុម្ភមុន " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "ការវាយតម្លៃ <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "ការវាយតម្លៃ >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "ស្វែងរកកម្រិតខ្ពស់" @@ -1243,45 +1243,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "ធ្នើ៖ ‘%(name)s’" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "កិច្ចការនានា" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "កំពុងរង់ចាំ" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "បានបរាជ័យ" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "បានចាប់ផ្តើម" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "បានបញ្ចប់" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "" @@ -1314,173 +1314,173 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "សៀវភៅដែលត្រូវបានទាញយកច្រើនជាងគេ" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "ស៊េរី៖ %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "ប្រភេទ៖ %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "ភាសា៖ %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "ឯកសារ DLS" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(eReadermail)s ដោយជោគជ័យ" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "ចុះឈ្មោះ" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1488,54 +1488,58 @@ msgstr "" msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "ផ្ញើទៅ Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1544,11 +1548,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "កែប្រែទិន្នន័យមេតា" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1586,7 +1586,7 @@ msgstr "ឈ្មោះហៅក្រៅ" msgid "Email" msgstr "" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "ឧបករណ៍ Kindle" @@ -1819,7 +1819,7 @@ msgstr "បាទ/ចាស" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" @@ -1871,7 +1871,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "" @@ -1978,12 +1978,12 @@ msgid "Language" msgstr "ភាសា" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "បាទ/ចាស" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "ទេ" @@ -2146,7 +2146,7 @@ msgid "Enter " msgstr "ចុះឈ្មោះ" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "" @@ -2916,7 +2916,7 @@ msgstr "" msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "ការកំណត់" @@ -3053,7 +3053,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "សៀវភៅ" @@ -3062,35 +3062,74 @@ msgstr "សៀវភៅ" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "មកក្រោយ" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "សេរេអត្ថបទនៅពេលបើកផ្ទាំងចំហៀង។" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "លុប" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "កំពុងរង់ចាំ" + +#: cps/templates/read.html:110 +msgid "Arial" +msgstr "" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "អាន" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "" @@ -3289,11 +3328,11 @@ msgstr "ថ្ងៃបោះពុម្ភចាប់ពី" msgid "Published Date To" msgstr "ថ្ងៃបោះពុម្ភរហូតដល់" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3330,11 +3369,13 @@ msgstr "ការវាយតម្លៃលើសពី" msgid "Rating Below" msgstr "ការវាយតម្លៃតិចជាង" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3358,6 +3399,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "តើធ្នើនេះគួរជាសាធារណៈទេ?" @@ -3426,15 +3475,19 @@ msgstr "ដំណើរការ" msgid "Run Time" msgstr "រយៈពេលដែលបានចាប់ផ្តើម" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3442,6 +3495,10 @@ msgstr "" msgid "Reset user Password" msgstr "" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "បង្ហាញសៀវភៅដែលមានភាសា" diff --git a/cps/translations/ko/LC_MESSAGES/messages.mo b/cps/translations/ko/LC_MESSAGES/messages.mo index f7170aea..61d1fa7e 100644 Binary files a/cps/translations/ko/LC_MESSAGES/messages.mo and b/cps/translations/ko/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/ko/LC_MESSAGES/messages.po b/cps/translations/ko/LC_MESSAGES/messages.po index e98bf6aa..078de9d7 100644 --- a/cps/translations/ko/LC_MESSAGES/messages.po +++ b/cps/translations/ko/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2022-01-10 11:30+0900\n" "Last-Translator: 내맘대로의 EPUBGUIDE.NET \n" "Language: ko\n" @@ -15,443 +15,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "통계" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "서버 다시 시작으로 새로고침 필요" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "서버를 종료하는 중, 창을 닫아야 함" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "성공적으로 DB를 다시 연결하였습니다." -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "알 수 없는 명령" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "%(email)s에 테스트를 위한 이메일을 보냄. 결과 확인 필요" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "알 수 없음" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "관리자 페이지" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "기본 설정" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "UI 설정" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "사용자 관리" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "모두" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "사용자를 찾을 수 없음" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} 사용자를 성공적으로 삭제함" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "모두 보기" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "잘못된 요청" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Guest 이름은 수정할 수 없음" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Guest는 이 권한을 사용할 수 없음" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "관리자 계정이 하나 뿐일 때는 관리자를 삭제할 수 없음" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "값으로 rue 또는 false만 설정 가능" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "잘못된 권한" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Guest는 이 view를 사용할 수 없음" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "잘못된 view" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Guest의 로케일은 자동으로 결정되며 설정할 수 없음" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "유효한 로케일이 아님" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "제공된 책의 언어가 유효하지 않음" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "매개변수를 찾을 수 없음" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "잘못된 읽기 열" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "잘못된 제한된 열" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web 설정이 업데이트 됨" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Kobo Token을 삭제하시겠습니까?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "이 도메인을 삭제하시겠습니까?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "이 사용자를 삭제하시겠습니까?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "이 서재를 삭제하시겠습니까?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "선택한 사용자의 언어를 변경하시겠습니까?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "선택한 사용자에 대해 표시되는 책 언어를 변경하시겠습니까?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "선택한 사용자에 대해 선택한 권한을 변경하시겠습니까?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "선택한 사용자에 대해 선택한 제한을 변경하시겠습니까?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "선택한 사용자에 대해 선택한 가시성 제한을 변경하시겠습니까?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "선택한 사용자의 실행기 동기화 동작을 변경하시겠습니까?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "캘리버 서재의 언어를 변경하시겠습니까?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web은 업데이트된 표지를 검색하고 표지 섬네일 업데이트합니다. 시간이 오래 걸릴 수 있습니다." -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Kobo Reader와 전체 동기화를 강제 실행하기 위해 Calibre-Web의 동기화 데이터베이스를 삭제하시겠습니까?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "거부됨" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "허용됨" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} 동기화 항목이 삭제됨" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "태그를 찾을 수 없음" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "잘못된 액션" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json이 Web 응용프로그램에 대해 설정되지 않음" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "로그 파일 위치가 오류. 올바른 경로 입력 필요" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "액세스 로그 파일 위치가 올바르지 않음. 올바른 경로 입력 필요" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "LDAP 공급자, 포트, DN 및 사용자 개체 식별자를 입력" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "LDAP 서비스 계정 및 비밀번호를 입력하십시오" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "LDAP 서비스 계정을 입력하십시오" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP 그룹 개체 필터에는 하나의 \"%s\" 형식 식별자가 필요함" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP 그룹 개체 필터에 일치하지 않는 괄호가 있음" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 사용자 개체 필터에는 하나의 \"%s\" 형식 식별자 필요" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP 사용자 개체 필터에 일치하지 않는 괄호가 있음" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 구성원 사용자 필터에는 하나의 \"%s\" 형식 식별자 필요" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP 구성원 사용자 필터에 일치하지 않는 괄호가 있음" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "유요하지 않은 LDAP CACertificate, 인증서 또는 키 위치. 올바른 경로를 입력 필요" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "사용자 추가" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "이메일 서버 설정 편집" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Gmail 계정 인증에 성공하였습니다." -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "데이터베이스 오류: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "%(email)s에 테스트를 위한 이메일을 보냄. 결과 확인 필요" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "테스트 이메일을 보내는 동안 오류가 발생했습니다: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "먼저 이메일 주소를 구성하십시오..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "이메일 서버 설정 업데이트됨" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "예약 작업 설정 편집" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "지정된 작업의 시작 시간이 잘못 설정되었습니다." -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "지정된 작업의 기간이 잘못 설정되었습니다." -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "예약된 작업 설정을 업데이트 하였습니다." -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "알 수없는 오류가 발생했습니다. 나중에 다시 시도 해주십시오." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "저장할 수 없는 설정 DB입니다." -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "사용자 %(nick)s 편집" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "사용자 %(user)s의 비밀번호 재설정" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "먼저 SMTP 메일 설정을 구성하십시오..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "로그 파일 뷰어" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "업데이트 패키지 요청" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "업데이트 패키지 다운로드" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "업데이트 패키지 압축 풀기" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "파일 교체" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "데이터베이스 연결이 닫힙니다" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "서버 중지" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "업데이트가 완료되었습니다. 확인을 누르고 페이지를 새로고침하세요" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "업데이트 실패:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP 오류" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "연결 오류" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "연결 설정 중 시간 초과" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "일반 오류" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "임시 디렉토리에 업데이트 파일을 저장할 수 없습니다" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "업데이트하는 동안 파일을 교체할 수 없습니다" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "하나 이상의 LDAP 사용자를 추출하지 못했습니다" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "하나 이상의 LDAP 사용자를 생성하지 못했습니다" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "오류: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "오류: LDAP 서버의 응답으로 사용자가 반환되지 않았습니다" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "데이터베이스에서 하나 이상의 LDAP 사용자를 찾을 수 없습니다" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} 사용자 가져오기 성공" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "올바르지 않은 DB 위치. 올바른 경로 입력 필요" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "쓰기 권한이 없는 DB" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "올바르지 않은 키 파일 위치. 올바른 경로 입력 필요" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "올바르지 않은 인증서 파일 위치. 올바른 경로 입력 필요" @@ -467,7 +467,7 @@ msgstr "데이터베이스 설정이 업데이트 되었습니다" msgid "Database Configuration" msgstr "데이터베이스 구성" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "모든 필드를 채워주십시오!" @@ -501,7 +501,7 @@ msgstr "게스트 사용자는 삭제할 수 없습니다" msgid "No admin user remaining, can't delete user" msgstr "관리자 계정이 하나 뿐일 때는 관리자 권한을 삭제할 수 없음" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "이메일은 반드시 입력해야 하며 유효한 이메일이어야 합니다." @@ -518,128 +518,128 @@ msgstr "설치되지 않음" msgid "Execution permissions missing" msgstr "실행 권한 누락" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "사용자 정의 열 번호 %(column)d이(가) calibre 데이터베이스에 없습니다" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "None" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "선택한 책 제목을 사용할 수 없습니다. 파일이 존재하지 않거나 액세스할 수 없습니다" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "표지를 업로드 할 수 있는 권한이 없는 사용자입니다." -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "식별자는 대소문자를 구분하지 않으며 이전 식별자를 덮어씁니다" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "메타데이터가 성공적으로 업데이트되었습니다" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "책 편집 중 오류 발생: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "파일 %(file)s 업로드됨" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "변환을 위한 소스 또는 대상 형식이 누락되었습니다" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "책이 %(book_format)s(으)로 변환하기 위해 대기 중입니다" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "이 책을 변환하는 동안 오류가 발생했습니다: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "업로드한 책이 라이브러리에 있을 수 있음. 새로 업로드하기 전에 확인 필요: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s'은(는) 유효한 언어가 아닙니다" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "파일 확장자 '%(ext)s'은(는) 이 서버에 업로드할 수 없습니다" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "파일 확장자 '%(ext)s'은(는) 이 서버에 업로드할 수 없습니다" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "업로드할 파일에는 확장자가 있어야 합니다" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "파일 %(filename)s을(를) 임시 디렉토리에 저장할 수 없습니다" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "표지 파일%(file)s를 이동하지 못했습니다.:%(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "책 형식이 성공적으로 삭제되었습니다" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "책이 성공적으로 삭제되었습니다" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "책을 삭제할 수 있는 권한이 없습니다." -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "메타데이터 편집" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s은(는) 유효한 숫자가 아닙니다. 건너뜁니다" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "추가 파일 유형을 업로드 할 권한이 없는 사용자입니다." -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s 경로를 생성하지 못했습니다(권한이 없음)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "%(file)s 파일을 저장하지 못했습니다." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "파일 형식 %(ext)s이(가) %(book)s에 추가되었습니다" @@ -652,487 +652,487 @@ msgstr "Google 드라이브 설정이 완료되지 않았습니다. Google 드 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "콜백 도메인이 확인되지 않았습니다. 단계에 따라 Google 개발자 콘솔에서 도메인을 확인하세요" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "책 ID에 대한 %(format)s 형식을 찾을 수 없음: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s을(를) Google 드라이브에서 찾을 수 없음: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s을(를) 찾을 수 없음: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "킨들로 보내기" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "이 이메일은 Calibre Web을 통해 전송되었습니다." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web 테스트 이메일" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "테스트 이메일" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Calibre-Web 시작하기" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "사용자 등록 이메일: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "%(orig)s를 %(format)s로 변환하고 킨들로 보내기" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "킨들에 %(format)s 보내기" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s을 킨들로 보내기" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "요청한 파일을 읽을 수 없습니다. 올바른 권한인가요?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "읽기 상태를 설정할 수 없음: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "책 %(id)s에 대한 책 폴더를 삭제하지 못했습니다. 경로에 하위 폴더가 있습니다: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "%(id)s 도서 삭제 실패: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "데이터베이스에서만 책 %(id)s 을(를) 삭제 중, 데이터베이스의 책 경로가 유효하지 않음: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "제목 이름을 '%(src)s'에서 '%(dest)s'(으)로 변경하지 못했습니다. 오류: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Google 드라이브에서 %(file)s 파일을 찾을 수 없습니다" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "제목 이름을 '%(src)s'에서 '%(dest)s'(으)로 변경하지 못했습니다. 오류: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Google 드라이브에서 책 경로 %(path)s을(를) 찾을 수 없습니다" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "다른 계정에서 사용하고 있는 이메일 주소입니다." -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "등록되어 있는 username입니다" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "이메일 주소 형식이 잘못되었습니다" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "규칙에 어긋나는 비밀번호입니다." -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "표지 업로드에 필요한 Python 모듈 'advocate'이 설치되지 않았습니다." -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "표지 다운로드 중 오류 발생" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "표지 형식 오류" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "표지 업로드를 위해 localhost 또는 로컬 네트워크에 액세스할 수 없습니다." -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "표지 경로 생성 실패" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "표지 파일이 유효한 이미지 파일이 아니거나 저장할 수 없습니다" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "표지는 jpg/jpeg/png/webp/bmp 파일만 지원됩니다" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "잘못된 표지 파일 콘텐츠" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "표지 파일로 jpg/jpeg 파일만 지원됩니다" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "발견" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar 바이너리 파일을 찾을 수 없습니다" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "UnRar 실행 오류" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "쓰기 권한이 없는 DB" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "실행 권한 누락" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "UnRar 실행 오류" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "메타데이터 백업을 위해 모든 도서를 대기열에 추가" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "코보(kobo) 장치에 대한 유효한 api_endpoint를 얻으려면 로컬 호스트가 아닌 곳에서 calibre-web에 액세스하십시오" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo 설정" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "%(provider)s에 등록" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "다음 사용자로 로그인했습니다: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "%(oauth)s에 성공적으로 연결됨" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "로그인 실패, OAuth 계정과 연결된 사용자 없음" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "%(oauth)s에 연결 해제 성공" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "%(oauth)s에 연결 해제 실패" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "%(oauth)s에 연결되지 않음" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "GitHub에 로그인하지 못했습니다." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "GitHub에서 사용자 정보를 가져오지 못했습니다." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "구글 로그인에 실패했습니다." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Google에서 사용자 정보를 가져오지 못했습니다." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth 오류입니다. 나중에 다시 시도하세요." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub 인증 오류: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google 인증 오류입니다. 나중에 다시 시도하세요." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google 인증 오류: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Stars" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "로그인" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "토큰을 찾을 수 없습니다" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "토큰이 만료되었습니다" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "성공! 기기로 돌아가주세요" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "책" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "최근 책 보기" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "인기있는 책" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "주목받는 책 보기" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "다운로드된 책" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "다운로드된 책 보기" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "평점이 높은 책" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "평점이 높은 책 보기" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "읽은 책" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "읽은 책과 읽지 않은 책 보기" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "읽지 않은 책" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "읽지 않은 책 보기" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "발견" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "무작위 추천" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "카테고리" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "카테고리별 보기" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "시리즈" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "시리즈별 보기" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "저자" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "저자별 보기" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "출판사" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "출판사별 보기" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "언어" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "언어별 보기" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "평점" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "평점별 보기" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "파일 유형" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "파일 유형별 보기" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "보관된 책" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "보관된 책 보기" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "책 목록" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "책 목록 보기" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "검색" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Published after " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Published before " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "평점 <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "평점 >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "읽은 상태 = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "사용자 정의 열을 검색하는 동안 오류가 발생했습니다. Calibre-Web을 다시 시작하십시오" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "상세 검색" @@ -1241,45 +1241,45 @@ msgstr "이름이 '%(title)s'인 공개 책장이 이미 있습니다." msgid "A private shelf with the name '%(title)s' already exists." msgstr "이름이 '%(title)s'인 개인 책장이 이미 있습니다." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "책장: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "책장을 여는 동안 오류가 발생했습니다. 책장이 존재하지 않거나 접근할 수 없습니다" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "작업" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "대기중" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "실패" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "시작됨" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "종료" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "종료됨" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "취소됨" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "알 수 없는 상태" @@ -1312,178 +1312,178 @@ msgstr "최신 안정 버전 %(version)s으로 업데이트하려면 아래 버 msgid "No release information available" msgstr "출시 정보가 없습니다" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "발견(무작위 도서)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "인기있는 책(가장 많이 다운로드됨)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s이(가) 다운로드한 책" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "저자: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "출판사: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "시리즈: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "평가: 없음음" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "평가: %(rating)s 별" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "파일 유형: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "카테고리: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "언어: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "다운로드" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "평점 목록" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "파일 유형 목록" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "먼저 SMTP 메일 설정을 구성하십시오..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "성공적으로 %(eReadermail)s에 보내기 예약이 되었습니다" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "책을 보내는 중에 오류 발생: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Kindle로 보내는 유효한 이메일 주소로 프로필을 업데이트하십시오." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "1분 이상 지난 후 다음 사용자를 등록하세요." #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "등록" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "이메일 서버가 구성되지 않았습니다. 관리자에게 문의하십시오!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "이메일 서버가 구성되지 않았습니다. 관리자에게 문의하십시오!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "이메일을 등록할 수 없습니다" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "확인을 위한 이메일이 발송되었습니다." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "LDAP 인증을 활성화할 수 없습니다" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "1분 이상 지난 후 로그인을 하세요." -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "다음 사용자로 로그인했습니다: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "대체 로그인: '%(nickname)s', LDAP 서버에 연결할 수 없음 또는 사용자를 알 수 없음" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "로그인 실패: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "잘못된 사용자명 또는 비밀번호" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "새 비밀번호가 이메일로 전송되었습니다" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "알 수없는 오류가 발생했습니다. 나중에 다시 시도 해주십시오." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "비밀번호를 재설정하려면 유효한 사용자 이름을 입력하십시오" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "다음 사용자로 로그인했습니다: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 프로필" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "프로필이 업데이트 됨" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "등록되어 있는 이메일 주소입니다" @@ -1491,54 +1491,58 @@ msgstr "등록되어 있는 이메일 주소입니다" msgid "Found no valid gmail.json file with OAuth information" msgstr "인증 정보가 포함된 유효한 gmail.json 파일을 찾을 수 없습니다" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s을 킨들로 보내기" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s을(를) 찾을 수 없습니다" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s 형식을 찾을 수 없습니다" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "알 수 없는 오류로 인해 전자책 변환이 실패했습니다" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 변환 실패: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "변환된 파일을 찾을 수 없거나 %(folder)s 폴더에 하나 이상의 파일이 존재합니다" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "\"전자책 변환 실패: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "오류로 인한 Calibre 실패: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "\"전자책 변환 실패: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "변환" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Calibre DB를 다시 연결합니다." -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "이메일일" @@ -1547,11 +1551,7 @@ msgstr "이메일일" msgid "Backing up Metadata" msgstr "메타데이터 편집" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "%(count)개의 표지 섬네일을 생성하였습니다." @@ -1589,7 +1589,7 @@ msgstr "사용자명" msgid "Email" msgstr "이메일 주소" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "킨들로 보내기 이메일 주소" @@ -1822,7 +1822,7 @@ msgstr "예" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "취소" @@ -1874,7 +1874,7 @@ msgstr "발행일 순으로 정렬, 오래된 순" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "reduce" @@ -1981,12 +1981,12 @@ msgid "Language" msgstr "언어" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "예" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "아니오" @@ -2147,7 +2147,7 @@ msgid "Enter " msgstr "입력 " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "정말 확신합니까?" @@ -2923,7 +2923,7 @@ msgstr "오류" msgid "Upload done, processing, please wait..." msgstr "업로드 완료, 처리 중입니다. 잠시만 기다려 주십시오..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "설정" @@ -3060,7 +3060,7 @@ msgstr "상위 폴더" msgid "Select" msgstr "선택" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3068,35 +3068,76 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web 책 목록" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "epub 리더" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "밝게" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "어둡게" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "세피아" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "뒤로" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "사이드바가 열려 있을 때 텍스트 다시 배열." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "글자 크기기" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "삭제" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "대기중" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "수직" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "읽기" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "잘못된 읽기 열" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "코믹 리더" @@ -3294,11 +3335,11 @@ msgstr "출간일(부터)" msgid "Published Date To" msgstr "출간일(까지)" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3334,11 +3375,13 @@ msgstr "평점(이상)" msgid "Rating Below" msgstr "평점(이하)" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "부터:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "까지:" @@ -3362,6 +3405,16 @@ msgstr "정렬 변경 비활성화" msgid "Enable Change order" msgstr "정렬 변경 활성화" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "책 목록 정렬, 최신순" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "책 목록 정렬, 오래된 순" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "모두와 공유" @@ -3430,15 +3483,20 @@ msgstr "Progress" msgid "Run Time" msgstr "실행 시간" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "병합" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Actions" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "이 작업을 취소합니다. 이 작업의 모든 진행사항은 반영됩니다." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "이 작업이 예약된 작업이라면, 다음 예약 시간에 다시 실행됩니다." @@ -3446,6 +3504,10 @@ msgstr "이 작업이 예약된 작업이라면, 다음 예약 시간에 다시 msgid "Reset user Password" msgstr "사용자 비밀번호 초기화" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "책 언어" diff --git a/cps/translations/nl/LC_MESSAGES/messages.mo b/cps/translations/nl/LC_MESSAGES/messages.mo index 3d17b476..0bc8e80b 100644 Binary files a/cps/translations/nl/LC_MESSAGES/messages.mo and b/cps/translations/nl/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index 92b4306f..4bef79b3 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web (GPLV3)\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2023-12-20 22:00+0100\n" "Last-Translator: Michiel Cornelissen \n" "Language: nl\n" @@ -17,450 +17,450 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistieken" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "De server is herstart, vernieuw de pagina" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Bezig met het afsluiten van de server, sluit het venster" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "Gelukt! Database opnieuw verbonden" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Onbekende opdracht" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Test E-Mail wordt verzonden naar %(email)s, controleer de taken voor het resultaat" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Onbekend" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Systeembeheer" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Basisconfiguratie" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Uiterlijk aanpassen" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Systeembeheerder" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alles" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Gebruiker niet gevonden" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} gebruikers succesvol verwijderd" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Alle talen" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Misvormd verzoek" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Gast naam kan niet worden veranderd" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Gast kan deze rol niet hebben" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Kan systeembeheerder rol niet verwijderen van de laatste systeembeheerder" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Waarde moet Waar of Onwaar zijn" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Ongeldige rol" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Gast kan dit niet bekijken" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Ongeldige waarde" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gasts locale is automatisch bepaald en kan niet handmatig worden ingesteld" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Geen geldige locale is opgegeven" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Geen geldige boek taal is opgegeven" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter is niet gevonden" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Ongeldige gelezen kolom" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Ongeldige beperkte kolom" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web-configuratie bijgewerkt" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Wil je je Kobo Token echt verwijderen?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Wil je dit domein echt verwijderen?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Wil je deze gebruiker echt verwijderen?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Weet je zeker dat je deze boekenplank wilt verwijderen?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Weet je zeker dat je de locales van de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Weet je zeker dat je de zichtbare talen voor de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Weet je zeker dat je de geselecteerde rol van de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Weet je zeker dat je de geselecteerde beperkingen voor de geselecteerde gebruikers(s) wil verwijderen?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Weet je zeker dat je de geselecteerde zichtbaarheidsbeperkingen voor de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Weet je zeker dat je de synchronisatiegedrag van boekenplanken voor de geselecteerde gebruiker(s) wil veranderen?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Weet je zeker dat je de locatie van de Calibre-bibliotheek wil veranderen?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-web gaat zoeken naar bijgewerkte omslagen en miniaturen bijwerken, dit kan even duren?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Weet u zeker dat u de volledige Calibre-Web synchronisatiedatabase wilt verwijderen om een volledige synchronisatie met uw Kobo Reader te forceren?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Weigeren" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Toestaan" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} synchronisatie objecten verwijderd" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Tag niet gevonden" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ongeldige actie" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json is niet geconfigureerd voor webapplicatie" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "De locatie van het logbestand is onjuist, voer een geldige locatie in" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "De locatie vam het toegangslog is onjuist, voer een geldige locatie in" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Voer alsjeblieft een LDAP Provider, Port, DN en User Object Identifier in" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Voer een geldig LDAP Service Account en wachtwoord in" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Voer een LDAP Service Account in" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP Groep Object Filter Moet Een \"%s\" Formaat Identificiatie hebben" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP Groep Object Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Gebruiker Object Filter moet \"%s\" Formaat Identificatie hebben" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP Gebruiker Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP Lid Gebruiker Filter moet een \"%s\" Formaat Identificatie hebben" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP Lid Gebruiker Filter heeft een niet-gebalanceerd haakje" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CACertficaat, Certificaat of Sleutel Locatie is ongeldig. Voer alsjeblieft een geldig pad in." -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Gebruiker toevoegen" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "SMTP-instellingen bewerken" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Gelukt! Gmail account geverifieerd." -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Database fout: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test E-Mail wordt verzonden naar %(email)s, controleer de taken voor het resultaat" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Fout opgetreden bij het versturen van de test-e-mail: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Gelieve eerst je e-mail adres configureren..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "E-mailserver-instellingen bijgewerkt" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Bewerk instellingen van geplande taken" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "De starttijd van de taak is ongeldig" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "De duur van de taak is ongeldig" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Instellingen van geplande taken bijgewerkt" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Instellingen database is niet schrijfbaar." -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Gebruiker '%(nick)s' bewerken" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Wachtwoord voor gebruiker %(user)s is hersteld" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Stel eerst SMTP-mail in..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Logbestand lezer" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Update opvragen" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Update downloaden" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Update uitpakken" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Update toepassen" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Databaseverbindingen zijn gesloten" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Bezig met stoppen van Calibre-Web" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Update voltooid, klik op 'Oké' en vernieuw de pagina" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Update mislukt:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-fout" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Verbindingsfout" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Time-out tijdens maken van verbinding" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Algemene fout" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Geüpload bestand kon niet opgeslagen worden in de tijdelijke map" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Bestanden kunnen niet vervangen worden tijdens een update" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Mislukt om minstens een LDAP gebruiker aan te maken" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Het is niet gelukt tenminste een LDAP gebruiker aan te maken" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fout: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Fout: No user returned in response of LDAP server" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Minstens een LDAP Gebruiker is niet gevonden in de Database" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Gebruiker succesvol geïmporteerd" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Database niet gevonden, voer de juiste locatie in" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Kan niet schrijven naar database" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "SSL-sleutellocatie is niet geldig, voer een geldig pad in" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "SSL-certificaatlocatie is niet geldig, voer een geldig pad in" @@ -478,7 +478,7 @@ msgstr "E-mailserver-instellingen bijgewerkt" msgid "Database Configuration" msgstr "Databaseconfiguratie" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Vul alle velden in!" @@ -513,7 +513,7 @@ msgstr "Kan Gast gebruiker niet verwijderen" msgid "No admin user remaining, can't delete user" msgstr "Kan laatste systeembeheerder niet verwijderen" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "E-mail kan niet leeg zijn en moet geldig zijn" @@ -530,128 +530,128 @@ msgstr "niet geïnstalleerd" msgid "Execution permissions missing" msgstr "Kan programma niet uitvoeren" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Aangepaste kolom Nr.%(column)d bestaat niet in de Calibre Database" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Geen" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oeps! Geselecteerd boek is niet beschikbaar. Bestand bestaat niet of is niet toegankelijk" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Gebruiker mist rechten om de omslag te uploaden" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identificatoren zijn niet hoofdlettergevoelig, overschrijf huidige identificatoren" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "De metagegevens zijn bijgewerkt" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Fout tijdens bijwerken van boek: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Bestand %(file)s geüpload" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Bron- of doelformaat ontbreekt voor conversie" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Het boek is in de wachtrij geplaatst voor conversie naar %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Er is een fout opgetreden bij het converteren van dit boek: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Geüpload boek staat mogelijk al in de bibliotheek, controleer alvorens door te gaan: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s is geen geldige taal" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "De bestandsextensie '%(ext)s' is niet toegestaan op deze server" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "De bestandsextensie '%(ext)s' is niet toegestaan op deze server" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Het te uploaden bestand moet voorzien zijn van een extensie" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Bestand %(filename)s kon niet opgeslagen worden in de tijdelijke map" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Omslag %(file)s niet verplaatst: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Het boekformaat is verwijderd" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Het boek is verwijderd" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "U mist rechten om boeken te verwijderen" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "metagegevens bewerken" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s is geen geldig nummer, sla het over" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Gebruiker mist rechten om extra bestandsformaten te uploaden" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Kan de locatie '%(path)s' niet aanmaken (niet gemachtigd)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Kan %(file)s niet opslaan." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" @@ -664,487 +664,487 @@ msgstr "Het instellen van Google Drive is niet afgerond, heractiveer Google Driv msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Het callback-domein is niet geverifieerd. Volg de stappen in de Google-ontwikkelaarsconsole om het domein te verifiëren" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formaat niet gevonden voor boek met id: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s niet aangetroffen op Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s niet gevonden %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Versturen naar Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Deze e-mail is verstuurd via Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web - test-e-mail" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Test-e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Aan de slag met Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Registratie-e-mailadres van gebruiker: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "%(orig)s converteren naar %(format)s en versturen naar Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "%(format)s versturen naar Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s verzonden naar Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Het opgevraagde bestand kan niet worden gelezen. Ben je hiertoe gemachtigd?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Gelezen/ongelezen status kan niet aangepast worden: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Het verwijderen van de boekenmap voor boek %(id)s is mislukt, het pad heeft submappen: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Verwijderen van boek %(id)s mislukt: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Verwijder boek %(id)s alleen uit database, boek pad is ongeldig: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Kan de titel '%(src)s' niet wijzigen in '%(dest)s': %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Bestand '%(file)s' niet aangetroffen op Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Kan de titel '%(src)s' niet wijzigen in '%(dest)s': %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Boeken locatie '%(path)s' niet aangetroffen op Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "Bestaand account gevondne met dit e-mailadres" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Deze gebruikersnaam is al in gebruik" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Ongeldig E-Mail adres" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "Het wachtwoord voldoet niet aan de validatieregels" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Pythonmodule 'advocate' is niet geïnstalleerd maar is nodig omslag uploads" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Fout bij downloaden omslag" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Onjuist omslagformaat" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Toegang tot localhost of het lokale netwerk niet toegestaant voor omslag uploaden" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Locatie aanmaken voor omslag mislukt" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Omslag-bestand is geen afbeelding of kon niet opgeslagen worden" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Alleen jpg/jpeg/png/webp/bmp bestanden worden ondersteund als omslag" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Ongeldig omslagbestand" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Alleen jpg/jpeg bestanden zijn toegestaan als omslag" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Willekeurige boeken" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar executable niet gevonden" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Fout bij het uitvoeren van UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Kan niet schrijven naar database" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Kan programma niet uitvoeren" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Fout bij het uitvoeren van UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Voeg alle boeken toe aan de wachtrij voor het maken van een metagegevens backup" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Je kunt Calibre-Web niet vanaf de lokale computer openen om een geldige api_endpoint te krijgen voor je kobo toestel" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo Instellen" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Aanmelden bij %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "je bent ingelogd als: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Koppeling gemaakt met %(oauth)s" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Inloggen mislukt, geen gebruiker gekoppeld aan OAuth account" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Koppeling met %(oauth)s verbroken" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Ontkoppelen van %(oauth)s mislukt" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Niet gelinkt aan %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Inloggen bij GitHub mislukt." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Opvragen gebruikersinfo bij GitHub mislukt." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Inloggen bij Google mislukt." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Opvragen gebruikersinfo bij Google mislukt." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub OAuth fout, probeer het later nog eens." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Github OAuth foutmelding: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google OAuth fout, probeer het later nog eens." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google OAuth foutmelding: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} sterren" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Inloggen" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Toegangssleutel niet gevonden" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Toegangssleutel is verlopen" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Gelukt! Ga terug naar je apparaat" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Boeken" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Recent toegevoegde boeken tonen" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Populaire boeken" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Populaire boeken tonen" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Gedownloade boeken" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Gedownloade boeken tonen" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Best beoordeelde boeken" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Best beoordeelde boeken tonen" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Gelezen boeken" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Gelezen/Ongelezen boeken tonen" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Ongelezen boeken" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Ongelezen boeken tonen" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Willekeurige boeken" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Willekeurige boeken tonen" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorieën" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Categoriekeuze tonen" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Boekenreeksen" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Boekenreeksenkeuze tonen" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Auteurs" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Auteurkeuze tonen" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Uitgevers" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Uitgeverskeuze tonen" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Talen" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Taalkeuze tonen" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Beoordelingen" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Beoordelingen tonen" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Bestandsformaten" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Bestandsformaten tonen" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Gearchiveerde boeken" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Gearchiveerde boeken tonen" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Boekenlijst" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Boekenlijst tonen" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Zoeken" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Gepubliceerd na " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Gepubliceerd vóór " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Beoordeling <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Beoordeling >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Lees Status = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Fout tijdens het zoeken van aangepaste kolommen, start Calibre-Web opnieuw op" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Geavanceerd zoeken" @@ -1255,45 +1255,45 @@ msgstr "Een openbare boekenplank met de naam '%(title)s' bestaat al." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Een persoonlijke boekenplank met de naam '%(title)s' bestaat al." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kan boekenplank niet openen: de boekenplank bestaat niet of is ontoegankelijk" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Taken" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Wachten" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Mislukt" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Gestart" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Voltooid" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Beëindigd" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Geannuleerd" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Onbekende status" @@ -1326,178 +1326,178 @@ msgstr "Er is een update beschikbaar. Klik op de knop hieronder om te updaten na msgid "No release information available" msgstr "Geen update-informatie beschikbaar" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Verkennen (willekeurige boeken)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Populaire boeken (meest gedownload)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Gedownloade boeken door %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Auteur: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Uitgever: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Reeks: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Beoordeling: geen" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Beoordeling: %(rating)s sterren" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Bestandsformaat: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Beoordelingen" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Alle bestandsformaten" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Stel eerst SMTP-mail in..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Het boek is in de wachtrij geplaatst om te worden verstuurd aan %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Fout opgetreden bij het versturen van dit boek: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Stel je kindle-e-mailadres in..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "Wacht alstublieft één minuut voor het registreren van de volgende gebruiker" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registreren" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-mailserver is niet geconfigureerd, neem contact op met de beheerder!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Dit e-mailadres mag niet worden gebruikt voor registratie" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Er is een bevestigings-e-mail verstuurd naar je e-mailadres." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Kan de LDAP authenticatie niet activeren" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "Wacht alstublieft één minuut voor de volgende inlogpoging" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Terugvallen op login: '%(nickname)s', LDAP Server is onbereikbaar, of de gebruiker is onbekend" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Inloggen mislukt: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Verkeerde gebruikersnaam of wachtwoord" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Een nieuw wachtwoord is verzonden naar je e-mailadres" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Onbekende fout opgetreden. Probeer het later nog eens." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Geef een geldige gebruikersnaam op om je wachtwoord te herstellen" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "je bent ingelogd als: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)ss profiel" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profiel bijgewerkt" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Bestaand account met dit e-mailadres aangetroffen." @@ -1506,54 +1506,58 @@ msgstr "Bestaand account met dit e-mailadres aangetroffen." msgid "Found no valid gmail.json file with OAuth information" msgstr "Geen geldig gmail.json bestand gevonden met OAuth informatie" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s verzonden naar Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s niet gevonden" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s formaat is niet gevonden op de schijf" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "E-Book converter mislukt met een onbekende foutmelding" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converteerder mislukt: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Omgezette bestand is niet gevonden of meer dan een bestand in map %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "E-boek-conversie mislukt: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre mislukt met foutmelding: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "E-boek-conversie mislukt: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Overzetten" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Opnieuw verbinding aan het maken met Calibre database" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-mail" @@ -1562,11 +1566,7 @@ msgstr "E-mail" msgid "Backing up Metadata" msgstr "metagegevens bewerken" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "%{count}s omslagminiaturen gegenereerd" @@ -1604,7 +1604,7 @@ msgstr "Gebruikersnaam" msgid "Email" msgstr "E-mailadres" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle-e-mailadres" @@ -1838,7 +1838,7 @@ msgstr "Oké" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Annuleren" @@ -1890,7 +1890,7 @@ msgstr "Sorteren op publicatiedatum, oudste boeken eerst" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "beperken" @@ -1997,12 +1997,12 @@ msgid "Language" msgstr "Taal" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ja" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nee" @@ -2166,7 +2166,7 @@ msgid "Enter " msgstr "Identificatoren" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Weet je het zeker?" @@ -2946,7 +2946,7 @@ msgstr "Fout" msgid "Upload done, processing, please wait..." msgstr "Uploaden voltooid, bezig met verwerken..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Instellingen" @@ -3083,7 +3083,7 @@ msgstr "Bovenliggende map" msgid "Select" msgstr "Selecteer" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Oké" @@ -3092,36 +3092,77 @@ msgstr "Oké" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web - e-boekcatalogus" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF lezer" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Licht" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Donker" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sepia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Annuleren" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Tekstindeling automatisch aanpassen als het zijpaneel geopend is." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "Lettertypegrootte" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Verwijderen" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Wachten" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Verticaal" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Gelezen" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Ongeldige gelezen kolom" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3323,11 +3364,11 @@ msgstr "Publicatiedatum van" msgid "Published Date To" msgstr "Publicatiedatum tot" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3364,11 +3405,13 @@ msgstr "Met beoordeling hoger dan" msgid "Rating Below" msgstr "Met beoordeling lager dan" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Van:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Tot:" @@ -3392,6 +3435,16 @@ msgstr "Schakel verandering van de volgorde uit" msgid "Enable Change order" msgstr "Schakel verandering van de volgorde in" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Sorteren op datum, nieuwste boeken eerst" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Sorteren op datum, oudste boeken eerst" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Delen met iedereen" @@ -3460,15 +3513,20 @@ msgstr "Voortgang" msgid "Run Time" msgstr "Looptijd" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Samenvoegen" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Acties" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Deze taak wordt geannuleerd. De voortgang van deze taak wordt opgeslagen." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Als dit een geplande taak is wordt deze opnieuw uitgevoerd tijdens de volgende geplande tijd." @@ -3476,6 +3534,10 @@ msgstr "Als dit een geplande taak is wordt deze opnieuw uitgevoerd tijdens de vo msgid "Reset user Password" msgstr "Gebruikerswachtwoord herstellen" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Taal van boeken" diff --git a/cps/translations/no/LC_MESSAGES/messages.mo b/cps/translations/no/LC_MESSAGES/messages.mo index 8e71b408..db84e5df 100644 Binary files a/cps/translations/no/LC_MESSAGES/messages.mo and b/cps/translations/no/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/no/LC_MESSAGES/messages.po b/cps/translations/no/LC_MESSAGES/messages.po index 4007f022..f327bc23 100644 --- a/cps/translations/no/LC_MESSAGES/messages.po +++ b/cps/translations/no/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2023-01-06 11:00+0000\n" "Last-Translator: Vegard Fladby \n" "Language: no\n" @@ -16,446 +16,446 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistikk" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Server startet på nytt. Last inn siden på nytt" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Utfører avslutning av server, vennligst lukk vinduet" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Ukjent kommando" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Test e-post i kø for sending til %(email)s, sjekk Oppgaver for resultat" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Ukjent" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Admin side" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Grunnleggende konfigurasjon" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "UI-konfigurasjon" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Rediger brukere" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alle" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Bruker ikke funnet" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} brukere ble slettet" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Vis alt" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Feil utformet forespørsel" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Gjestenavn kan ikke endres" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Gjesten kan ikke ha denne rollen" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Ingen administratorbruker igjen, kan ikke fjerne administratorrollen" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Verdien må være sann eller usann" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Ugyldig rolle" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Gjestene kan ikke ha denne utsikten" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Ugyldig visning" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gjestenes lokalitet bestemmes automatisk og kan ikke angis" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Ingen gyldig lokalitet gitt" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Ikke oppgitt gyldig bokspråk" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter ikke funnet" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Ugyldig lesekolonne" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Ugyldig begrenset kolonne" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web-konfigurasjonen er oppdatert" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Vil du virkelig slette Kobo-tokenet?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Vil du virkelig slette dette domenet?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Vil du virkelig slette denne brukeren?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Er du sikker på at du vil slette denne hyllen?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Er du sikker på at du vil endre lokaliteter for valgte bruker(e)?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Er du sikker på at du vil endre synlige bokspråk for valgte bruker(e)?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Er du sikker på at du vil endre den valgte rollen for den(e) valgte brukeren?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Er du sikker på at du vil endre de valgte begrensningene for den(e) valgte brukeren?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Er du sikker på at du vil endre de valgte synlighetsbegrensningene for valgte bruker(e)?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Er du sikker på at du vil endre atferden for hyllesynkronisering for de(n) valgte brukeren(e)?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Er du sikker på at du vil endre plassering av Caliber-biblioteket?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web vil søke etter oppdaterte omslag og oppdatere omslagsminiatyrbilder, kan dette ta litt tid?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Er du sikker på at du vil slette Calibre-Webs synkroniseringsdatabase for å tvinge frem en full synkronisering med Kobo Reader?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Benekte" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Tillate" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} synkroniseringsoppføringer slettet" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Merket ble ikke funnet" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ugyldig handling" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json er ikke konfigurert for webapplikasjon" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Loggfilplasseringen er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Plasseringen av tilgangsloggfilen er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Angi en LDAP-leverandør, port, DN og brukerobjektidentifikator" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Vennligst skriv inn en LDAP-tjenestekonto og passord" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Angi en LDAP-tjenestekonto" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP-gruppeobjektfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP-gruppeobjektfilter har uovertruffen parentes" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-brukerobjektfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP-brukerobjektfilter har uovertruffen parentes" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-medlemsbrukerfilter må ha én \"%s\"-formatidentifikator" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP-medlemsbrukerfilter har uovertruffen parentes" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-sertifikat, sertifikat eller nøkkelplassering er ikke gyldig. Angi riktig bane" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Legg til ny bruker" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 #, fuzzy msgid "Edit Email Server Settings" msgstr "Rediger e-postserverinnstillinger" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, fuzzy, python-format msgid "Oops! Database Error: %(error)s." msgstr "Databasefeil: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Test e-post i kø for sending til %(email)s, sjekk Oppgaver for resultat" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Det oppsto en feil ved sending av test-e-posten: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Vennligst konfigurer e-postadressen din først..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 #, fuzzy msgid "Email Server Settings updated" msgstr "E-postserverinnstillinger oppdatert" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Rediger innstillinger for planlagte oppgaver" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Ugyldig starttidspunkt for spesifisert oppgave" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Ugyldig varighet for spesifisert oppgave" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Innstillinger for planlagte oppgaver er oppdatert" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 #, fuzzy msgid "Oops! An unknown error occurred. Please try again later." msgstr "En ukjent feil oppstod. Prøv igjen senere." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Innstillinger DB er ikke skrivbar" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Rediger bruker %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Passord for bruker %(user)s tilbakestilling" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Vennligst konfigurer SMTP-postinnstillingene først..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Loggfilviser" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Ber om oppdateringspakke" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Laster ned oppdateringspakken" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Pakker ut oppdateringspakken" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Erstatter filer" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Databaseforbindelser er stengt" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Stopper server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Oppdatering fullført, vennligst trykk OK og last inn siden på nytt" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Oppdatering mislyktes:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-feil" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Tilkoblingsfeil" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tidsavbrudd under etablering av tilkobling" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Generell feil" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Oppdateringsfilen kunne ikke lagres i temp dir" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Filer kunne ikke erstattes under oppdatering" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Kunne ikke pakke ut minst én LDAP-bruker" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Kunne ikke opprette minst én LDAP-bruker" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Feil: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Feil: Ingen bruker ble returnert som svar fra LDAP-serveren" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Minst én LDAP-bruker ikke funnet i databasen" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Bruker ble importert" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB-plassering er ikke gyldig, skriv inn riktig bane" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "DB er ikke skrivbar" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Nøkkelfilplasseringen er ikke gyldig. Angi riktig bane" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Sertifikatfilplasseringen er ikke gyldig, vennligst skriv inn riktig bane" @@ -471,7 +471,7 @@ msgstr "Databaseinnstillinger oppdatert" msgid "Database Configuration" msgstr "Databasekonfigurasjon" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 #, fuzzy msgid "Oops! Please complete all fields." msgstr "Vennligst fyll ut alle feltene!" @@ -507,7 +507,7 @@ msgstr "Kan ikke slette gjestebruker" msgid "No admin user remaining, can't delete user" msgstr "Ingen administratorbruker igjen, kan ikke slette bruker" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 #, fuzzy msgid "Email can't be empty and has to be a valid Email" msgstr "E-postadresse kan ikke være tom og må være en gyldig e-post" @@ -525,129 +525,129 @@ msgstr "ikke installert" msgid "Execution permissions missing" msgstr "Utførelsestillatelser mangler" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Egendefinert kolonnenr.%(column)d finnes ikke i caliber-databasen" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ingen" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 #, fuzzy msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oops! Den valgte boktittelen er utilgjengelig. Filen eksisterer ikke eller er ikke tilgjengelig" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Brukeren har ingen rettigheter til å laste opp cover" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifikatorer skiller ikke mellom store og små bokstaver, overskriver gammel identifikator" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata ble oppdatert" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Feil ved redigering av bok: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Fil %(file)s lastet opp" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Kilde- eller målformat for konvertering mangler" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Boken ble satt i kø for konvertering til %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Det oppsto en feil ved konvertering av denne boken: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Opplastet bok finnes sannsynligvis i biblioteket, vurder å endre før du laster opp ny: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' er ikke et gyldig språk" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Filtypen «%(ext)s» er ikke tillatt å lastes opp til denne serveren" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Filtypen «%(ext)s» er ikke tillatt å lastes opp til denne serveren" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Filen som skal lastes opp må ha en utvidelse" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Filen %(filename)s kunne ikke lagres i midlertidig dir" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Kunne ikke flytte omslagsfil %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Bokformatet er slettet" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Boken ble slettet" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Du mangler tillatelser til å slette bøker" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "redigere metadata" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s er ikke et gyldig tall, hopper over" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Brukeren har ingen rettigheter til å laste opp flere filformater" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Kunne ikke opprette banen %(path)s (Tillatelse nektet)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Kunne ikke lagre filen %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Filformat %(ext)s lagt til %(book)s" @@ -660,485 +660,485 @@ msgstr "Google Disk-konfigurasjonen er ikke fullført. Prøv å deaktivere og ak msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Tilbakeringingsdomene er ikke bekreftet. Følg fremgangsmåten for å bekrefte domenet i Googles utviklerkonsoll" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s format ikke funnet for bok-ID: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s ikke funnet på Google Disk: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s ikke funnet: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Send til E-Reader" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Denne e-posten er sendt via Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web test e-post" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Test e-post" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Kom i gang med Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Registrerings-e-post for bruker: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Konverter %(orig)s til %(format)s og send til E-Reader" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Send %(format)s til E-Reader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s sendes til E-Reader" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Den forespurte filen kunne ikke leses. Kanskje feil tillatelser?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Lesestatus kunne ikke angis: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Sletting av bokmappe for bok %(id)s mislyktes, banen har undermapper: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Sletting av bok %(id)s mislyktes: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Sletter bok %(id)s kun fra databasen, bokbanen i databasen er ikke gyldig: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Endre navn på forfatter fra: '%(src)s' til '%(dest)s' mislyktes med feil: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Fil %(file)s ikke funnet på Google Disk" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Endre navn på tittel fra: '%(src)s' til '%(dest)s' mislyktes med feil: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Finner ikke bokbane %(path)s på Google Disk" -#: cps/helper.py:682 +#: cps/helper.py:660 #, fuzzy msgid "Found an existing account for this Email address" msgstr "Fant en eksisterende konto for denne e-postadressen" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Dette brukernavnet er allerede tatt" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Ugyldig format for e-postadresse" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Python-modulen 'advocate' er ikke installert, men er nødvendig for omslagsopplastinger" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Feil ved nedlasting av cover" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Omslagsformatfeil" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Du har ikke tilgang til localhost eller det lokale nettverket for coveropplastinger" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Kunne ikke opprette bane for dekning" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Cover-filen er ikke en gyldig bildefil, eller kunne ikke lagres" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Bare jpg/jpeg/png/webp/bmp-filer støttes som coverfile" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Ugyldig omslagsfilinnhold" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Bare jpg/jpeg-filer støttes som coverfile" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "Dekke" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar binær fil ikke funnet" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Feil ved kjøring av UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "DB er ikke skrivbar" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Utførelsestillatelser mangler" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Feil ved kjøring av UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Sett alle bøker i kø for sikkerhetskopiering av metadata" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Gå til Calibre-Web fra ikke-lokale vert for å få gyldig api_endpoint for kobo-enhet" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo oppsett" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registrer deg hos %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, fuzzy, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "du er nå logget på som: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Link til %(oauth)s lyktes" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Pålogging mislyktes, ingen bruker koblet til OAuth-konto" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Fjern koblingen til %(oauth)s" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Fjern koblingen til %(oauth)s mislyktes" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Ikke koblet til %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Kunne ikke logge på med GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Kunne ikke hente brukerinformasjon fra GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Kunne ikke logge på med Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Kunne ikke hente brukerinformasjon fra Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth-feil, prøv igjen senere." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub Oauth-feil: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth-feil, prøv igjen senere." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth-feil: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Stjerner" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Logg Inn" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token ikke funnet" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token har utløpt" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Suksess! Gå tilbake til enheten din" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Bøker" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Vis nyere bøker" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Hot bøker" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Vis populære bøker" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Nedlastede bøker" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Vis nedlastede bøker" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Topprangerte bøker" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Vis best rangerte bøker" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Lese bøker" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Vis lest og ulest" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Uleste bøker" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Vis ulest" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Oppdage" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Vis tilfeldige bøker" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategorier" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Vis kategorivalg" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Serie" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Vis serieutvalg" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Forfattere" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Vis forfattervalg" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Forlag" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Vis utgivervalg" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Språk" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Vis språkvalg" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Vurderinger" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Vis vurderingsvalg" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Filformater" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Vis valg av filformater" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Arkiverte bøker" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Vis arkiverte bøker" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Bøker Liste" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Vis bokliste" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Søk" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publisert etter " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publisert før " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Vurdering <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Vurdering >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Lesestatus = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Feil ved søk etter egendefinerte kolonner. Start Calibre-Web på nytt" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Avansert søk" @@ -1246,45 +1246,45 @@ msgstr "En offentlig hylle med navnet '%(title)s' eksisterer allerede." msgid "A private shelf with the name '%(title)s' already exists." msgstr "En privat hylle med navnet '%(title)s' eksisterer allerede." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylle: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Feil ved åpning av hylle. Hylle finnes ikke eller er ikke tilgjengelig" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Oppgaver" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Venter" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Mislyktes" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Startet" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Ferdig" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Endte" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "avbrutt" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Ukjent status" @@ -1317,180 +1317,180 @@ msgstr "En ny oppdatering er tilgjengelig. Klikk på knappen nedenfor for å opp msgid "No release information available" msgstr "Ingen utgivelsesinformasjon tilgjengelig" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Discover (tilfeldige bøker)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Hot Books (mest nedlastede)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Lastet ned bøker av %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Forfatter: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Utgiver: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Vurdering: Ingen" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Rangering: %(rating)s stjerner" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Nedlastinger" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Rangeringsliste" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Liste over filformater" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Vennligst konfigurer SMTP-postinnstillingene først..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, fuzzy, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Boken ble satt i kø for sending til %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, fuzzy, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Oops! Det oppsto en feil ved sending av denne boken: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Vennligst oppdater profilen din med en gyldig Send til Kindle-e-postadresse." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrere" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "E-postserveren er ikke konfigurert, kontakt administratoren din!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 #, fuzzy msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-postserveren er ikke konfigurert, kontakt administratoren din!" -#: cps/web.py:1319 +#: cps/web.py:1321 #, fuzzy msgid "Oops! Your Email is not allowed." msgstr "Din e-post kan ikke registreres" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Kan ikke aktivere LDAP-autentisering" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "du er nå logget på som: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Reservepålogging som: '%(nickname)s', LDAP-serveren er ikke tilgjengelig, eller brukeren er ukjent" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Kunne ikke logge på: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Vennligst skriv inn gyldig brukernavn for å tilbakestille passordet" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nytt passord ble sendt til e-postadressen din" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "En ukjent feil oppstod. Prøv igjen senere." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Vennligst skriv inn gyldig brukernavn for å tilbakestille passordet" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "du er nå logget på som: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, fuzzy, python-format msgid "%(name)s's Profile" msgstr "%(name)s sin profil" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profil oppdatert" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1498,54 +1498,58 @@ msgstr "" msgid "Found no valid gmail.json file with OAuth information" msgstr "Fant ingen gyldig gmail.json-fil med OAuth-informasjon" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s sendes til E-Reader" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Caliber ebook-convert %(tool)s ble ikke funnet" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s format ikke funnet på disken" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Ebook-konvertering mislyktes med ukjent feil" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-konvertering mislyktes: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konvertert fil ikke funnet eller mer enn én fil i mappen %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook-konvertering mislyktes: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Caliber mislyktes med feil: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-konvertering mislyktes: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Konvertere" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Kobler til Caliber-databasen på nytt" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-post" @@ -1553,11 +1557,7 @@ msgstr "E-post" msgid "Backing up Metadata" msgstr "Sikkerhetskopierer metadata" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Genererte %(count)s forsideminiatyrbilder" @@ -1596,7 +1596,7 @@ msgstr "Brukernavn" msgid "Email" msgstr "E-post" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Send til E-Reader E-postadresse" @@ -1835,7 +1835,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Avbryt" @@ -1887,7 +1887,7 @@ msgstr "Sorter etter publiseringsdato, eldste først" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "redusere" @@ -1994,12 +1994,12 @@ msgid "Language" msgstr "Språk" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ja" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nei" @@ -2160,7 +2160,7 @@ msgid "Enter " msgstr "Tast inn " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Er du virkelig sikker?" @@ -2954,7 +2954,7 @@ msgstr "Serverport" msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 #, fuzzy msgid "Settings" @@ -3099,7 +3099,7 @@ msgstr "" msgid "Select" msgstr "Slett" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3107,35 +3107,76 @@ msgstr "" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 #, fuzzy msgid "Light" msgstr "Nattlig" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Slett" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Venter" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "E-post" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "redusere" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Ugyldig lesekolonne" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "" @@ -3344,11 +3385,11 @@ msgstr "Publisert etter " msgid "Published Date To" msgstr "Publisert etter " -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3386,11 +3427,13 @@ msgstr "Vurdering: Ingen" msgid "Rating Below" msgstr "" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3414,6 +3457,16 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Sorter etter bokdato, nyeste først" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Sorter etter bokdato, eldste først" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "" @@ -3488,16 +3541,21 @@ msgstr "" msgid "Run Time" msgstr "" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Slå sammen" + +#: cps/templates/tasks.html:21 #, fuzzy msgid "Actions" msgstr "Vurderinger" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3505,6 +3563,10 @@ msgstr "" msgid "Reset user Password" msgstr "" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 #, fuzzy msgid "Language of Books" diff --git a/cps/translations/pl/LC_MESSAGES/messages.mo b/cps/translations/pl/LC_MESSAGES/messages.mo index cd4d30c9..75d12f5f 100644 Binary files a/cps/translations/pl/LC_MESSAGES/messages.mo and b/cps/translations/pl/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 3ddab9b2..bdea8d52 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2021-06-12 08:52)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2021-06-12 15:35+0200\n" "Last-Translator: Radosław Kierznowski \n" "Language: pl\n" @@ -17,452 +17,452 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statystyki" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Nieznane polecenie" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Testowy e-mail czeka w kolejce do wysłania do %(email)s, sprawdź zadania, aby uzyskać wynik" # ??? -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Nieznany" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Panel administratora" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Konfiguracja podstawowa" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Konfiguracja Interfejsu" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Edytuj użytkowników" # ??? -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Wszystko" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Nie znaleziono użytkownika" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} użytkowników usuniętych pomyślnie" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Pokaż wszystkie" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Nieprawidłowo sformułowane żądanie" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Nazwa gościa nie może być zmieniona" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Gość nie może pełnić tej roli" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Nie można odebrać praw administratora. Brak na serwerze innego konta z prawami administratora" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Wartość musi być prawdziwa lub fałszywa" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Nieprawidłowa rola" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Gość nie może tego zobaczyć" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Nieprawidłowy widok" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Lokalizacja gościa jest określana automatycznie i nie można jej ustawić" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Nie podano prawidłowej lokalizacji" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Nie podano obowiązującego języka książki" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Nie znaleziono parametru" -#: cps/admin.py:572 +#: cps/admin.py:573 #, fuzzy msgid "Invalid Read Column" msgstr "Nieprawidłowa kolumna odczytu" -#: cps/admin.py:578 +#: cps/admin.py:579 #, fuzzy msgid "Invalid Restricted Column" msgstr "Nieprawidłowa kolumna z ograniczeniami" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Konfiguracja Calibre-Web została zaktualizowana" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Czy na pewno chcesz usunąć Token Kobo?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Czy naprawdę chcesz usunąć tę domenę?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Czy naprawdę chcesz usunąć tego użytkownika?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Czy na pewno chcesz usunąć półkę?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Czy na pewno chcesz zmienić ustawienia lokalne wybranego użytkownika(ów)?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Czy na pewno chcesz zmienić widoczne języki książek dla wybranego użytkownika (użytkowników)?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybraną rolę dla wybranego użytkownika (użytkowników)?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybrane ograniczenia dla wybranego użytkownika(ów)?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić wybrane ograniczenia widoczności dla wybranego użytkownika(ów)?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Czy na pewno chcesz zmienić zachowanie synchronizacji półek dla wybranego użytkownika(ów)?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Czy na pewno chcesz zmienić lokalizację biblioteki Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Zabroń" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Zezwalaj" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 #, fuzzy msgid "Tag not found" msgstr "Nie znaleziono znacznika" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Nieprawidłowe działanie" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json nie został skonfigurowany dla aplikacji webowej" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku dziennika jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku dziennika dostępu jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Wprowadź dostawcę LDAP, port, nazwę wyróżniającą i identyfikator obiektu użytkownika" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Proszę wprowadzić konto i hasło usługi LDAP" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Proszę wprowadzić konto usługi LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filtr obiektów grupy LDAP musi mieć jeden identyfikator formatu \"% s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtr obiektów grupy LDAP ma niedopasowany nawias" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr obiektów użytkownika LDAP musi mieć jeden identyfikator formatu \"% s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtr obiektów użytkownika LDAP ma niedopasowany nawias" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filtr użytkownika członka LDAP musi mieć jedno \"%s\" identyfikator formatu" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtr użytkownika członka LDAP ma niedopasowane nawiasy" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Główny urząd certyfikatu LDAP, Certyfikat lub Lokalizacja Klucza nie jest prawidłowa, Proszę wprowadzić poprawną ścieżkę" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Dodaj nowego użytkownika" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Zmień ustawienia SMTP" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Błąd bazy danych: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, fuzzy, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testowy e-mail czeka w kolejce do wysłania do %(email)s, sprawdź zadania, aby uzyskać wynik" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Wystąpił błąd podczas wysyłania e-maila testowego: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Najpierw skonfiguruj swój adres e-mail..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Zaktualizowano ustawienia serwera poczty e-mail" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" # ??? -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Zrestartowano hasło użytkownika %(user)s" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Przeglądanie dziennika" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" # ??? -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Zastępowanie plików" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Zatrzymywanie serwera" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Aktualizacja nieudana:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Błąd HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Błąd połączenia" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Przekroczono limit czasu podczas nawiązywania połączenia" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Błąd ogólny" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Plik aktualizacji nie mógł zostać zapisany w katalogu tymczasowym" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Błąd przy tworzeniu przynajmniej jednego użytkownika LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Błąd przy tworzeniu przynajmniej jednego użytkownika LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Błąd: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Błąd. LDAP nie zwrócił żadnego użytkownika" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Przynajmniej jeden użytkownik LDAP nie został znaleziony w bazie danych" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Użytkownik pomyślnie zaimportowany" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja bazy danych jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Baza danych nie jest zapisywalna" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku klucza jest nieprawidłowa, wprowadź poprawną ścieżkę" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Lokalizacja pliku certyfikatu jest nieprawidłowa, wprowadź poprawną ścieżkę" @@ -479,7 +479,7 @@ msgstr "Zaktualizowano ustawienia serwera poczty e-mail" msgid "Database Configuration" msgstr "Konfiguracja bazy danych" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Proszę wypełnić wszystkie pola!" @@ -514,7 +514,7 @@ msgstr "Nie można usunąć użytkownika gościa" msgid "No admin user remaining, can't delete user" msgstr "Nie można usunąć użytkownika. Brak na serwerze innego konta z prawami administratora" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -531,128 +531,128 @@ msgstr "nie zainstalowane" msgid "Execution permissions missing" msgstr "Brak uprawnienia do wykonywania pliku" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Niestandardowa kolumna No.%(column)d nie istnieje w bazie calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Brak" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub jest niedostępny" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "W identyfikatorach nie jest rozróżniana wielkość liter, nadpisywanie starego identyfikatora" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadane zostały pomyślnie zaktualizowane" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Wysłano plik %(file)s" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Brak formatu źródłowego lub docelowego do konwersji" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Książka została pomyślnie umieszczona w zadaniach do konwersji %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Podczas konwersji książki wystąpił błąd: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Wysłana książka prawdopodobnie istnieje w bibliotece, rozważ zmianę przed przesłaniem nowej: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s nie jest prawidłowym językiem" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do wysłania na ten serwer" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do wysłania na ten serwer" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Plik do wysłania musi mieć rozszerzenie" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Nie można zapisać pliku %(filename)s w katalogu tymczasowym" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Nie udało się przenieść pliku okładki %(file)s:%(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Plik książki w wybranym formacie został usunięty" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Książka została usunięta" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "edytuj metadane" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s nie jest poprawną liczbą, pomijanie" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Nie można zapisać pliku %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Format pliku %(ext)s dodany do %(book)s" @@ -665,491 +665,491 @@ msgstr "Konfiguracja Google Drive nie została zakończona, spróbuj dezaktywowa msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Zwrotna domena nie jest zweryfikowana, proszę zweryfikowania domenę w konsoli deweloperskiej google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "Nie znaleziono formatu %(format)s dla id książki: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Nie znaleziono %(format)s na Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s nie znaleziono: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Wyślij do Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Ten e-mail został wysłany za pośrednictwem Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Testowy e-mail Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Testowy e-mail" # ??? -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Zacznij korzystać z Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Rejestracja e-mail dla użytkownika: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Konwertuj %(orig)s do %(format)s i wyślij do Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Wyślij %(format)s do Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Wyślij do Kindle" # ??? -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Żądany plik nie mógł zostać odczytany. Może brakuje uprawnień?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Usuwanie folderu książki dla książki %(id)s nie powiodło się, ścieżka ma podfoldery: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Usuwanie książki %(id)s zakończyło się błędem: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Usuwanie książki %(id)s, ścieżka książki jest niepoprawna: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Zmiana nazwy tytułu z: „%(src)s” na „%(dest)s” zakończyła się błędem: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Nie znaleziono pliku %(file)s na Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Zmiana nazwy tytułu z: „%(src)s” na „%(dest)s” zakończyła się błędem: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Nie znaleziono ścieżki do książki %(path)s na Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Nazwa użytkownika jest już zajęta" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Nieprawidłowy format adresu e-mail" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Błąd przy pobieraniu okładki" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Błędny format okładki" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Nie udało się utworzyć ścieżki dla okładki" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Plik okładki nie jest poprawnym plikiem obrazu lub nie mógł zostać zapisany" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Jako plik okładki obsługiwane są tylko pliki jpg/jpeg/png/webp/bmp" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Jako plik okładki dopuszczalne są jedynie pliki jpg/jpeg" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Odkrywaj" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Plik wykonywalny programu unrar nie znaleziony" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Błąd przy wykonywaniu unrar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Baza danych nie jest zapisywalna" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Brak uprawnienia do wykonywania pliku" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Błąd przy wykonywaniu unrar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Aby uzyskać prawidłowy api_endpoint dla urządzenia Kobo, należy skorzystać z dostępu do calibre-web spoza localhost" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Konfiguracja Kobo" # ??? -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Zarejestruj się %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "zalogowałeś się jako: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Łączenie z %(oauth)s zakończono sukcesem" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Błąd logowania, użytkownik niepołączony z kontem OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Rozłączanie z %(oauth)s zakończono sukcesem" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Rozłączanie z %(oauth)s zakończono porażką" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Nie połączono z %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Nie udało się zalogować za pomocą GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Nie udało się pobrać informacji o użytkowniku z GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Nie udało się zalogować do Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Nie udało się pobrać informacji o użytkowniku z Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Błąd GitHub Oauth, proszę spróbować później." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Błąd GitHub Oauth: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Błąd Google Oauth, proszę spróbować później." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Błąd Google Oauth: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Gwiazdek" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Zaloguj się" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Nie znaleziono tokenu" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token wygasł" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Powodzenie! Wróć do swojego urządzenia" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Książki" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Pokaż menu ostatnio dodanych książek" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Najpopularniejsze" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Pokaż menu najpopularniejszych książek" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Pobrane książki" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Pokaż pobrane książki" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Najwyżej ocenione" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Pokaż menu najwyżej ocenionych książek" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Przeczytane" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Pokaż menu przeczytane i nieprzeczytane" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Nieprzeczytane" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Pokaż nieprzeczytane" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Odkrywaj" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Pokazuj losowe książki" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategorie" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Pokaż menu wyboru kategorii" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Cykle" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Pokaż menu wyboru cyklu" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autorzy" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Pokaż menu wyboru autora" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Wydawcy" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Pokaż menu wyboru wydawcy" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Języki" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Pokaż menu wyboru języka" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Oceny" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Pokaż menu listy ocen" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formaty plików" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Pokaż menu formatu plików" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Zarchiwizowane książki" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Pokaż zarchiwizowane książki" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Lista książek" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Pokaż listę książek" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Szukaj" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Opublikowane po " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Opublikowane przed " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Ocena <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Ocena >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Status przeczytania = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 #, fuzzy msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Błąd podczas wyszukiwania kolumn niestandardowych, proszę zrestartować Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Wyszukiwanie" @@ -1260,45 +1260,45 @@ msgstr "Publiczna półka o nazwie '%(title)s' już istnieje." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Prywatna półka o nazwie '%(title)s' już istnieje." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: „%(name)s”" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Błąd otwierania półki. Półka nie istnieje lub jest niedostępna" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Zadania" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Oczekiwanie" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Nieudane" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Rozpoczynanie" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Zakończone" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Ststus nieznany" @@ -1331,178 +1331,178 @@ msgstr "Dostępna jest nowa aktualizacja. Kliknij przycisk poniżej, aby zaktual msgid "No release information available" msgstr "Brak dostępnych informacji o wersji" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Odkrywaj (losowe książki)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Książki pobrane przez %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Wydawca: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Cykl: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Ocena: %(rating)s gwiazdek" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Format pliku: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "DLS" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Lista z ocenami" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista formatów" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Książka została umieszczona w kolejce do wysłania do %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Najpierw skonfiguruj adres e-mail Kindle..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Zarejestruj się" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Serwer e-mail nie jest skonfigurowany, skontaktuj się z administratorem!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Twój e-mail nie może się zarejestrować" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Wiadomość e-mail z potwierdzeniem została wysłana na Twoje konto e-mail." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Nie można aktywować uwierzytelniania LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "zalogowałeś się jako: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Fallback Login as: %(nickname)s, LDAP Server not reachable, or user not known" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Nie można zalogować: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Błędna nazwa użytkownika lub hasło" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nowe hasło zostało wysłane na Twój adres e-mail" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Wystąpił nieznany błąd. Spróbuj ponownie później." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Wprowadź prawidłową nazwę użytkownika, aby zresetować hasło" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "zalogowałeś się jako: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Zaktualizowano profil" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Znaleziono istniejące konto dla tego adresu e-mail" @@ -1510,54 +1510,58 @@ msgstr "Znaleziono istniejące konto dla tego adresu e-mail" msgid "Found no valid gmail.json file with OAuth information" msgstr "Nie znaleziono poprawnego pliku gmail.json z informacjami OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Wyślij do Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Nie znaleziono narzędzia calibre %(tool)s do konwertowania" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Nie znaleziono na dysku formatu %(format)s" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Konwertowanie ebooka zakończyło się niepowodzeniem z nieznanego powodu" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter spowodowało błąd: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konwertowany plik nie został znaleziony, lub więcej niż jeden plik w folderze %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Konwertowanie nie powiodło się: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, fuzzy, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre nie powiodło się z błędem: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Konwertowanie nie powiodło się: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1566,11 +1570,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "edytuj metadane" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1608,7 +1608,7 @@ msgstr "Nazwa użytkownika" msgid "Email" msgstr "E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Adres e-mail dla wysyłania do Kindle" @@ -1844,7 +1844,7 @@ msgstr "OK" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Anuluj" @@ -1896,7 +1896,7 @@ msgstr "Sortuj według daty publikacji, najstarsze jako pierwsze" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "zwiń" @@ -2004,12 +2004,12 @@ msgid "Language" msgstr "Język" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Tak" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nie" @@ -2175,7 +2175,7 @@ msgid "Enter " msgstr "Identyfikatory" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Czy jesteś pewny?" @@ -2961,7 +2961,7 @@ msgstr "Błąd" msgid "Upload done, processing, please wait..." msgstr "Wysyłanie zakończone, przetwarzanie, proszę czekać…" -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Ustawienia" @@ -3100,7 +3100,7 @@ msgstr "Główny katalog" msgid "Select" msgstr "Wybierz" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "OK" @@ -3108,36 +3108,78 @@ msgstr "OK" msgid "Calibre-Web eBook Catalog" msgstr "Katalog e-booków Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "Czytnik PDF" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Jasny" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Ciemny" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Wróć" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Przepływ tekstu, gdy paski boczne są otwarte." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +# ??? +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Usuń" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Oczekiwanie" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Pionowo" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Przeczytana" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Nieprawidłowa kolumna odczytu" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3339,11 +3381,11 @@ msgstr "Data publikacji od" msgid "Published Date To" msgstr "Data publikacji do" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3379,11 +3421,13 @@ msgstr "Ocena większa niż" msgid "Rating Below" msgstr "Ocena mniejsza niż" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Od:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Do:" @@ -3407,6 +3451,16 @@ msgstr "Wyłączenie Zlecenie zmiany" msgid "Enable Change order" msgstr "Włącz polecenie zmiany" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Sortuj książki według daty, najnowsze jako pierwsze" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Sortuj książki według daty, najstarsze jako pierwsze" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Współdziel z wszystkimi" @@ -3476,15 +3530,20 @@ msgstr "Postęp" msgid "Run Time" msgstr "Czas wykonania" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Połącz" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3492,6 +3551,10 @@ msgstr "" msgid "Reset user Password" msgstr "Zresetuj hasło użytkownika" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Pokaż książki w języku" diff --git a/cps/translations/pt/LC_MESSAGES/messages.mo b/cps/translations/pt/LC_MESSAGES/messages.mo index b3cf448a..f34c19b5 100644 Binary files a/cps/translations/pt/LC_MESSAGES/messages.mo and b/cps/translations/pt/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/pt/LC_MESSAGES/messages.po b/cps/translations/pt/LC_MESSAGES/messages.po index 6b1e05b5..a8de2991 100644 --- a/cps/translations/pt/LC_MESSAGES/messages.po +++ b/cps/translations/pt/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2023-07-25 11:30+0100\n" "Last-Translator: horus68 \n" "Language: pt\n" @@ -13,443 +13,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Estatísticas" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Servidor reiniciado, por favor, refresque a página" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "A encerrar o servidor, por favor, feche a janela" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "Sucesso! Base de dados religada" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Comando desconhecido" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Sucesso! Livros enviados para lista de espera para cópia de segurança de metadados. Por favor, verifique o resultado em Tarefas" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Desconhecido" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Página de administração" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configuração básica" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configuração de IU" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar utilizadores" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tudo" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Utilizador não encontrado" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} utilizadores eliminados com sucesso" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar tudo" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Pedido mal construído" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Nome do convidado não pode ser alterado" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Convidado não pode ter esta função" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Nenhum utilizador administrador restante, impossível remover a função de administrador" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Valor tem de ser verdadeiro ou falso" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Função inválida" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "O convidado não podr ter esta vista" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Vista inválida" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "O idioma do convidado é detetado automaticamente e não pode ser alterado" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Nenhum idioma válido fornecido" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Não foi indicado um idioma de livro válido" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parâmetro não encontrado" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Coluna Lido é inválida" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Coluna Restrito é inválida" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Configuração do Calibre-Web atualizada" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Quer realmente apagar a Kobo Token?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Quer realmente eliminar este domínio?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Quer realmente apagar este utilizador?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Tem a certeza de que quer apagar essa estante?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Tem a certeza de que quer alterar o idioma dos utilizadores selecionados?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Tem a certeza de que quer alterar os idiomas de livros visíveis para os utilizadores selecionados?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Tem a certeza de que quer alterar a função selecionada para os utilizadores selecionados?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Tem a certeza de que quer alterar as restrições selecionadas para os utilizadores selecionados?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Tem a certeza de de que quer alterar as restrições de visibilidade selecionadas para os utilizadores selecionados?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Tem a certeza de que quer alterar o comportamento de sincronização da estante para os utilizadores selecionados?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Tem a certeza de que quer alterar a localização da biblioteca Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "O Calibre-Web irá procurar por capas atualizadas e atualizará as miniaturas das capas. Isto poderá demorar um pouco" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Tem a certeza de que deseja apagar a base de dados de sincronização do Calibre-Web para forçar uma sincronização completa com seu Kobo Reader?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Negar" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} entradas de sincronização eliminadas" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Etiqueta não encontrada" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ação inválida" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json não está configurado para aplicação Web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do ficheiro de historial não é válida. Por favor, digite um caminho correto" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do ficheiro de historial não é válida. Por favor, digite um caminho correto" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Digite um fornecedor LDAP, porta, DN e identificador de objeto do utilizador" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, digite uma conta de serviço LDAP e senha" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, digite uma conta de serviço LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de grupo LDAP precisa de ter um identificador de formato \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de grupo LDAP tem parênteses não coincidentes" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de utilizador LDAP precisa de ter um identificador de formato \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de utilizador LDAP tem parênteses não coincidentes" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de utilizador membro do LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtro de utilizador de membro LDAP tem parênteses incomparáveis" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP Certificado CA: Localização inválida de certificado ou chave. Por favor, digite um caminho correto" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Adicionar utilizador" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Editar configurações do servidor de email" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Sucesso! Conta Gmail verificada" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Erro de base de dados: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Email de teste enviado para lista de espera para envio para %(email)s. Por favor, verifique o resultado em Tarefas" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocorreu um erro ao enviar o email de teste: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Por favor, primeiro configure seu endereço de email..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Atualização das configurações do servidor de email" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Editar configurações de tarefas agendadas" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Hora de início inválida para a tarefa especificada" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Duração inválida para a tarefa especificada" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Foram atualizadas as configurações de tarefas agendadas" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Configuaração da DB não é gravável" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Editar utilizador %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Sucesso! Senha do utilizador %(user)s redefinida" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visualizador do historial" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "A solicitar pacote de atualização" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "A descarregar pacote de atualização" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "A descomprimir pacote de atualização" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "A substituir ficheiros" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "As ligações à base de dados estão fechadas" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "A parar o servidor" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Atualização concluída, pressione OK e refresque a página" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Atualização falhou:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erro de ligação" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo limite ao estabelecer a ligação" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erro geral" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Ficheiro de atualização não pode ser guardado na pasta temporária" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Não foi possível substituir ficheiros durante a atualização" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Falha ao extrair pelo menos um utilizador LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Falha ao criar pelo menos um utilizador LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: Nenhum utilizador devolvido na resposta do servidor LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "No mínimo um utilizador LDAP não encontrado no base de dados" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} utilizador importado com sucesso" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "A localização da base de dados não é válida. Por favor, digite o caminho correto" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "DB não é gravável" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do ficheiro de chaves não é válida. Por favor, digite o caminho correto" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do ficheiro de certificados não é válida. Por favor, digite o caminho correto" @@ -465,7 +465,7 @@ msgstr "Configurações da base de dados atualizadas" msgid "Database Configuration" msgstr "Configuração da base de dados" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Por favor, preencha todos os campos!" @@ -499,7 +499,7 @@ msgstr "Impossível eliminar convidado" msgid "No admin user remaining, can't delete user" msgstr "Nenhum utilizador administrador restante, não é possível eliminar o utilizador" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "O email não pode estar vazio e tem de ser válido" @@ -516,128 +516,128 @@ msgstr "não instalado" msgid "Execution permissions missing" msgstr "Falta de permissões de execução" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "A coluna personalizada No.%(column)d não existe na base de dados do Calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Nenhum" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oops! O Livro selecionado não está disponível. O ficheiro não existe ou não está acessível" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Utilizador não tem permissão para carregar capas" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Os identificadores não diferenciam maiúsculas de minúsculas, substituindo o identificador antigo" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadados atualizados com sucesso" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Erro ao editar o livro: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Ficheiro %(file)s enviado" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Formato de origem ou destino para conversão está em falta" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Livro enviado com sucesso para lista de espera de conversão para %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocorreu um erro ao converter este livro: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "O livro carregado provavelmente existe na biblioteca, considere alterar antes de carregar novo: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s não é um idioma válido" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "A extensão de ficheiro '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A extensão de ficheiro '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "O ficheiro a ser carregado deve ter uma extensão" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "O ficheiro %(filename)s não foi possível ser guardado na pasta temporária" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Falha ao mover ficheiro de capa %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Formato de livro eliminado com sucesso" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Livro eliminado com sucesso" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Não tem permissões para apagar livros" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "editar metadados" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s não é um número válido, ignorando" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Utilizador não tem direitos para carregar formatos de ficheiro adicionais" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Falha ao criar o caminho %(path)s (Permissão negada)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o ficheiro %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato de ficheiro %(ext)s adicionado a %(book)s" @@ -650,485 +650,485 @@ msgstr "Configuração do Google Drive não concluída, tente desativar e ativar msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "O domínio Callback não foi verificado. Por favor, siga os passos para verificar o domínio na consola de programadores do Google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s não encontrado para o ID do livro: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s não encontrado no Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s não encontrado: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Enviar para dispositivo de leitura" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Este email foi enviado via Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Email de teste do Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Email de teste" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Comece a usar o Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Email de registo do utilizador: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Converter %(orig)s em %(format)s e enviar para dispositivo de leitura" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Enviar %(format)s para o dispositivo de leitura" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s enviado para o dispositivo de leitura" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Não foi possível ler o ficheiro solicitado. Talvez permissões erradas?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Estatuto de Lido não pode ser alterado: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "A eliminação da pasta de livros do livro %(id)s falhou, o caminho tem subpastas: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Falha ao eliminar livro %(id)s: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Eliminar livro %(id)s apenas da base de dados, caminho do livro inválido: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renomear autor de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Ficheiro %(file)s não encontrado no Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renomear título de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Caminho do livro %(path)s não encontrado no Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "Encontrada uma conta existente para este endereço de email" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Este nome de utilizador já está registado" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Formato de endereço de email inválido" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "O módulo Python 'advocate' não está instalado, mas é necessário para carregar capas" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Erro ao descarregar a capa" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Erro de formato da capa" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Não possui permissões para aceder a localhost ou à rede local para carregar capas" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Falha em criar um caminho para a capa" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "O ficheiro de capa não é um ficheiro de imagem válido, ou não foi possível ser armazenado" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Apenas ficheiros jpg/jpeg/png/webp/bmp são suportados como ficheiros de capa" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Conteúdo do ficheiro de capa inválido" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Apenas ficheiros jpg/jpeg são suportados como ficheiros de capa" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Capa" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Binário UnRar não encontrado" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Erro a executar UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "DB não é gravável" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Falta de permissões de execução" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Erro a executar UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Enviar todos os livros para lista de espera para cópia de segurança de metadados" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Por favor, aceda ao Calibre-web a partir de um servidor não local para obter uma api_endpoint válida para o dispositivo Kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configuração Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Autentique-se com %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Sucesso! Agora está autenticado como: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Hiperligação para %(oauth)s bem-sucedida" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Falha na autenticação, nenhum utilizador ligado a uma conta OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Desvincular a %(oauth)s bem-sucedido" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Falha ao desvincular de %(oauth)s" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Não vinculado a %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Falha na autenticação com GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Falha na pesquisa de informações do utilizador no GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Falha na autenticação com Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Falha na pesquisa de informações de utilizador no Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Erro no Oauth do GitHub. Por favor, tente novamente mais tarde." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Erro no Oauth do GitHub: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Erro no Google Oauth, tente novamente mais tarde." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Erro no Oauth do Google: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Estrelas" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Autenticar" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token não encontrado" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "O Token expirou" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Sucesso! Por favor, volte ao seu dispositivo" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Livros" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Mostrar livros recentes" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Livros quentes" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Mostrar livros mais descarregados" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Livros descarregados" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Mostrar livros descarregados" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Top de pontuação de livros" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Mostrar livros mais bem pontuados" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Livros lidos" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Mostrar lido e não lido" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Livros não lidos" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Mostrar Não Lidos" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Descobrir" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mostrar livros aleatoriamente" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorias" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Mostrar secção da categoria" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Séries" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Mostrar secção de séries" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autores" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Mostrar secção de autor" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Editoras" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Mostrar seleção de editoras" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Idiomas" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Mostrar secção de idioma" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Pontuações" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Mostrar secção de pontuações" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formatos de ficheiro" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Mostrar secção de formatos de ficheiro" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Livros arquivados" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Mostrar livros arquivados" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Lista de livros" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Mostrar lista de livros" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Pesquisar" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publicado depois de " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publicado antes de " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Pontuação <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Pontuação >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Estado de leitura = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erro na pesquisa de colunas personalizadas. Por favor, reinicie o Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Pesquisa avançada" @@ -1236,45 +1236,45 @@ msgstr "Já existe uma estante pública com o nome '%(title)s' ." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante privada com o nome'%(title)s' ." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erro ao abrir estante. A estante não existe ou não está acessível" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tarefas" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Aguardando" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Falhado" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Iniciado" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Concluído" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Terminado" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Cancelado" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Estado desconhecido" @@ -1307,178 +1307,178 @@ msgstr "Uma nova atualização está disponível. Clique no botão abaixo para a msgid "No release information available" msgstr "Não existem informações disponíveis sobre o lançamento" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Descobrir (Livros aleatórios)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Livros quentes (Mais descarregados)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livros descarregados por %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Editora: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Séries: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Pontuação: Nenhuma" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Pontuação: %(rating)s estrelas" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Formato do ficheiro: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Descarregamentos" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Lista de pontuações" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista de formatos de ficheiro" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Sucesso! Livro enviado para lista de espera para envio a %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Ops! Por favor, atualize o seu perfil com um endereço de email válido para envio ao Kindle." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "Por favor, aguarde um minuto para registar o próximo utilizador" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registar" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Ops! O servidor de email não está configurado. Por favor, contacte o seu administrador!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Ops! O servidor de email não está configurado. Por favor, contacte o seu administrador!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Ops! O seu email não é permitido para registo" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Sucesso! O email de confirmação foi enviado para a sua conta de email." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Não é possível ativar a autenticação LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "Por favor, aguarde um minuto antes de nova autenticação" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "agora você está autenticado como: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Autenticação recurso como:'%(nickname)s', servidor LDAP não acessível ou utilizador desconhecido" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Não foi possível autenticar-se: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Nome de utilizador ou senha incorretos" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nova senha foi enviada para seu endereço de email" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Por favor, digite um nome de utilizador válido para poder redefinir a senha" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Agora você está autenticado como: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Perfil atualizado" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Foi encontrada uma conta já existente com este endereço de email." @@ -1486,54 +1486,58 @@ msgstr "Foi encontrada uma conta já existente com este endereço de email." msgid "Found no valid gmail.json file with OAuth information" msgstr "Não foi encontrado nenhum ficheiro gmail.json válido com informações do OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s enviado para dispositivo de leitura" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s não encontrado" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s não encontrado no disco" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "O conversor de ebook falhou com erro desconhecido" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Conversor Kepubify falhou: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Ficheiro convertido não encontrado ou mais de um ficheiro na pasta %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Conversor de ebook falhou: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falhou com erro: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Conversor de ebook falhou: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Converter" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "A religar base de dados Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "Email" @@ -1542,11 +1546,7 @@ msgstr "Email" msgid "Backing up Metadata" msgstr "Cópia de segurança de metadados" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Geradas %(count)s miniaturas para capa" @@ -1584,7 +1584,7 @@ msgstr "Nome de utilizador" msgid "Email" msgstr "Endereço de email" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Enviar para o endereço de email do dispositivod e leitura" @@ -1816,7 +1816,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" @@ -1868,7 +1868,7 @@ msgstr "Ordenar de acordo com a data de publicação, o mais antigo primeiro" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "reduzir" @@ -1975,12 +1975,12 @@ msgid "Language" msgstr "Idioma" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Sim" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Não" @@ -2141,7 +2141,7 @@ msgid "Enter " msgstr "Preencher " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Tem realmente a certeza?" @@ -2916,7 +2916,7 @@ msgstr "Erro" msgid "Upload done, processing, please wait..." msgstr "Carregamento concluído, a processar. Por favor, aguarde ..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Configurações" @@ -3053,7 +3053,7 @@ msgstr "Pasta superior" msgid "Select" msgstr "Selecionar" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3061,34 +3061,75 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Catálogo de ebooks Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "leitor de epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Claro" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Escuro" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sépia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Preto" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Refluir o texto quando as barras laterais estiverem abertas." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "Tamanhos de letra" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Apagar" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Aguardando" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Lido" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Coluna Lido é inválida" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Leitor de banda desenhada" @@ -3286,11 +3327,11 @@ msgstr "Data de publicação de" msgid "Published Date To" msgstr "Data de publicação até" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3326,11 +3367,13 @@ msgstr "Pontuação acima" msgid "Rating Below" msgstr "Pontuação abaixo" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "De:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Para:" @@ -3354,6 +3397,16 @@ msgstr "Desativar alterar ordenação" msgid "Enable Change order" msgstr "Ativar alterar ordenação" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Ordenar de acordo com a data do livro, o mais recente primeiro" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Ordenar de acordo com a data do livro, o mais antigo primeiro" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Partilhar com todos" @@ -3422,15 +3475,20 @@ msgstr "Progresso" msgid "Run Time" msgstr "Tempo de execução" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Fundir" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Ações" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Esta tarefa será cancelada. Qualquer progresso feito por esta tarefa será guardado." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Se esta for uma tarefa agendada, ela será executada novamente durante o próximo horário agendado." @@ -3438,6 +3496,10 @@ msgstr "Se esta for uma tarefa agendada, ela será executada novamente durante o msgid "Reset user Password" msgstr "Redefinir senha do utilizador" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Idioma dos livros" diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.mo b/cps/translations/pt_BR/LC_MESSAGES/messages.mo index d7615a4d..668299f6 100644 Binary files a/cps/translations/pt_BR/LC_MESSAGES/messages.mo and b/cps/translations/pt_BR/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/pt_BR/LC_MESSAGES/messages.po b/cps/translations/pt_BR/LC_MESSAGES/messages.po index fb830ba1..b55f8b31 100644 --- a/cps/translations/pt_BR/LC_MESSAGES/messages.po +++ b/cps/translations/pt_BR/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: br\n" @@ -13,443 +13,443 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Estatísticas" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Servidor reiniciado, por favor recarregue a página" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Executando o desligamento do servidor, por favor feche a janela" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Comando desconhecido" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "E-mail de teste enfileirado para envio para %(email)s, verifique o resultado em Tarefas" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Desconhecido" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Página de Administração" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Configuração Básica" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Configuração de UI" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Editar Usuários" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Todos" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Usuário não encontrado" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} usuário(s) deletedos com sucesso" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Mostrar Tudo" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Requisição Malformada" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Nome do Convidado não pode ser alterado" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Convidado não pode ter esta função" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Nenhum usuário administrador restante, impossível remover a função de administrador" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Valor tem de ser Verdadeiro ou Falso" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Função Inválida" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Convidado não pode ter esta visão" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Visão Inválida" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "O idioma do Convidado é detectado automaticamente e não pode ser alterado" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Nenhum Idioma Válido Fornecido" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Nenhum Idioma do Livro Válido Fornecido" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parametro não encontrado" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Coluna Lido Inválida" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Coluna Restrito Inválida" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Configuração do Calibre-Web atualizada" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Você realmente quer apagar a Kobo Token?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Você realmente quer apagar este domínio?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Você realmente quer apagar este usuário?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Tem certeza que quer apagar essa estante?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Tem certeza que quer alterar o idioma do(s) usuário(s) selecionados?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Tem certeza que quer alterar os idiomas de livros visíveis par o usuário(s) selecionado(s)?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Tem certeza que quer alterar a função selecionada para o(s) usuário(s) selecionado(s)?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Tem certeza que quer alterar as restriçõeo selecionada para o(s) usuário(s) selecionado(s)?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Tem certeza de que quer alterar as restrições de visibilidade selecionadas para os usuários selecionados?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Tem certeza de que quer alterar o comportamento de sincronização da estante para o usuário selecionado?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Tem certeza que queres alterar a localização da biblioteca Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "O Calibre-Web buscará por Capas atualizadas e atualizará as Miniaturas de Capas, isso pode demorar um pouco" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Tem certeza de que deseja apagar o banco de dados de sincronização do Calibre-Web para forçar uma sincronização completa com seu Kobo Reader?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Negar" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Permitir" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} entradas de sincronização deletadas" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Tag não encontrada" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ação Inválida" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json Não Está Configurado para Aplicação Web" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do arquivo de log não é válida, digite o caminho correto" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "A localização do arquivo de log de acesso não é válida, digite o caminho correto" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Digite um provedor LDAP, porta, DN e identificador de objeto do usuário" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Por favor, digite uma Conta de Serviço LDAP e Senha" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Por favor, digite uma Conta de Serviço LDAP" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de grupo LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de grupo LDAP tem parênteses incomparáveis" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de objeto de usuário LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filtro de objeto de usuário LDAP tem parênteses incomparáveis" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "O filtro de usuário membro do LDAP precisa ter um identificador de formato \"%s\"" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filtro de usuário de membro LDAP tem parênteses incomparáveis" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "Localização de LDAP CACertificate, Certificados ou Key Inválida, Insira o Caminho Correto" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Adicionar Novo Usuário" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Editar configurações do servidor de e-mail" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Erro de banco de dados: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "E-mail de teste enfileirado para envio para %(email)s, verifique o resultado em Tarefas" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Ocorreu um erro ao enviar o e-mail de teste: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Por favor, configure seu endereço de e-mail primeiro..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Atualização das configurações do servidor de e-mail" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Editar configurações de tarefas agendadas" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Hora de início inválida para a tarefa especificada" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Duração inválida para a tarefa especificada" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Configurações de tarefas agendadas atualizadas" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Settings DB não é gravável" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuário %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Senha do usuário %(user)s redefinida" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visualizador do Log" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Solicitação de pacote de atualização" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Baixando pacote de atualização" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Descompactando pacote de atualização" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Substituindo arquivos" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "As conexões à base de dados estão fechadas" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Parando servidor" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Atualização concluída, pressione okay e recarregue a página" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Atualização falhou:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Erro HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Erro de conexão" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tempo limite durante o estabelecimento da conexão" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Erro geral" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Arquivo de atualização não pôde ser salvo no diretório temporário" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Arquivos não puderam ser substituídos durante a atualização" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Falha ao extrair pelo menos um usuário LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Falha ao criar pelo menos um usuário LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Erro: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Erro: Nenhum usuário retornado na resposta do servidor LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "No mínimo um usuário LDAP não encontrado no banco de dados" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} Usuário Importado com Sucesso" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "A localização do banco de dados não é válida, digite o caminho correto" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "DB não é gravável" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do Keyfile Inválida, Insira o Caminho Correto" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Localização do Certfile Inválida, Insira o Caminho Correto" @@ -465,7 +465,7 @@ msgstr "Configurações do Banco de Dados Atualizada" msgid "Database Configuration" msgstr "Configuração do Banco de Dados" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Por favor, preencha todos os campos!" @@ -499,7 +499,7 @@ msgstr "Impossível excluir Convidado" msgid "No admin user remaining, can't delete user" msgstr "Nenhum usuário administrador restante, não é possível apagar o usuário" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -516,128 +516,128 @@ msgstr "não instalado" msgid "Execution permissions missing" msgstr "Faltam as permissões de execução" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "A Coluna Personalizada No.%(column)d não existe no banco de dados do calibre" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Nenhum" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Oops! O Livro selecionado não está disponível. O arquivo não existe ou não é acessível" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Usuário não tem permissão para fazer upload da capa" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Os identificadores não diferenciam maiúsculas de minúsculas, substituindo o identificador antigo" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadados atualizados com sucesso" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Erro ao editar o livro: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Arquivo %(file)s enviado" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Formato de origem ou destino para conversão ausente" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Livro enfileirado com sucesso para conversão em %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Ocorreu um erro ao converter este livro: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "O livro carregado provavelmente existe na biblioteca, considere alterar antes de carregar novo: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s não é um idioma válido" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "A extensão de arquivo '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "A extensão de arquivo '%(ext)s' não pode ser enviada para este servidor" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "O arquivo a ser carregado deve ter uma extensão" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "O arquivo %(filename)s não pôde ser salvo no diretório temporário" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Falha ao mover arquivo de capa %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Formato do Livro Apagado com Sucesso" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Livro Apagado com Sucesso" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Você não tem permissão para apagar livros" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "editar metadados" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s não é um número válido, ignorando" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Usuário não tem direitos para fazer upload de formatos de arquivo adicionais" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Falha ao criar o caminho %(path)s (Permission denied)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Falha ao armazenar o arquivo %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Formato de arquivo %(ext)s adicionado a %(book)s" @@ -650,485 +650,485 @@ msgstr "Configuração do Google Drive não concluída, tente desativar e ativar msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "O domínio Callback não foi verificado, por favor siga os passos para verificar o domínio no console do desenvolvedor do google" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "Formato %(format)s não encontrado para o id do livro: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s não encontrado no Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s não encontrado: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Enviar para E-Reader" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Este e-mail foi enviado via Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "E-mail de teste do Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "E-mail de teste" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Comece a usar o calibre-web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "E-mail de registro do usuário: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Converter %(orig)s em %(format)s e enviar para E-Reader" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Enviar %(format)s para o E-Reader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s enviado para E-Reader" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "O arquivo solicitado não pôde ser lido. Talvez permissões erradas?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Status Lido não pode ser alterado: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "A exclusão da pasta de livros do livro %(id)s falhou, o caminho tem subpastas: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Falha ao excluir livro %(id)s: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Excluindo livro %(id)s somente do banco de dados, caminho do livro inválido: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renomear autor de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Arquivo %(file)s não encontrado no Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Renomear título de: '%(src)s' para '%(dest)s' falhou com o erro: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Caminho do livro %(path)s não encontrado no Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Este nome de usuário já está registrado" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Formato de endereço de e-mail inválido" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "O módulo Python 'advocate' não está instalado, mas é necessário para uploads de capa" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Erro ao Baixar a capa" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Erro de Formato da Capa" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Você não tem permissão para acessar localhost ou a rede local para uploads de capa" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Falha em criar caminho para a capa" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "O arquivo de capa não é um arquivo de imagem válido, ou não pôde ser armazenado" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Apenas arquivos jpg/jpeg/png/webp/bmp são suportados como arquivos de capa" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Conteúdo do arquivo de capa inválido" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Apenas arquivos jpg/jpeg são suportados como arquivos de capa" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Capa" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Binário UnRar não encontrado" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Erro excecutando UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "DB não é gravável" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Faltam as permissões de execução" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Erro excecutando UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Por favor, acesse o calibre-web de um host não local para obter um api_endpoint válido para o dispositivo kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Configuração Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registre-se com %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "agora você está logado como: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Link para %(oauth)s bem-sucedido" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Login falhou, nenhum usuário ligado a uma conta OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Desvincular para %(oauth)s bem-sucedido" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Falha ao desvincular para %(oauth)s" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Não vinculado a %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Falha no login com o GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Falha na busca de informações do usuário no GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Falha no login com o Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Falha na busca de informações de usuário no Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Erro no Oauth do GitHub, tente novamente mais tarde." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Erro no Oauth do GitHub: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Erro no Google Oauth, tente novamente mais tarde." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Erro no Oauth do Google: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Estrelas" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Login" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token não encontrado" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "O Token expirou" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Sucesso! Por favor, volte ao seu aparelho" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Livros" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Mostrar livros recentes" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Livros Quentes" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Mostrar Livros Quentes" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Livros Baixados" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Mostrar Livros Baixados" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Livros Mais Bem Avaliados" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Mostrar Livros Mais Bem Avaliados" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Livros Lidos" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Mostrar lido e não lido" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Livros Não Lidos" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Mostrar Não Lidos" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Descubra" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Mostrar Livros Aleatórios" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Categorias" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Mostrar seção de categoria" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Série" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Mostrar seção de séries" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autores" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Mostrar seção de autor" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Editoras" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Mostrar seção de editoras" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Idiomas" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Mostrar seção de idioma" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Avaliações" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Mostrar seção de avaliações" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Formatos de arquivo" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Mostrar seção de formatos de arquivo" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Livros Arquivados" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Mostrar livros arquivados" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Lista de Livros" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Mostrar Lista de Livros" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Pesquisar" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publicado depois de " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publicado antes de " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Avaliação <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Avaliação >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Status de leitura = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Erro na pesquisa de colunas personalizadas, reinicie o Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Pesquisa Avançada" @@ -1236,45 +1236,45 @@ msgstr "Já existe uma estante pública com o nome '%(title)s' ." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Já existe uma estante privada com o nome'%(title)s' ." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Erro ao abrir estante. A estante não existe ou não está acessível" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Tarefas" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Aguardando" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Falha" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Iniciado" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Concluído" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Terminado" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Cancelado" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Status Desconhecido" @@ -1307,178 +1307,178 @@ msgstr "Uma nova atualização está disponível. Clique no botão abaixo para a msgid "No release information available" msgstr "Não há informações de lançamento disponíveis" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Descobrir (Livros Aleatórios)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Livros Quentess (Mais Baixados)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Livros baixados por %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Autor: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Editora: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Avaliação: Nenhuma" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Avaliação: %(rating)s estrelas" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Formato do arquivo: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Categoria: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Idioma: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Downloads" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Lista de Avaliações" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista de formatos de arquivo" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Por favor, configure primeiro as configurações de correio SMTP..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Livro enfileirado com sucesso para envio para %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Ops! Ocorreu um erro ao enviar este livro: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Por favor, atualize seu perfil com um endereço de e-mail Envie Para o Kindle válido." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registe-se" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "O servidor de E-Mail não está configurado, por favor contacte o seu administrador!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Seu e-mail não tem permissão para registrar" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "O e-mail de confirmação foi enviado para a sua conta de e-mail." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Não é possível ativar a autenticação LDAP" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "agora você está logado como: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Login de reserva como:'%(nickname)s', servidor LDAP não acessível ou usuário desconhecido" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Não foi possível fazer o login: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Nome de Usuário ou Senha incorretos" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nova Senha foi enviada para seu endereço de e-mail" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente mais tarde." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Por favor, digite um nome de usuário válido para redefinir a senha" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "agora você está logado como: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Perfil de %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Perfil atualizado" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Encontrada uma conta existente para este endereço de e-mail." @@ -1486,54 +1486,58 @@ msgstr "Encontrada uma conta existente para este endereço de e-mail." msgid "Found no valid gmail.json file with OAuth information" msgstr "Não foi encontrado nenhum arquivo gmail.json válido com informações do OAuth" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s enviado para E-Reader" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre ebook-convert %(tool)s não encontrado" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Formato %(format)s não encontrado no disco" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "O conversor de Ebook falhou com erro desconhecido" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-converter falhou: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Arquivo convertido não encontrado ou mais de um arquivo na pasta %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ebook-converter falhou: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre falhou com erro: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-converter falhou: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Converter" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Reconectando banco de dados Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-mail" @@ -1542,11 +1546,7 @@ msgstr "E-mail" msgid "Backing up Metadata" msgstr "Cópia de segurança de metadados" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Gerado %(count)s miniaturas de capa" @@ -1584,7 +1584,7 @@ msgstr "Nome de usuário" msgid "Email" msgstr "Endereço de e-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Enviar para o endereço de e-mail do E-Reader" @@ -1816,7 +1816,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Cancelar" @@ -1868,7 +1868,7 @@ msgstr "Classificar de acordo com a data de publicação, primeiro mais antigo" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "reduzir" @@ -1975,12 +1975,12 @@ msgid "Language" msgstr "Idioma" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Sim" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Não" @@ -2141,7 +2141,7 @@ msgid "Enter " msgstr "Entrar " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Você realmente tem certeza?" @@ -2916,7 +2916,7 @@ msgstr "Erro" msgid "Upload done, processing, please wait..." msgstr "Upload concluído, processando, por favor aguarde ..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Configurações" @@ -3053,7 +3053,7 @@ msgstr "Diretório Acima" msgid "Select" msgstr "Selecione" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3061,34 +3061,75 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Catálogo de e-books Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "leitor de epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Claro" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Escuro" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sépia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Preto" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Refluir o texto quando as barras laterais estiverem abertas." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Apagar" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Aguardando" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertical" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Lido" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Coluna Lido Inválida" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Leitor de Quadrinhos" @@ -3286,11 +3327,11 @@ msgstr "Data de Publicação de" msgid "Published Date To" msgstr "Data de Publicação Até" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3326,11 +3367,13 @@ msgstr "Avaliação Acima" msgid "Rating Below" msgstr "Avaliação Abaixo" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "De:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Para:" @@ -3354,6 +3397,16 @@ msgstr "Desabilitar Alterar Ordem" msgid "Enable Change order" msgstr "Habilitar Alterar Ordem" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Classificar de acordo com a data do livro, o mais recente primeiro" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Classificar de acordo com a data do livro, o mais antigo primeiro" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Compartilhar com Todos" @@ -3422,15 +3475,20 @@ msgstr "Progresso" msgid "Run Time" msgstr "Tempo de execução" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Mesclar" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Ações" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Esta tarefa será cancelada. Qualquer progresso feito por esta tarefa será salvo." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Se esta for uma tarefa agendada, ela será executada novamente durante o próximo horário agendado." @@ -3438,6 +3496,10 @@ msgstr "Se esta for uma tarefa agendada, ela será executada novamente durante o msgid "Reset user Password" msgstr "Redefinir senha do usuário" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Idioma dos Livros" diff --git a/cps/translations/ru/LC_MESSAGES/messages.mo b/cps/translations/ru/LC_MESSAGES/messages.mo index 0f716462..c4a12bb7 100644 Binary files a/cps/translations/ru/LC_MESSAGES/messages.mo and b/cps/translations/ru/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po index cb38d481..8be7b40f 100644 --- a/cps/translations/ru/LC_MESSAGES/messages.po +++ b/cps/translations/ru/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-04-29 01:20+0400\n" "Last-Translator: ZIZA\n" "Language: ru\n" @@ -17,451 +17,451 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Статистика" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Сервер перезагружен, пожалуйста, обновите страницу" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Производится остановка сервера, пожалуйста, закройте окно" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Неизвестная команда" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Книга успешно поставлена в очередь для отправки на %(eReadermail)s" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Неизвестно" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Администрирование" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Настройка интерфейса" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Управление сервером" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Все" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Показать все" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Конфигурация Calibre-Web обновлена" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Вы действительно хотите удалить Kobo Token ?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Вы действительно хотите удалить эту книжную полку?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Вы действительно хотите удалить эту книжную полку?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Вы действительно хотите удалить эту книжную полку?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Вы действительно хотите удалить эту книжную полку?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Вы действительно хотите остановить Calibre-Web?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Запретить" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Разрешить" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json не настроен для веб-приложения" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Неправильное расположение файла журнала, пожалуйста, введите правильный путь." -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Недопустимое расположение файла журнала доступа, пожалуйста, введите правильный путь" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Пожалуйста, введите провайдера LDAP, порт, DN и идентификатор объекта пользователя" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Фильтр объектов группы LDAP должен иметь один идентификатор формата \"%s\"" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Фильтр объектов группы LDAP имеет незавершённые круглые скобки" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Фильтр объектов пользователя LDAP должен иметь один идентификатор формата \"%s\"" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Фильтр объектов пользователя LDAP имеет незавершенную круглую скобку" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Добавить нового пользователя" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Изменить настройки SMTP" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Произошла ошибка при отправке тестового письма на: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Пожалуйста, сначала настройте свой адрес электронной почты ..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Настройки E-mail сервера обновлены" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Неизвестная ошибка. Попробуйте позже." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Изменить пользователя %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Пароль для пользователя %(user)s сброшен" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Пожалуйста, сперва настройте параметры SMTP....." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Просмотр лога" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Проверка обновлений" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Загрузка обновлений" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Распаковка обновлений" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Замена файлов" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Соединения с базой данных закрыты" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Остановка сервера" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Обновления установлены, нажмите ок и перезагрузите страницу" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Ошибка обновления:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Ошибка HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Ошибка соединения" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Тайм-аут при установлении соединения" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Общая ошибка" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Не удалось сохранить файл обновления во временной папке." -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Не удалось создать хотя бы одного пользователя LDAP" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Не удалось создать хотя бы одного пользователя LDAP" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Ошибка: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Ошибка: ни одного пользователя не найдено в ответ на запрос сервер LDAP" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "По крайней мере, один пользователь LDAP не найден в базе данных" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Расположение Базы Данных неверно, пожалуйста, введите правильный путь." -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Расположение ключевого файла неверно, пожалуйста, введите правильный путь" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Расположение Certfile не является действительным, пожалуйста, введите правильный путь" @@ -479,7 +479,7 @@ msgstr "Настройки E-mail сервера обновлены" msgid "Database Configuration" msgstr "Дополнительный Настройки" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Пожалуйста, заполните все поля!" @@ -514,7 +514,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "Это последний администратор, невозможно удалить пользователя" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -531,128 +531,128 @@ msgstr "не установлено" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Нет" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Невозможно открыть книгу. Файл не существует или недоступен" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Метаданные обновлены" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Файл %(file)s загружен" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Исходный или целевой формат для конвертирования отсутствует" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Произошла ошибка при конвертирования этой книги: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Загруженная книга, вероятно, существует в библиотеке, перед тем как загрузить новую, рассмотрите возможность изменения: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s не допустимый язык" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Запрещена загрузка файлов с расширением '%(ext)s'" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Запрещена загрузка файлов с расширением '%(ext)s'" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Загружаемый файл должен иметь расширение" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Файл %(filename)s не удалось сохранить во временную папку" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "изменить метаданные" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Ошибка при создании пути %(path)s (Доступ запрещён)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Не удалось сохранить файл %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Формат файла %(ext)s добавлен в %(book)s" @@ -665,483 +665,483 @@ msgstr "Настройка Google Drive не завершена, попробу msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Не удалось проверить домен обратного вызова, пожалуйста, выполните шаги для проверки домена в консоли разработчика Google." -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s форма не найден для книги с id: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s не найден на Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s не найден: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Отправить на Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Это электронное письмо было отправлено через Caliber-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Тестовый e-mail для Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Тестовый e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Начать работу с Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Регистрационный e-mail для пользователя: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Преобразовать %(orig)s в %(format)s и отправить в Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Отправить %(format)s в Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Отправить на Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Запрашиваемый файл не может быть прочитан. Возможно у вас нет разрешения?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Файл %(file)s не найден на Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Путь книги %(path)s не найден на Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Это имя пользователя уже занято" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Не удалось создать путь для обложки." -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Только файлы в формате jpg / jpeg поддерживаются как файл обложки" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Обзор" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Пожалуйста, подключитесь к Calibre-Web не с локального хоста, чтобы получить действительный api_endpoint для устройства Kobo" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Настройка Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Зарегистрируйтесь с %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "вы вошли как пользователь '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Связь с %(oauth)s Успешна" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Не удалось войти, ни один пользователь не связан с учетной записью OAuth" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Отмена связи с %(oauth)s успешно" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Связь с %(oauth)s не удалось отмененить" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Не удалось войти в систему с помощью GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Не удалось получить информацию о пользователе из GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Не удалось войти в систему с помощью Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Не удалось получить информацию о пользователе из Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Ошибка GitHub Oauth, пожалуйста попробуйте позже." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Ошибка Google Oauth, пожалуйста попробуйте позже." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Логин" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Ключ не найден" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Ключ просрочен" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Успешно! Пожалуйста, проверьте свое устройство" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Книги" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Показывать недавние книги" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Популярные Книги" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Показывать популярные книги" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Книги с наилучшим рейтингом" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Показывать книги с наивысшим рейтингом" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Прочитанные Книги" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Показывать прочитанные и непрочитанные" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Непрочитанные Книги" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Показать непрочитанное" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Обзор" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Показывать Случайные Книги" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Категории" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Показывать выбор категории" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Серии" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Показывать выбор серии" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Авторы" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Показывать выбор автора" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Издатели" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Показать выбор издателя" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Языки" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Показывать выбор языка" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Рейтинги" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Показать выбор рейтинга" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Форматы файлов" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Показать выбор форматов файлов" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Показывать недавние книги" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Поиск" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Опубликовано после " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Опубликовано до " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Рейтинг <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Расширенный поиск" @@ -1252,45 +1252,45 @@ msgstr "Публичная полка с названием '%(title)s' уже msgid "A private shelf with the name '%(title)s' already exists." msgstr "Приватная полка с названием '%(title)s' уже существует." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Полка: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Ошибка открытия Полки. Полка не существует или недоступна" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Задания" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Ожидание" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Неудачно" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Начало" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Завершено" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Неизвестный статус" @@ -1323,178 +1323,178 @@ msgstr "Новое обновление доступно. Нажмите на к msgid "No release information available" msgstr "Информация о выпуске недоступна" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Обзор (Случайные Книги)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Популярные книги (часто загружаемые)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Автор: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Издатель: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Серии: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Оценка: %(rating)s звезды(а)" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Формат файла: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Категория: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Язык: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Скачать" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Список рейтингов" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Список форматов файлов" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Пожалуйста, сперва настройте параметры SMTP....." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Книга успешно поставлена в очередь для отправки на %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "При отправке этой книги произошла ошибка: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Зарегистрироваться" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Сервер электронной почты не настроен, обратитесь к администратору !" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Ваш e-mail не подходит для регистрации" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Письмо с подтверждением отправлено вам на e-mail." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Не удается активировать LDAP аутентификацию" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "вы вошли как пользователь '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Резервный вход в систему как: '%(nickname)s', LDAP-сервер недоступен или пользователь не известен" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Не удалось войти: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Ошибка в имени пользователя или пароле" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Новый пароль был отправлен на ваш адрес электронной почты" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Неизвестная ошибка. Попробуйте позже." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Пожалуйста, введите действительное имя пользователя для сброса пароля" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "вы вошли как пользователь '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Профиль %(name)s's" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Профиль обновлён" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Этот адрес электронной почты уже зарегистрирован." @@ -1503,54 +1503,58 @@ msgstr "Этот адрес электронной почты уже зарег msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Отправить на Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Ошибка Ebook-конвертора: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ошибка Ebook-конвертора: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1559,11 +1563,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "изменить метаданные" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1601,7 +1601,7 @@ msgstr "Имя пользователя" msgid "Email" msgstr "Адрес электронной почты" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Отправить на Kindle Адрес электронной почты" @@ -1834,7 +1834,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Отмена" @@ -1886,7 +1886,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "уменьшить" @@ -1993,12 +1993,12 @@ msgid "Language" msgstr "Язык" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Да" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Нет" @@ -2162,7 +2162,7 @@ msgid "Enter " msgstr "Зарегистрироваться" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Вы действительно уверены?" @@ -2940,7 +2940,7 @@ msgstr "Ошибка" msgid "Upload done, processing, please wait..." msgstr "Загрузка завершена, обработка, пожалуйста, подождите..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Настройки" @@ -3077,7 +3077,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Книга" @@ -3086,36 +3086,76 @@ msgstr "Книга" msgid "Calibre-Web eBook Catalog" msgstr "Каталог электронных книг Caliber-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF reader" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Светлая" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Темная" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Назад" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Обновить размещение текста при открытии боковой панели." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Удалить" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Ожидание" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Вертикально" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Прочесть" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3317,11 +3357,11 @@ msgstr "Опубликовано от" msgid "Published Date To" msgstr "Опубликовано до" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3358,11 +3398,13 @@ msgstr "Рейтинг больше чем" msgid "Rating Below" msgstr "Рейтинг меньше чем" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3386,6 +3428,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Сделать книжную полку доступной для всех ?" @@ -3454,15 +3504,19 @@ msgstr "Прогресс" msgid "Run Time" msgstr "Время выполнения" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3470,6 +3524,10 @@ msgstr "" msgid "Reset user Password" msgstr "Сбросить пароль пользователя" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Показать книги на языках" diff --git a/cps/translations/sk/LC_MESSAGES/messages.mo b/cps/translations/sk/LC_MESSAGES/messages.mo index d18df97d..db4ef5c6 100644 Binary files a/cps/translations/sk/LC_MESSAGES/messages.mo and b/cps/translations/sk/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/sk/LC_MESSAGES/messages.po b/cps/translations/sk/LC_MESSAGES/messages.po index 73aec973..f167207f 100644 --- a/cps/translations/sk/LC_MESSAGES/messages.po +++ b/cps/translations/sk/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2023-11-01 06:12+0100\n" "Last-Translator: Branislav Hanáček \n" "Language: sk_SK\n" @@ -16,439 +16,439 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Štatistika" -#: cps/admin.py:150 +#: cps/admin.py:151 msgid "Server restarted, please reload page." msgstr "Server bol reštartovaný, znovu načítajte stránku." -#: cps/admin.py:152 +#: cps/admin.py:153 msgid "Performing Server shutdown, please close window." msgstr "Vypínam server, zavrite prosím okno." -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "Spojenie s databázovo bolo úspešne znovu naviazané" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Neznámy príkaz" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Úspech! Knihy boli zaradená do zálohovania metadát, skontrolujte si Úlohy na kontrolu" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Neznámy" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Stránka správcu" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Základná konfigurácia" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Konfigurácia používateľského rozhrania" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Upraviť používateľov" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Všetko" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Používateľ sa nenašiel" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "Zmazaných {} používateľov" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Zobraziť všetko" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Chybne vytvorená žiadosť" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Meno hosťa nie je možné zmeniť" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Hosť nemôže mať túto rolu" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Nezostáva žiadny správca, nie je možné odobrať rolu správcu" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Hodnota musí byť pravda alebo nepravda" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Neplatná rola" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Hosť nemôže mať toto zobrazenie" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Neplatné zobrazenie" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Nastavenie jazyka pre hosťa sa určí automaticky a nie je možné ho nastaviť" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Nebolo poskytnuté platné nastavenie jazyka" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Nebolo poskytnuté platné jazykové nastavenie pre knihu" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter sa nenašiel" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Neplatný stĺpec na čítanie" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Neplatný stĺpec na obmedzenie" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Konfigurácia Calibre-Web bola aktualizovaná" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Naozaj chcete zmazať Kobo-žetón?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Naozaj chcete zmazať túto doménu?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Naozaj chcete zmazať tohot používateľa?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Naozaj chcete zmazať túto poličku?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Naozaj chcete zmeniť nastavenia jazykov pre vybraných používateľov?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Naozaj chcete zmeniť viditeľné jazkyky pre knihy pre vybraných používateľov?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané role pre vybraných používateľov?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané obmedzenia pre vybraných používateľov?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Naozaj chcete zmeniť vybrané obmedzenia viditeľnosti pre vybraných používateľov?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Naozaj chcete zmeniť synchronizačné správanie sa police pre vybraných používateľov?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Naozaj chcete zmenit umiestnenie pre knižnicu Calibre?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calilbre-Web vyhľadá aktualizované obálky a aktualizuje ich náhľady, môže to chvíľu trvať?" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Naozaj chcete zmazať synchronizačnú databázu Calibre-Web aby ste vynútili úplnú synchronizáciu s vašou Kobo čítačkou?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Odmietnuť" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Povoliť" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "Zmazalo sa {} synchronizačných položiek" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Štítok sa nenašiel" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Neplatná akcia" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json nie je nakonfiguraovaný pre webovú aplikáciu" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie denníkového súboru je neplatné, zadajte prosím správnu cestu" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súbor denníka prístupov nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Zadajte prosím poskytovateľa LDAP, port, DN a identifikátor používateľa" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "Zadajte prosím konto a heslo pre LDAP službu" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "Zadajte prosím konto pre LDAP službu" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP objekt skupiny potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP objekt skupiny má nezhodu v zátvorkách" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP objekt používateľa potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP objekt používateľa má nezhodu v zátvorkách" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Filter pre LDAP členstvo používateľa potrebuje jeden \"%s\" formátový identifikátor" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Filter pre LDAP členstvo používateľa má nezhodu v zátvorkách" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA-certifikát, certifikát alebo umiestnenie kľúča nie je platné. Zadajte prosím správnu cestu" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Pridať nového používateľa" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Upraviť nastavenie pre poštový server" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Úspech! Gmail konto bolo verifikované." -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Chyba databázy: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testovací e-mail bol zaradený na odoslanie na %(email)s, skontrolujte si výsledok v sekcii Úlohy" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Pri odosielaní testovacieho e-mailu sa vyskytla chyba: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Prosím, najskôr si nastavte e-mailovú adresu..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "Nastavenia poštového servera boli aktualizované" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "Upraviť nastavenia naplánovaných úloh" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "Bol uvedený neplatný čas spustenia" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "Bol uvedený neplatný doba behu" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "Nastavenia naplánovaných úloh boli aktualizované" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Vyskytla sa neočakávaná chyba. Prosím, skúste to opäť neskôr." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "Nie je možné zapisovať do databázy nastavení" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Upraviť používateľa %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "Úspech! Heslo pre používateľa %(user)s bolo resetované" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "Nastavte prosím poštový server." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Prezerač denníkového súboru" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Žiadosť o aktualizačný balík" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Sťahuje sa aktualizačný balík" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Rozbaľuje sa aktualizačný balík" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Nahradzujú sa súbory" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Spojenia s databázou sú uzavreté" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Zastavuje sa server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Aktualizácia dokončená, stlačte prosím OK a znovu načítajte stránku" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Aktualizácia zlyhala:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP chyba" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Chyba spojenia" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Časový limit pre naviazanie spojenia vypršal" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Všeobecná chyba" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "Súbor aktualizácie nebolo možné uložiť do dočasného adresára" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "Nebolo možné nahradiť súbory počas aktualizácie" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "Extrakcia minimálne jedného LDAP používateľa zlyhala" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Vytvorenie minimálne jedného LDAP používateľa zlyhalo" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Chyba: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Chyba: Odpoveď LDAP servera neobsahuje žiadneho používateľa" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Minimálne jeden LDAP používateľ sa nenachádza v databáze" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "Používateľ bol naimportovaný" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie databáze nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "Do databázy nie je možné zapisovať" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súboru s kľúčmi nie je platné, zadajte prosím správnu cestu" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Umiestnenie súboru s certifikátmi nie je platné, zadajte prosím správnu cestu" @@ -464,7 +464,7 @@ msgstr "Nastavenia databáze boli aktualizované" msgid "Database Configuration" msgstr "Konfigurácia databázy" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Vyplňte prosím všetky polia." @@ -498,7 +498,7 @@ msgstr "Nie je možné zmazať používateľa Hosť" msgid "No admin user remaining, can't delete user" msgstr "Nezostáva žiadny používateľ, nie je možné odobrať rolu správcu" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "E-mailová adresa nemôže byť prázdna a musí byť platná" @@ -515,128 +515,128 @@ msgstr "nie je naištalované" msgid "Execution permissions missing" msgstr "Chýba právo na vykonanie" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Používateľom definovaný stĺpec č. %(column)d v Calibre databáze neexistuje" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Žiadne" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Vybraná kniha nie je dostupná. Súbor neexistuje alebo sa k nemu nedá pristupovať" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "Používateľ nemá práva nahrať obálku knihy" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifikátory nerozlišujú malé a veľké písmená, prepisuje sa starý identifikátor" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadáta boli úspešne aktualizované" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "Chyba pri úprave knihy: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Súbor %(file)s bol nahraný" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Chýba zdrojový alebo cieľový formát pre prevod" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Kniha bola úspešne zaradená na prevod do %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Vyskytla sa chyba pri prevode tejto knihy: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Nahrávaná kniha pravdepodobne existuje v knižnici, zvážte zmenu pred nahraním novej: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' nie je platný jazyk" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Prípona súboru '%(ext)s' nemôže byť nahraná na tento server" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Prípona súboru '%(ext)s' nemôže byť nahraná na tento server" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Súbor ktorý sa má nahrať musí mať príponu" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Súbor %(filename)s nebolo možné uložiť do dočasného adresára" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Zlyhal presun súboru obalky %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Kniha s formátom bola úspešne zmazaná" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Kniha bola úspešne zmazaná" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "Nemáte oprávnenia na mazanie kníh" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "upraviť metadáta" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s nie je platné číslo, preskakuje sa" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "Používateľ nemá práva na nahranie dodatočných súborových formátov" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Nebolo možné vytvoriť cestu %(path)s (Povolenie zamietnuté)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Zlyhalo uloženie súboru: %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Súborový formát %(ext)s bol pridaný k %(book)s" @@ -649,470 +649,470 @@ msgstr "Nastavenie Google Drive nie je dokončené, skúste deaktivovať a znovu msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Doména spätného volania nie je verifikovaná, prosím, vykonajte kroky na verifikáciu domény v konzole Google vývojára" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "Formát %(format)s sa nenašiel pre knihu s ID: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s sa nenašiel na Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s sa nenašiel: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "Poslať do čítačky" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "Tento e-mail bol odoslaný skrz Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "Testovací e-mail Calibre-Web" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "Testovací e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Začnite s aplikáciu Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "Registračný e-mail pre používateľa: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Previesť %(orig)s na %(format)s a odoslať do čítačky" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, python-format msgid "Send %(format)s to eReader" msgstr "Odoslať %(format)s do čítačky" -#: cps/helper.py:227 +#: cps/helper.py:230 #, python-format msgid "%(book)s send to eReader" msgstr "%(book)s odoslaná do čítačky" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Požadovaný súbor sa nedá čítať. Možne zlé oprávnenia?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "Status čítania nie je možné nastaviť: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Mazanie zložky pre knihu %(id)s zlyhalo, cesta má vnorené adresáre: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Mazanie knihy %(id)s zlyhalo: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Mazanie knihy %(id)s iba z databázy, cesta ku knihe v databáze nie je platná: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Premenovanie autora z: '%(src)s' na '%(dest)s' zlyhalo s chybou: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Súbor %(file)s sa nenašiel na Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Zmena názvu knihy z: '%(src)s' na '%(dest)s' zlyhalo s chybou: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Cesta ku knihe %(path)s sa nenašla na Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "Pre túto poštovú adresu sa našiel existujúci účet" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Toto meno používateľa sa už používa" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "Neplatný formát poštovej adresy" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "Heslo nedodržiava pravidlá validácie" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "Python modul 'advocate' nie je nainštalovaný ale je potrebný pre nahrávanie obálok kníh" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Chyba pri sťahovaní obálky knihy" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Chyba formátu obálky knihy" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "Nemáte povolené pristupovať na lokálneho hostiteľa alebo lokálnu sieť na pre nahrávanie obálok kníh" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Vytváranie cesty k obálke knihy zlyhalo" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Súbor obálky knihy nie je platný súbor s obrázkom alebo nie je uložený" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Ako súbor obálky knihy sú podporované iba súbory jpg/jpeg/png/webp/bmp" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "Neplatný obsah súboru obalky knihy" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Ako súbor obálky knihy sú podporované iba súbory jpg/jpeg" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "Obálka knihy" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "Binárny súbor pre UnRar sa nenašiel" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "Chyba pri spustení UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "Do databázy nie je možné zapisovať" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Chýba právo na vykonanie" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Chyba pri spustení UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "Zaradiť všetky knihy na zálohovanie metadát" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Prosím, pristupujte k Calibre-Web z nie lokálneho hostiteľa aby ste získali platný API koncový bod pre Kobo zariadenie" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Nastavenie Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Zaregistrovať s %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Úspech! Teraz ste prihlásený ako: %(nickname)s" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Spojenie na %(oauth)s bolo úspešné" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Prihlásenie zlyhalo, s OAuth účtom nie je spojený žiadny používateľ" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Odpojenie z %(oauth)s bolo úspešné" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Odpojenie z %(oauth)s zlyhalo" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Nie je pripojený k %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Prihlásenie na GitHub zlyhalo." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Získanie používateľa z GitHub-u zlyhalo." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Prihlásenie na Google zlyhalo." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Získanie používateľa z Google zlyhalo." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Chyba GitHub OAuth, skúste to prosím neskôr." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Chyba GitHub OAuth: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Chyba Google OAuth, skúste to prosím neskôr." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Chyba Google OAuth: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} Hviezdičiek" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Prihlásiť sa" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Žetón sa nenašiel" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Žetón expiroval" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Úspech! Vráťte sa k vašemu zariadeniu" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Knihy" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Zobraziť nedávno čítané knihy" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Horúce knihy" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Zobraziť horúce knihy" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Stiahnuté knihy" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Zobraziť stiahnuté knihy" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Najlepšie hodnotené knihy" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Zobraziť najlepšie hodnotené knihy" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Prečítané knihy" -#: cps/render_template.py:64 +#: cps/render_template.py:63 msgid "Show Read and Unread" msgstr "Zobraziť prečítané a neprečítané" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Neprečítané knihy" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Zobraziť neprečítané" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Objaviť" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Zobraziť náhodné knihy" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategórie" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 msgid "Show Category Section" msgstr "Zobraziť časť Kategórie" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Série" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 msgid "Show Series Section" msgstr "Zobraziť časť Série" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Autori" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 msgid "Show Author Section" msgstr "Zobraziť časť Autori" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Vydavatelia" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 msgid "Show Publisher Section" msgstr "Zobraziť časť vydavatelia" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Jazyky" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 msgid "Show Language Section" msgstr "Zobraziť časť Jazyky" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Hodnotenia" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 msgid "Show Ratings Section" msgstr "Zobraziť časť Hodnotenia" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Súborové formáty" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 msgid "Show File Formats Section" msgstr "Zobraziť časť Súborové formáty" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Archivované knihy" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 msgid "Show Archived Books" msgstr "Zobraziť archivované knihy" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Zoznam kníh" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Zobraziť zoznam kníh" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Hľadať" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Vydané po " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Vydané pred " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Hodnotenie <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Hodnotenie >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Status čítania = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "Chyba pri čítaní používateľom definovaných stĺpcov, reštartujte prosím Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Rozšírené hľadanie" @@ -1220,45 +1220,45 @@ msgstr "Verejná polica s názvom '%(title)s' už existuje." msgid "A private shelf with the name '%(title)s' already exists." msgstr "Súkromná polica s názvom '%(title)s' už existuje." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Polica: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Chyba pri otváraní police. Polica neexistuje alebo je neprístupná" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Úlohy" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Čakajúca" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Neúspešná" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Spustená" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Hotová" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Ukončená" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Zrušená" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Neznámy stav" @@ -1291,170 +1291,170 @@ msgstr "Je dostupná nová aktualizácia. Kliknite na tlačidlo dolu, ak chcete msgid "No release information available" msgstr "Nie je dostupná informácia o vydaní" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Objaviť (Náhodné knihy)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Horúce knihy (Najviac sťahované)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Knihy stiahnuté: %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Author: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Vydavateľ: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Série: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Hodnotenie: Žiadne" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Hodnotenie: %(rating)s hviezdičiek" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Súborový formát: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategória: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Jazyk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Stiahnutia" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Zoznam hodnotení" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Zoznam súborových formátov" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "Najskôr nastavte poštový server, prosím..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Úspech! Kniha bola zaradená na odoslanie do %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Vyskytla sa chyba pri posielaní knihy: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Nastavte vo vašom profile platnú e-mailovú adresu pre vašu čítačku." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "Počkajte, prosím minútku pred registráciou ďalšieho používateľa" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrovať" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "Poštový server nie je nastavený, kontaktujte prosím správcu." -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "Poštový server nie je nastavený, kontaktujte prosím správcu." -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Vaša e-mailová adresa nie je povolená." -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Úspech! Potvrdzujúci e-mail bol odoslaný." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "Nie je možné aktivovať LDAP autentifikáciu" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "Počkajte, prosím minútku pred opätovným prihlásením" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "ste prihlásený ako: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "Záložné prihlásenie ako: '%(nickname)s', LDAP server je nedostupný alebo používateľ je neznámy" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "Nemôžem prihlásiť: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 msgid "Wrong Username or Password" msgstr "Nesprávne používateľské meno alebo heslo" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "Na vašu e-mailovú adresu bolo odoslané nové heslo" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "Vyskytla sa neočakávaná chyba. Prosím, skúste to opäť neskôr." -#: cps/web.py:1429 +#: cps/web.py:1430 msgid "Please enter valid username to reset password" msgstr "Na resetovanie hesla zadajte platné používateľské meno" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Teraz ste prihlásený ako: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Profil pre %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 msgid "Success! Profile Updated" msgstr "Úspech! Profil bol aktualizovaný" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Účet s touto e-mailovou adresou už existuje." @@ -1462,54 +1462,58 @@ msgstr "Účet s touto e-mailovou adresou už existuje." msgid "Found no valid gmail.json file with OAuth information" msgstr "Nenašiel sa súbor gmail.json s OAuth informáciou" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s bol odoslaný do čítačky" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Nástroj pre prevod ebook-convert %(tool)s sa nenašiel" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "Formát %(format)s sa nenachádza na disku" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "Prevádzač e-kníh zlyhal s neznámou chybou" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Prevádzač Kepubify zlyhal: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Prevádzaný súbor sa nenašiel alebo viac ako jeden súbor v zložke %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "Prevádzač e-kníh zlyhal: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre zlyhal s chybou: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Prevádzač e-kníh zlyhal: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "Previesť" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "Spojenie s databázou sa znovu naväzuje" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "E-mail" @@ -1517,11 +1521,7 @@ msgstr "E-mail" msgid "Backing up Metadata" msgstr "Zálohovať metadáta" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "Bolo vygenerovaných %(count)s náhľadov obálok kníh" @@ -1559,7 +1559,7 @@ msgstr "Meno používateľa" msgid "Email" msgstr "E-mail" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "Poslať na e-mail čítačky" @@ -1790,7 +1790,7 @@ msgstr "V poriadku" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Zrušiť" @@ -1842,7 +1842,7 @@ msgstr "Triediť podľa dátumu vydania, najstaršie najskôr" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "znížiť" @@ -1949,12 +1949,12 @@ msgid "Language" msgstr "Jazyk" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Áno" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nie" @@ -2115,7 +2115,7 @@ msgid "Enter " msgstr "Zadať " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Naozaj to chcete?" @@ -2885,7 +2885,7 @@ msgstr "Chyba" msgid "Upload done, processing, please wait..." msgstr "Nahrávanie ukončené, spracováva sa, počkajte prosím..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Nastavenia" @@ -3022,7 +3022,7 @@ msgstr "Rodičovský adresár" msgid "Select" msgstr "Vybrať" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3030,34 +3030,75 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Katalóg e-kníh Calibre-Web" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "čítačka epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Svetlé" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Tmavé" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "Sépia" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "Čierne" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Preformátovať text keď sú otvorené bočné panely." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "Veľkosť písma" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Zmazať" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Čakajúca" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertikálne" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Čítať" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Neplatný stĺpec na čítanie" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Čítačka komiksov" @@ -3254,11 +3295,11 @@ msgstr "Dátum vydania od" msgid "Published Date To" msgstr "Dátum vydania do" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3294,11 +3335,13 @@ msgstr "Hodnotenie lepšie ako" msgid "Rating Below" msgstr "Hodnotenie horšie ako" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Od:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Do:" @@ -3322,6 +3365,16 @@ msgstr "Znemožniť zmenu poradia" msgid "Enable Change order" msgstr "Povoloť zmenu poradia" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Triediť podľa dátumu knihy, najnovšie najskôr" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Triediť podľa dátumu knihy, najstaršie najskôr" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Zdieľať s kýmkoľvek" @@ -3390,15 +3443,20 @@ msgstr "Pokrok" msgid "Run Time" msgstr "Čas spustenia" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Zlúčiť" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Akcie" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "Táto úloha bude zrušená. Akýkoľvek pokrok vykonaný v tejto úlohe bude uložený." -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "Ak je toto naplánovaná úloha, bude znovu spustená v najbližšom naplánovanom čase." @@ -3406,6 +3464,10 @@ msgstr "Ak je toto naplánovaná úloha, bude znovu spustená v najbližšom nap msgid "Reset user Password" msgstr "Resetovať heslo používateľa" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Jazyk kníh" diff --git a/cps/translations/sv/LC_MESSAGES/messages.mo b/cps/translations/sv/LC_MESSAGES/messages.mo index fc794289..71e0e169 100644 Binary files a/cps/translations/sv/LC_MESSAGES/messages.mo and b/cps/translations/sv/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/sv/LC_MESSAGES/messages.po b/cps/translations/sv/LC_MESSAGES/messages.po index 885adce7..077743bf 100644 --- a/cps/translations/sv/LC_MESSAGES/messages.po +++ b/cps/translations/sv/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2021-05-13 11:00+0000\n" "Last-Translator: Jonatan Nyberg \n" "Language: sv\n" @@ -16,449 +16,449 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Statistik" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Server startas om, vänligen uppdatera sidan" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Stänger servern, vänligen stäng fönstret" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Okänt kommando" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "Testa e-post i kö för att skicka till %(email)s, vänligen kontrollera Uppgifter för resultat" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Okänd" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Administrationssida" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Grundläggande konfiguration" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Användargränssnitt konfiguration" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Redigera användare" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Alla" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Användaren hittades inte" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} användare har tagits bort" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Visa alla" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Felaktig begäran" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Gästnamn kan inte ändras" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Gäst kan inte ha den här rollen" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Ingen administratörsanvändare kvar, kan inte ta bort administratörsrollen" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Värdet måste vara sant eller falskt" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Ogiltig roll" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Gästen kan inte ha den här vyn" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "Ogiltig vy" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Gästens språk bestäms automatiskt och kan inte ställas in" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Inget giltigt språk anges" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Inget giltigt bokspråk anges" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Parameter hittades inte" -#: cps/admin.py:572 +#: cps/admin.py:573 #, fuzzy msgid "Invalid Read Column" msgstr "Ogiltig roll" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web konfiguration uppdaterad" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Vill du verkligen ta bort Kobo-token?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Vill du verkligen ta bort den här domänen?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Vill du verkligen ta bort den här användaren?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Är du säker på att du vill ta bort hyllan?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Är du säker på att du vill ändra språk för valda användare?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Är du säker på att du vill ändra synliga bokspråk för valda användare?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Är du säker på att du vill ändra den valda rollen för de valda användarna?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Är du säker på att du vill ändra de valda begränsningarna för de valda användarna?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Är du säker på att du vill ändra de valda synlighetsbegränsningarna för de valda användarna?" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Är du säker på att du vill ändra den valda rollen för de valda användarna?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Är du säker på att du vill stoppa Calibre-Web?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Förneka" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Tillåt" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Taggen hittades inte" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Ogiltig åtgärd" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json är inte konfigurerad för webbapplikation" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Loggfilens plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "Åtkomstloggplatsens plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "Vänligen ange en LDAP-leverantör, port, DN och användarobjektidentifierare" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Ange giltigt användarnamn för att återställa lösenordet" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP-gruppobjektfilter måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP-gruppobjektfilter har omatchande parentes" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP-användarobjektfilter måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP-användarobjektfilter har omatchad parentes" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "Användarfilter för LDAP-medlemmar måste ha en \"%s\"-formatidentifierare" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "Användarfilter för LDAP-medlemmar har omatchad parentes" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP-certifikat, certifikat eller nyckelplats är inte giltigt, vänligen ange rätt sökväg" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Lägg till ny användare" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Ändra SMTP-inställningar" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Databasfel: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "Testa e-post i kö för att skicka till %(email)s, vänligen kontrollera Uppgifter för resultat" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Det gick inte att skicka Testmeddelandet: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Vänligen konfigurera din e-postadress först..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "E-postserverinställningar uppdaterade" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Redigera användaren %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "Lösenord för användaren %(user)s återställd" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Konfigurera SMTP-postinställningarna först..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Visaren för loggfil" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Begär uppdateringspaketet" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Hämtar uppdateringspaketet" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Packar upp uppdateringspaketet" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Ersätta filer" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Databasanslutningarna är stängda" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Stoppar server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Uppdateringen misslyckades:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP-fel" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Anslutningsfel" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Tiden ute när du etablerade anslutning" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Allmänt fel" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "Uppdateringsfilen kunde inte sparas i Temp Dir" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 #, fuzzy msgid "Failed to extract at least One LDAP User" msgstr "Det gick inte att skapa minst en LDAP-användare" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "Det gick inte att skapa minst en LDAP-användare" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "Fel: %(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "Fel: Ingen användare återges som svar på LDAP-servern" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "Minst en LDAP-användare hittades inte i databasen" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} användare har importerats" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "DB-plats är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "DB är inte skrivbar" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "Keyfile-platsen är inte giltig, vänligen ange rätt sökväg" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "Certfile-platsen är inte giltig, vänligen ange rätt sökväg" @@ -476,7 +476,7 @@ msgstr "E-postserverinställningar uppdaterade" msgid "Database Configuration" msgstr "Funktion konfiguration" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Fyll i alla fält!" @@ -510,7 +510,7 @@ msgstr "Det går inte att ta bort gästanvändaren" msgid "No admin user remaining, can't delete user" msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -527,128 +527,128 @@ msgstr "inte installerad" msgid "Execution permissions missing" msgstr "Körningstillstånd saknas" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "Anpassad kolumn n.%(column)d finns inte i calibre-databasen" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ingen" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Hoppsan! Vald boktitel är inte tillgänglig. Filen finns inte eller är inte tillgänglig" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "Identifierare är inte skiftlägeskänsliga, skriver över gammal identifierare" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata uppdaterades" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "Filen %(file)s uppladdad" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Källa eller målformat för konvertering saknas" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "Boken är i kö för konvertering till %(book_format)s" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Det gick inte att konvertera den här boken: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Uppladdad bok finns förmodligen i biblioteket, överväg att ändra innan du laddar upp nya: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s är inte ett giltigt språk" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Filen som ska laddas upp måste ha en ändelse" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "Filen %(filename)s kunde inte sparas i temp dir" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "Det gick inte att flytta omslagsfil %(file)s: %(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "Bokformat har tagits bort" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "Boken har tagits bort" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "redigera metadata" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Det gick inte att lagra filen %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "Filformatet %(ext)s lades till %(book)s" @@ -661,487 +661,487 @@ msgstr "Installationen av Google Drive är inte klar, försök att inaktivera oc msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Återuppringningsdomänen är inte verifierad, följ stegen för att verifiera domänen i Google utvecklarkonsol" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(format)s formatet hittades inte för bok-id: %(book)d" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(format)s hittades inte på Google Drive: %(fn)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s hittades inte: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Skicka till Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Detta e-postmeddelande har skickats via Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web test e-post" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Test e-post" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Kom igång med Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Registrera e-post för användare: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Konvertera %(orig)s till %(format)s och skicka till Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Skicka %(format)s till Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Skicka till Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "Den begärda filen kunde inte läsas. Kanske fel behörigheter?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Borttagning av bokmapp för boken %(id)s misslyckades, sökvägen har undermappar: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Borttagning av boken %(id)s misslyckades: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, fuzzy, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "Borttagning av boken %(id)s, boksökväg inte giltig: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Filen %(file)s hittades inte på Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Boksökvägen %(path)s hittades inte på Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Detta användarnamn är redan taget" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Ogiltigt e-postadressformat" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Fel vid hämtning av omslaget" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Fel på omslagsformat" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Det gick inte att skapa sökväg för omslag" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "Omslagsfilen är inte en giltig bildfil eller kunde inte lagras" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "Endast jpg/jpeg/png/webp/bmp-filer stöds som omslagsfil" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "Endast jpg/jpeg-filer stöds som omslagsfil" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Upptäck" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "UnRar binär fil hittades inte" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "Fel vid körning av UnRar" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "DB är inte skrivbar" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "Körningstillstånd saknas" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "Fel vid körning av UnRar" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "Vänligen få tillgång till calibre-web från icke localhost för att få giltig api_endpoint för Kobo-enhet" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo-installation" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "Registrera dig med %(provider)s" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "du är nu inloggad som: \"%(nickname)s\"" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "Länk till %(oauth)s lyckades" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "Inloggningen misslyckades, ingen användare kopplad till OAuth-konto" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "Sluta länka till %(oauth)s lyckades" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "Sluta länka till %(oauth)s misslyckades" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "Inte länkad till %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Det gick inte att logga in med GitHub." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Det gick inte att hämta användarinformation från GitHub." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Det gick inte att logga in med Google." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Det gick inte att hämta användarinformation från Google." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth-fel, försök igen senare." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub Oauth-fel: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth-fel, försök igen senare." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth-fel: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} stjärnor" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Logga in" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token hittades inte" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token har löpt ut" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Lyckades! Vänligen återvänd till din enhet" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Böcker" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Visa senaste böcker" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Heta böcker" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Visa heta böcker" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Hämtade böcker" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Visa hämtade böcker" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Bäst rankade böcker" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Visa böcker med bästa betyg" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Lästa böcker" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Visa lästa och olästa" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Olästa böcker" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Visa olästa" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Upptäck" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Visa slumpmässiga böcker" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategorier" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Visa kategorival" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Serier" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Visa serieval" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Författare" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Visa författarval" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Förlag" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Visa urval av förlag" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Språk" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Visa språkval" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Betyg" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Visa val av betyg" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Filformat" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Visa val av filformat" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Arkiverade böcker" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Visa arkiverade böcker" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Boklista" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Visa boklista" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Sök" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Publicerad efter " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Publicerad före " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Betyg <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Betyg >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Lässtatus = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Avancerad sökning" @@ -1252,45 +1252,45 @@ msgstr "En offentlig hylla med namnet \"%(title)s\" finns redan." msgid "A private shelf with the name '%(title)s' already exists." msgstr "En privat hylla med namnet \"%(title)s\" finns redan." -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Hylla: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Uppgifter" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Väntar" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Misslyckades" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Startad" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Klar" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Okänd status" @@ -1323,178 +1323,178 @@ msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att up msgid "No release information available" msgstr "Ingen versionsinformation tillgänglig" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Upptäck (slumpmässiga böcker)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Heta böcker (mest hämtade)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "Hämtade böcker av %(user)s" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Författare: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Förlag: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Serier: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Betyg: %(rating)s stars" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Filformat: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Språk: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Hämtningar" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Betygslista" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Lista över filformat" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Konfigurera SMTP-postinställningarna först..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "Boken är i kö för att skicka till %(eReadermail)s" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Det gick inte att skicka den här boken: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "Konfigurera din kindle-e-postadress först..." -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Registrera" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-postservern är inte konfigurerad, kontakta din administratör!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Din e-post är inte tillåten att registrera" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Bekräftelsemail skickades till ditt e-postkonto." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "Det går inte att aktivera LDAP-autentisering" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Det gick inte att logga in: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Fel användarnamn eller lösenord" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Nytt lösenord skickades till din e-postadress" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Ett okänt fel uppstod. Försök igen senare." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Ange giltigt användarnamn för att återställa lösenordet" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "du är nu inloggad som: \"%(nickname)s\"" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)ss profil" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profilen uppdaterad" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Hittade ett befintligt konto för den här e-postadressen" @@ -1502,54 +1502,58 @@ msgstr "Hittade ett befintligt konto för den här e-postadressen" msgid "Found no valid gmail.json file with OAuth information" msgstr "Hittade ingen giltig gmail.json-fil med OAuth-information" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Skicka till Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "calibre e-bokkonverterings %(tool)s hittades inte" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "%(format)s-format hittades inte på disken" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "E-bokkonverteraren misslyckades med okänt fel" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify-konverteraren misslyckades: %(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "Konverterad fil hittades inte eller mer än en fil i mappen %(folder)s" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "E-bokkonverteraren misslyckades: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "calibre misslyckades med fel: %(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "E-bokkonverteraren misslyckades: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1558,11 +1562,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "redigera metadata" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1600,7 +1600,7 @@ msgstr "Smeknamn" msgid "Email" msgstr "E-post" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle" @@ -1834,7 +1834,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Avbryt" @@ -1886,7 +1886,7 @@ msgstr "Sortera efter publiceringsdatum, äldsta först" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "minska" @@ -1993,12 +1993,12 @@ msgid "Language" msgstr "Språk" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Ja" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Nej" @@ -2162,7 +2162,7 @@ msgid "Enter " msgstr "Identifierare" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Är du verkligen säker?" @@ -2942,7 +2942,7 @@ msgstr "Fel" msgid "Upload done, processing, please wait..." msgstr "Uppladdning klar, bearbetning, vänligen vänta ..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Inställningar" @@ -3079,7 +3079,7 @@ msgstr "Föräldramapp" msgid "Select" msgstr "Välj" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3087,36 +3087,77 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "Calibre-Web e-bokkatalog" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF-läsare" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Ljust" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Mörkt" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Tillbaka" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Fyll i texten igen när sidofält är öppna." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Ta bort" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Väntar" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Vertikal" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Läst" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Ogiltig roll" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3318,11 +3359,11 @@ msgstr "Publiceringsdatum från" msgid "Published Date To" msgstr "Publiceringsdatum till" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3358,11 +3399,13 @@ msgstr "Betyg större än" msgid "Rating Below" msgstr "Betyg mindre än" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3386,6 +3429,16 @@ msgstr "Inaktivera ändring av ordning" msgid "Enable Change order" msgstr "Aktivera ändring av ordning" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "Sortera efter bokdatum, nyast först" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "Sortera efter bokdatum, äldsta först" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Dela med alla" @@ -3454,15 +3507,20 @@ msgstr "Förlopp" msgid "Run Time" msgstr "Drifttid" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Slå samman" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3470,6 +3528,10 @@ msgstr "" msgid "Reset user Password" msgstr "Återställ användarlösenordet" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Visa böcker med språk" diff --git a/cps/translations/tr/LC_MESSAGES/messages.mo b/cps/translations/tr/LC_MESSAGES/messages.mo index 97cc6264..fc451c87 100644 Binary files a/cps/translations/tr/LC_MESSAGES/messages.mo and b/cps/translations/tr/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/tr/LC_MESSAGES/messages.po b/cps/translations/tr/LC_MESSAGES/messages.po index f93f6d18..98d781df 100644 --- a/cps/translations/tr/LC_MESSAGES/messages.po +++ b/cps/translations/tr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-04-23 22:47+0300\n" "Last-Translator: iz \n" "Language: tr\n" @@ -16,445 +16,445 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "İstatistikler" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Sunucu yeniden başlatıldı, lütfen sayfayı yeniden yükleyin" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Sunucu kapatıyor, lütfen pencereyi kapatın" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "%(eReadermail)s'a gönderilmek üzere başarıyla sıraya alındı" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Bilinmeyen" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Yönetim sayfası" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Temel Ayarlar" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Arayüz Ayarları" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tümü" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web yapılandırması güncellendi" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 #, fuzzy msgid "Please Enter a LDAP Service Account and Password" msgstr "Şifrenizi sıfırlayabilmek için lütfen geçerli bir kullanıcı adı giriniz" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "Deneme e-postası gönderilirken bir hata oluştu: %(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "Lütfen önce e-posta adresinizi ayarlayın..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "E-posta sunucusu ayarları güncellendi" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "%(nick)s kullanıcısını düzenle" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "%(user)s kullanıcısının şifresi sıfırlandı" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Lütfen önce SMTP e-posta ayarlarını ayarlayın..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "Log dosyası görüntüleyici" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Güncelleme paketi isteniyor" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Güncelleme paketi indiriliyor" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Güncelleme paketi ayıklanıyor" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Dosyalar değiştiriliyor" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Veritabanı bağlantıları kapalı" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Sunucu durduruyor" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Güncelleme tamamlandı, sayfayı yenilemek için lütfen Tamam'a tıklayınız" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Güncelleme başarısız:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP Hatası" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Bağlantı hatası" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "Bağlantı kurulmaya çalışırken zaman aşımına uğradı" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Genel hata" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "%(filename)s dosyası geçici dizine kaydedilemedi" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -472,7 +472,7 @@ msgstr "E-posta sunucusu ayarları güncellendi" msgid "Database Configuration" msgstr "Özellik Yapılandırması" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Lütfen tüm alanları doldurun!" @@ -507,7 +507,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "Başka yönetici kullanıcı olmadığından silinemedi" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -524,128 +524,128 @@ msgstr "yüklü değil" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Hiçbiri" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metaveri başarıyla güncellendi" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "%(file)s dosyası yüklendi" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Dönüştürme için kaynak ya da hedef biçimi eksik" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "eKitap %(book_format)s formatlarına dönüştürülmek üzere başarıyla sıraya alındı" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Bu eKitabı dönüştürürken bir hata oluştu: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "Yüklenen eKitap muhtemelen kitaplıkta zaten var. Yenisini yüklemeden değiştirmeyi düşünün: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s geçerli bir dil değil" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "'%(ext)s' uzantılı dosyaların bu sunucuya yüklenmesine izin verilmiyor" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "'%(ext)s' uzantılı dosyaların bu sunucuya yüklenmesine izin verilmiyor" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Yüklenecek dosyanın mutlaka bir uzantısı olması gerekli" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "%(filename)s dosyası geçici dizine kaydedilemedi" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "metaveri düzenle" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "%(path)s dizini oluşturulamadı. (İzin reddedildi)" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "%(file)s dosyası kaydedilemedi." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "%(book)s kitabına %(ext)s dosya biçimi eklendi" @@ -658,482 +658,482 @@ msgstr "Google Drive kurulumu tamamlanmadı, Google Drive'ı devre dışı bıra msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Geri yönlendirme alanı (callback domain) doğrulanamadı, lütfen Google geliştirici konsolunda alan adını doğrulamak için gerekli adımları izleyin." -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "%(book)d nolu kitap için %(format)s biçimi bulunamadı" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "%(fn)s eKitabı için %(format)s biçimi Google Drive'da bulunamadı" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s bulunamadı: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Kindle'a gönder" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "Bu e-Posta Calibre-Web ile gönderilmiştir." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web deneme e-Postası" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Deneme e-Postası" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Calibre-Web'i Kullanmaya Başlayın" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Kullanıcı Kayıt e-Postası: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "%(orig)s'dan %(format)s biçimine çevir ve Kindle'a gönder" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "%(format)s biçimlerini Kindle'a gönder" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Kindle'a gönder" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "İstenilen dosya okunamadı. Yanlış izinlerden kaynaklanabilir?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Kitap adını değiştirme sırasında hata oluştu ('%(src)s' → '%(dest)s'): %(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "%(file)s dosyası Google Drive'da bulunamadı" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "Kitap adını değiştirme sırasında hata oluştu ('%(src)s' → '%(dest)s'): %(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "eKitap yolu %(path)s Google Drive'da bulunamadı" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Bu kullanıcı adı zaten alındı" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Keşfet" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "%(provider)s ile Kaydol" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "giriş yaptınız: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "GitHub ile giriş yapılamadı." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Github'dan kullanıcı bilgileri alınamadı." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Google ile giriş yapılamadı." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Google'dan kullanıcı bilgileri alınamadı." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth hatası, lütfen tekrar deneyin." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth hatası, lütfen tekrar deneyin." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Giriş" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Token bulunamadı" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token süresi doldu" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Başarılı! Lütfen cihazınıza dönün" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "eKitaplar" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Son eKitapları göster" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Popüler" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Okunanlar" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Okunan ve okunmayanları göster" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Okunmamışlar" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Okunmamışları göster" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Keşfet" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Rastgele Kitap Göster" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Kategoriler" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Kategori seçimini göster" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Seriler" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Seri seçimini göster" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Yazarlar" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Yazar seçimini göster" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Yayıncılar" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Yayıncı seçimini göster" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Diller" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Dil seçimini göster" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Değerlendirmeler" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Değerlendirme seçimini göster" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Biçimler" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Dosya biçimi seçimini göster" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Son eKitapları göster" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Ara" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Yayınlanma (sonra)" -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Yayınlanma (önce)" -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Değerlendirme <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Değerlendirme >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Gelişmiş Arama" @@ -1244,45 +1244,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Kitaplık: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Kitaplık açılırken hata oluştu. Kitaplık mevcut değil ya da erişilebilir değil" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Görevler" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Bekleniyor" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Başarısız" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Başladı" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Bitti" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Bilinmeyen Durum" @@ -1315,177 +1315,177 @@ msgstr "Yeni bir güncelleme mevcut. Son sürüme güncellemek için aşağıdak msgid "No release information available" msgstr "Sürüm bilgisi mevcut değil" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Keşfet (Rastgele)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "Yazar: %(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Yayınevi: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Seri: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Değerlendirme: %(rating)s yıldız" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Biçim: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Kategori: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Dil: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Değerlendirme listesi" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Biçim listesi" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Lütfen önce SMTP e-posta ayarlarını ayarlayın..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "%(eReadermail)s'a gönderilmek üzere başarıyla sıraya alındı" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Kayıt ol" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "E-Posta sunucusu ayarlanmadı, lütfen yöneticinizle iletişime geçin!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "E-posta adresinizle kaydolunmasına izin verilmiyor" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "Onay e-Postası hesabınıza gönderildi." -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "LDAP Kimlik Doğrulaması etkinleştirilemiyor" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "giriş yaptınız: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Yanlış Kullanıcı adı ya da Şifre" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Yeni şifre e-Posta adresinize gönderildi" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Şifrenizi sıfırlayabilmek için lütfen geçerli bir kullanıcı adı giriniz" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "giriş yaptınız: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s Profili" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Profil güncellendi" -#: cps/web.py:1515 +#: cps/web.py:1523 #, fuzzy msgid "Oops! An account already exists for this Email." msgstr "Bu e-posta adresi için bir hesap mevcut." @@ -1494,54 +1494,58 @@ msgstr "Bu e-posta adresi için bir hesap mevcut." msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Kindle'a gönder" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "eKitap-Dönüştürücü hatası: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "eKitap-Dönüştürücü hatası: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1550,11 +1554,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "metaveri düzenle" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1592,7 +1592,7 @@ msgstr "Kullanıcı adı" msgid "Email" msgstr "" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "E-Posta adresiniz" @@ -1825,7 +1825,7 @@ msgstr "" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" @@ -1877,7 +1877,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "azalt" @@ -1984,12 +1984,12 @@ msgid "Language" msgstr "Dil" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Evet" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Hayır" @@ -2153,7 +2153,7 @@ msgid "Enter " msgstr "Kayıt ol" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Emin misiniz?" @@ -2927,7 +2927,7 @@ msgstr "Hata" msgid "Upload done, processing, please wait..." msgstr "Yükleme tamamlandı, işleniyor, lütfen bekleyin..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Ayarlar" @@ -3064,7 +3064,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Kitap" @@ -3073,36 +3073,76 @@ msgstr "Kitap" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 #, fuzzy msgid "epub Reader" msgstr "PDF Okuyucu" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Açık" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Koyu" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Geri" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Kenar çubukları açıkken metni kaydır" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Sil" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Bekleniyor" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Dikey" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Okudum" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 #, fuzzy msgid "Comic Reader" @@ -3304,11 +3344,11 @@ msgstr "" msgid "Published Date To" msgstr "" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3345,11 +3385,13 @@ msgstr "" msgid "Rating Below" msgstr "" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3373,6 +3415,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "" @@ -3441,15 +3491,19 @@ msgstr "İlerleme" msgid "Run Time" msgstr "" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3457,6 +3511,10 @@ msgstr "" msgid "Reset user Password" msgstr "Kullanıcı şifresini sıfırla" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "" diff --git a/cps/translations/uk/LC_MESSAGES/messages.mo b/cps/translations/uk/LC_MESSAGES/messages.mo index 4b76e65c..e7ee176d 100644 Binary files a/cps/translations/uk/LC_MESSAGES/messages.mo and b/cps/translations/uk/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/uk/LC_MESSAGES/messages.po b/cps/translations/uk/LC_MESSAGES/messages.po index bbce3961..8d83ba7e 100644 --- a/cps/translations/uk/LC_MESSAGES/messages.po +++ b/cps/translations/uk/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n" "Last-Translator: ABIS Team \n" "Language: uk\n" @@ -15,447 +15,447 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Статистика" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Сервер перезавантажено, будь-ласка, перезавантажте сторінку" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Виконується зупинка серверу, будь-ласка, закрийте вікно" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Невідома команда" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Невідомий" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Сторінка адміністратора" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Конфігурація інтерфейсу" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 #, fuzzy msgid "Edit Users" msgstr "Керування сервером" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Всі" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Користувача не знайдено" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} користувачі видалені успішно" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Показати всі" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Не правильна роль" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Ви справді хочете видалити книжкову полицю?" -#: cps/admin.py:618 +#: cps/admin.py:619 #, fuzzy msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Ви справді хочете видалити книжкову полицю?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 #, fuzzy msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Ви справді хочете видалити книжкову полицю?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 #, fuzzy msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Ви справді хочете видалити книжкову полицю?" -#: cps/admin.py:631 +#: cps/admin.py:632 #, fuzzy msgid "Are you sure you want to change Calibre library location?" msgstr "Ви справді хочете видалити книжкову полицю?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Заборонити" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Дозволити" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Тег не знайдено" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "Змінити налаштування SMTP" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Змінити користувача %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "Перевірка оновлень" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "Завантаження оновлень" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Розпакування оновлення" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "Заміна файлів" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "З'єднання з базою даних закрите" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Сервер зупиняється" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Оновлення встановлені, натисніть ok і перезавантажте сторінку" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Оновлення неуспішне:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP помилка" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Помилка зʼєднання" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Помилка" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -473,7 +473,7 @@ msgstr "З'єднання з базою даних закрите" msgid "Database Configuration" msgstr "Особливі налаштування" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Будь-ласка, заповніть всі поля!" @@ -507,7 +507,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -524,127 +524,127 @@ msgstr "не встановлено" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "Ні" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "Неможливо відкрити книгу. Файл не існує або немає доступу." -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "Завантажувальний файл повинен мати розширення" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "змінити метадані" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" @@ -657,479 +657,479 @@ msgstr "" msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "Домен зворотнього зв'язку не підтверджено. Виконайте дії для підтвердження домену, будь-ласка" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Відправити на Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Надіслати %(format)s до E-Reader" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "Відправити на Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Огляд" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "Ви увійшли як користувач: '%(nickname)s'" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} зірок" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Ім'я користувача" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Токен не знайдено" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Час дії токено вичерпано" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Вдалося! Будь-ласка, поверніться до вашого пристрою" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Книжки" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Показувати останні книги" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Популярні книги" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Показувати популярні книги" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Книги з найкращим рейтингом" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Показувати книги з найвищим рейтингом" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Прочитані книги" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Показувати прочитані та непрочитані книги" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Непрочитані книги" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Показати не прочитані" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Огляд" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Показувати випадкові книги" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Категорії" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Показувати вибір категорії" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Серії" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Показувати вибір серії" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Автори" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Показувати вибір автора" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Видавництва" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Показувати вибір серії" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Мови" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Показувати вибір мови" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Рейтинги" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Показувати вибір серії" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Формати файлів" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Показувати вибір серії" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Архівні книжки" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Архівні книжки" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Список книжок" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Пошук" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Опубліковані після " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Опубліковано до " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Рейтинг <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Рейтинг >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Розширений пошук" @@ -1239,45 +1239,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжкова полиця: '%(name)s'" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "Помилка при відкриванні полиці. Полиця не існує або до неї відсутній доступ" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Завдання" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Очікує" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Розпочато" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Завершено" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "Закінчено" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "Відмінено" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Невідомий статус" @@ -1310,173 +1310,173 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "Огляд (випадкові книги)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "Популярні книги (найбільш завантажувані)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "Видавництво: %(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "Серії: %(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "Рейтинг: Відсутній" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "Рейтинг: %(rating)s зірок" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "Формат файлу: %(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "Категорія: %(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "Мова: %(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Завантаження" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Список рейтингів" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Список форматів файлу" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "Будь-ласка, спочатку сконфігуруйте параметри SMTP" -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "Помилка при відправці книги: %(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Зареєструватись" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "Ви увійшли як користувач: '%(nickname)s'" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Помилка в імені користувача або паролі" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "Ви увійшли як користувач: '%(nickname)s'" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "Профіль %(name)s" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Профіль оновлено" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1484,54 +1484,58 @@ msgstr "" msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "Відправити на Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1540,11 +1544,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "змінити метадані" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1582,7 +1582,7 @@ msgstr "Ім'я користувача" msgid "Email" msgstr "" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle" @@ -1815,7 +1815,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Скасувати" @@ -1867,7 +1867,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "" @@ -1974,12 +1974,12 @@ msgid "Language" msgstr "Мова" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Так" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Ні" @@ -2142,7 +2142,7 @@ msgid "Enter " msgstr "Зареєструватись" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "" @@ -2915,7 +2915,7 @@ msgstr "Помилка" msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Налаштування" @@ -3052,7 +3052,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 #, fuzzy msgid "Ok" msgstr "Книга" @@ -3061,35 +3061,75 @@ msgstr "Книга" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Назад" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "Переформатувати текст, коли відкриті бічні панелі." -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Видалити" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Очікує" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Вертикально" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Прочитано" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "" @@ -3288,11 +3328,11 @@ msgstr "Дата публікації з" msgid "Published Date To" msgstr "Дата публікації до" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3329,11 +3369,13 @@ msgstr "" msgid "Rating Below" msgstr "" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Від:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "До:" @@ -3357,6 +3399,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "зробити книжкову полицю доступною для всіх?" @@ -3425,15 +3475,20 @@ msgstr "Прогрес" msgid "Run Time" msgstr "Тривалість" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Обʼєднати" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "Дії" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3441,6 +3496,10 @@ msgstr "" msgid "Reset user Password" msgstr "Скинути пароль користувача" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Показувати книги на мовах" diff --git a/cps/translations/vi/LC_MESSAGES/messages.mo b/cps/translations/vi/LC_MESSAGES/messages.mo index ca2423a4..65ecfc9d 100644 Binary files a/cps/translations/vi/LC_MESSAGES/messages.mo and b/cps/translations/vi/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/vi/LC_MESSAGES/messages.po b/cps/translations/vi/LC_MESSAGES/messages.po index 3fba0170..aecd2f73 100644 --- a/cps/translations/vi/LC_MESSAGES/messages.po +++ b/cps/translations/vi/LC_MESSAGES/messages.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2022-09-20 21:36+0700\n" "Last-Translator: Ha Link \n" "Language: vi\n" @@ -13,442 +13,442 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "Thống kê" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "Máy chủ đã khởi động lại,hãy tải lại trang" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "Máy chủ đang được tắt, hãy đóng cửa sổ này" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "Lệnh không tồn tại" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "Không rõ" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "Trang admin" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "Thiết lập cơ bản" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "Thiết lập UI" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "Chỉnh sửa người dùng" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "Tất cả" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "Không tìm thấy user" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "{} người dung đã đươc xoá thành công" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "Hiển thị tất cả" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "Yêu cầu không đúng định dạng" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "Tên người dung khách không thể thay đổi" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "Khách không thể mang vai trò này" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "Không còn người dùng quản trị, không thể xoá vai trò admin" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "Giá trị phải là true hoặc false" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "Vai trò không hợp lệ" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "Tài khoản khách không có màn hình này" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "View không hợp lệ" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "Ngôn ngữ của khách được xác định tự động và không thể đặt được" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "Địa chỉ cung cấp không hợp lệ" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "Ngôn ngữ sách không hợp lệ" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "Tham số không tồn tại" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "Cột đọc không hợp lệ" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "Cột bị hạn chế không hợp lệ" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Thiết lập Calibre-Web đã cập nhật" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "Bạn có thực sự muốn xóa Kobo Token không?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "Bạn có thực sự muốn xóa miền này không?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "Bạn có thực sự muốn xóa người dùng này không?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "Bạn có chắc chắn muốn xóa giá này không?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi ngôn ngữ của những người dùng đã chọn?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi ngôn ngữ sách hiển thị cho (những) người dùng đã chọn không?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi vai trò đã chọn cho (những) người dùng đã chọn không?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi những giới hạn đã chọn cho người dung?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi các giới hạn hiển thị đã chọn cho (những) người dùng đã chọn không?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "Bạn có chắc chắn muốn thay đổi hành vi đồng bộ hóa giá cho (những) người dùng đã chọn không?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "Bạn có chắc chắn muốn thay đổi vị trí thư viện Calibre không?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "Bạn có chắc chắn muốn xóa cơ sở dữ liệu đồng bộ của Calibre-Web để bắt buộc đồng bộ hóa hoàn toàn với Kobo Reader của mình không?" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "Từ chối" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "Cho phép" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} mục nhập đồng bộ hóa đã bị xóa" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "Tag không tồn tại" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "Hành động không hợp lệ" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "Vị trí tệp nhật ký không hợp lệ, vui lòng nhập đường dẫn chính xác" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "Thêm người dùng mới" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "Lỗi cơ sở dữ liệu: %(error)s." -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 #, fuzzy msgid "Scheduled tasks settings updated" msgstr "Thiết lập cơ sở dữ lieu đã được cập nhật" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "Lỗi không xác định xảy ra. Xin hãy thử lại sau." -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "Chỉnh sửa người dùng %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "Đang giải nén tệp cập nhật" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "They thế tập tin" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "Liên kết cơ sở dữ liệu đã được đóng" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "Đang dừng server" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "Cập nhật hoàn tất, ấn okay và tải lại trang" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "Cập nhật thất bại:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "Lỗi HTTP" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "Lỗi kết nối" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "Lỗi chung" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "File cập nhật không thể được lưu trong thư mục tạm thời" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -464,7 +464,7 @@ msgstr "Thiết lập cơ sở dữ lieu đã được cập nhật" msgid "Database Configuration" msgstr "Thiết lập cơ sở dữ lieu :)))" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "Hãy điền hết các trường!" @@ -498,7 +498,7 @@ msgstr "Không thể xoá người dùng khách" msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -515,127 +515,127 @@ msgstr "chưa cài đặt" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "None" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "Metadata đã được cập nhật thành công" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "File %(file)s đã được tải lên" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "Thiếu định dạng nguồn hoặc đích để convert" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "Có lỗi xảy ra khi chuyển đổi định dạng cho sach: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s không phải là ngôn ngữ hợp lệ" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "Lưu file thất bại %(file)s." -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" @@ -648,483 +648,483 @@ msgstr "" msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "%(format)s không tìm thấy: %(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "Gửi tới Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "E-mail này được gửi từ Calibre-Web." -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web test e-mail" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "Test e-mail" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "Bắt đầu với Calibre-Web" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "Email đăng ký cho người dùng: %(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "Chuyển đổi %(orig)s thành %(format)s và chuyển tới Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "Gửi %(format)s tới Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s gửi tới Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "File được yêu cầu không thể đọc. Có thể do phân quyền bị sai?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "Xoá thư mục cho sách %(id)s thất bại, đường dẫn có subfolders: %(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "Xoá sách %(id)s thất bại: %(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "File %(file)s không tìm thấy trẻn Google Drive" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Không tìm thấy được dẫn sách %(path)s trên Google Drive" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "Username này đã bị sử dụng" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "Định dạng email address không hợp lệ" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "Lỗi tải xuống ảnh bìa" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "Định dạng ảnh bìa lỗi" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "Tạo đường dẫn cho ảnh bìa thất bại" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "Khám phá" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Thiết lập Kobo" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "Đăng nhập với Github thất bại." -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "Lấy thông tin user từ Github thất bại." -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "Đăng nhập với Google thất bại." -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "Lấy thông tin người dùng từ Google thất bại." -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "Oauth Github lỗi, xin thử lại sau." -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "Github Oauth lỗi: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth lỗi, làm ơn thử lại sau." -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth lỗi: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} sao" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "Đăng nhập" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "Không tìm thấy token" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token đã hết hạn" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "Thành công! Hãy quay lại thiết bị của bạn" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "Sách" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "Hiển thị sách gần đây" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "Sách hot" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "Hiển thị sách hot" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "Sách đã tải" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "Hiển thị sách đã tải" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "Top sách được đánh giá cao" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "Hiện thị top những sách được đánh giá cao" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "Sách đã đọc" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "Hiển thị đã đọc và chưa đọc" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "Sách chưa đọc" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "Hiện thị sách chưa đọc" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "Khám phá" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "Hiển thị sách ngẫu nhiên" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "Chủ đề" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "Hiển thị chọn chủ đề" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "Series" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "Hiển thị chọn series" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "Tác giả" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "Hiển thị chọn tác giả" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "Nhà phát hành" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "Hiển thị chọn nhà phát hành" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "Ngôn ngữ" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "Hiển thị chọn ngôn ngữ" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "Đánh giá" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "Hiển thị chọn đánh giá" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "Định dạng file" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "Hiển thị lựa chọn định dạng file" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "Sách đã lưu trữ" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "Hiện thị sách trong kho" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "Danh sách sách" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "Hiển thị danh sách sách" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "Tìm kiếm" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "Phát hành sau " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "Phát hành trước " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "Đánh giá <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "Đánh giá >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "Trạng thái đọc = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "Tìm kiếm nâng cao" @@ -1232,46 +1232,46 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "Nhiệm vụ" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "Đang chờ" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "Thất bại" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "Đã bắt đầu" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "Đã hoàn thành" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 #, fuzzy msgid "Cancelled" msgstr "Huỷ bỏ" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "Trạng thái không xác định" @@ -1304,175 +1304,175 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:623 +#: cps/web.py:625 #, fuzzy msgid "Rating: None" msgstr "Đánh giá cao hơn" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "Tải xuống" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "Danh sách đánh giá" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "Danh sách định dạng file" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "Đăng ký" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "Email của bạn không được cho phép để đăng ký" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "Không thể đăng nhập: %(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "Tên đăng nhập hoặc mật khẩu không đúng" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "Mật khẩu mới đã được gửi đến email của bạn" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "Lỗi không xác định xảy ra. Xin hãy thử lại sau." -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "Tên đăng nhập hoặc mật khẩu không đúng" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "Metadata đã được cập nhật thành công" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "Tìm thấy một tài khoản đã toàn tại cho địa chỉ email này" @@ -1480,56 +1480,60 @@ msgstr "Tìm thấy một tài khoản đã toàn tại cho địa chỉ email n msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s gửi tới Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/tasks/convert.py:330 #, fuzzy msgid "Convert" msgstr "Khám phá" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 #, fuzzy msgid "Reconnecting Calibre database" msgstr "Kết nối lại với cơ sở dữ liệu Calibre" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 #, fuzzy msgid "E-mail" msgstr "Test e-mail" @@ -1538,11 +1542,7 @@ msgstr "Test e-mail" msgid "Backing up Metadata" msgstr "" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1580,7 +1580,7 @@ msgstr "Tên người dùng" msgid "Email" msgstr "Địa chỉ email" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "Kindle" @@ -1815,7 +1815,7 @@ msgstr "Ok" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "Huỷ bỏ" @@ -1867,7 +1867,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "" @@ -1974,12 +1974,12 @@ msgid "Language" msgstr "Ngôn ngữ" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "Có" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "Không" @@ -2140,7 +2140,7 @@ msgid "Enter " msgstr "Nhập " #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "Bạn có thực sự chắc chắn?" @@ -2914,7 +2914,7 @@ msgstr "Lỗi" msgid "Upload done, processing, please wait..." msgstr "Tải lên xong, đang xử lý, đợi chút ..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "Thiết lập" @@ -3051,7 +3051,7 @@ msgstr "Thư mục cha" msgid "Select" msgstr "Chọn" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "Ok" @@ -3059,35 +3059,76 @@ msgstr "Ok" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "trình đọc epub" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "Sáng" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "Tối" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "Quay lại" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "Xoá" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "Đang chờ" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "Dọc" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "Đọc" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "Cột đọc không hợp lệ" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Trình đọc truyện tranh" @@ -3285,11 +3326,11 @@ msgstr "Ngày phát hành từ" msgid "Published Date To" msgstr "Ngày phát hành tới" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3325,11 +3366,13 @@ msgstr "Đánh giá cao hơn" msgid "Rating Below" msgstr "Đánh giá thấp hơn" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "Từ:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "Tới:" @@ -3353,6 +3396,14 @@ msgstr "Khoá thay đổi thứ tự" msgid "Enable Change order" msgstr "Mở thay đổi thứ tự" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "Chia sửa với tất cả" @@ -3421,16 +3472,21 @@ msgstr "Tiến độ" msgid "Run Time" msgstr "Thời gian chạy" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "Trộn" + +#: cps/templates/tasks.html:21 #, fuzzy msgid "Actions" msgstr "Đánh giá" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3438,6 +3494,10 @@ msgstr "" msgid "Reset user Password" msgstr "Reset mật khẩu người dùng" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "Ngôn ngữ của sách" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index c260b191..c87f33ab 100644 Binary files a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo and b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index 3637398b..4430fb22 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-09-27 22:18+0800\n" "Last-Translator: xlivevil \n" "Language: zh_CN\n" @@ -16,439 +16,439 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "统计" -#: cps/admin.py:150 +#: cps/admin.py:151 msgid "Server restarted, please reload page." msgstr "服务器已重启,请刷新页面" -#: cps/admin.py:152 +#: cps/admin.py:153 msgid "Performing Server shutdown, please close window." msgstr "正在关闭服务器,请关闭窗口" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "数据库重新连接成功" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "未知命令" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "成功!书籍已排队进行元数据备份,请检查任务列表以获取结果" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "未知" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "管理页" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "管理用户" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "找不到用户" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "成功删除 {} 个用户" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "显示全部" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "格式错误的请求" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "访客名称无法更改" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "游客无法拥有此角色" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "没有其余管理员账户,无法删除管理员角色" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "值必须为 true 或 false" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "无效角色" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "游客无法查看此页面" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "无效页面" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "无法设置游客的本地化,该项设置的值将自动检测" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "无可用本地化" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "无有效书籍语言" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "参数未找到" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "无效的阅读栏目" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "无效的限制栏目" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web 配置已更新" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "您确定删除 Kobo 令牌吗?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "您确定要删除此域吗?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "您确定要删除此用户吗?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "您确定要删除此书架吗?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "您确定要修改选定用户的本地化设置吗?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "您确定要修改选定用户的可见书籍语言吗?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "您确定要修改选定用户的选定角色吗?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "您确定要修改选定用户的选定限制吗?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "您确定要修改选定用户的选定可视化限制吗?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "您确定要更改所选用户的书架同步行为吗?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "您确定要更改 Calibre 库位置吗?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "Calibre-Web 将搜索更新封面,并更新缩略图,这可能需要一段时间" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "您确定要删除 Calibre-Web 的同步数据库以强制与您的 Kobo Reader 进行完全同步吗" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒绝" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "允许" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "{} 同步项目被删除" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "标签未找到" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "无效的动作" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json 未为 Web 应用程序配置" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "日志文件路径无效,请输入正确的路径" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "访问日志路径无效,请输入正确的路径" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "请输入 LDAP 主机、端口、DN 和用户对象标识符" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "请输入一个 LDAP 服务账号和密码 " -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "请输入一个 LDAP 服务账号" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP 组对象过滤器需要一个具有“%s”格式标识符" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP 组对象过滤器的括号不匹配" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 用户对象过滤器需要一个具有“%s”格式标识符" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP 用户对象过滤器的括号不匹配" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP 成员用户过滤器需要有一个“%s”格式标识符" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP 成员用户过滤器中有不匹配的括号" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA证书、证书或密钥位置无效,请输入正确的路径" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "添加新用户" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "编辑邮件服务器设置" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "Gmail 账户验证成功" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "数据库错误:%(error)s" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "发送给 %(email)s 的测试邮件已加入队列。请检查任务结果" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "发送测试邮件时出错:%(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "请先配置您的邮箱地址..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "邮件服务器设置已更新" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "编辑计划任务设置" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "指定任务的开始时间无效" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "指定任务的持续时间无效" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "已更新计划任务设置" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "设置数据库不可写" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "用户 %(user)s 的密码已重置" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "请先配置 SMTP 邮箱设置..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "日志文件查看器" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "正在替换文件" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "正在停止服务器" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请点击确定并刷新页面" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "更新失败:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP 错误" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "连接错误" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "建立连接超时" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "一般错误" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "更新文件无法保存在临时目录中" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "更新期间无法替换文件" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "未能获得任何 LDAP 用户" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "未能创建任何 LDAP 用户" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "错误:%(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "错误:在 LDAP 服务器的响应中没有返回用户" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "数据库中没有找到任何 LDAP 用户" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} 用户被成功导入" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "数据库路径无效,请输入正确的路径" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "数据库不可写入" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "密钥文件路径无效,请输入正确的路径" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "证书文件路径无效,请输入正确的路径" @@ -464,7 +464,7 @@ msgstr "数据库设置已更新" msgid "Database Configuration" msgstr "数据库配置" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "请填写所有字段!" @@ -498,7 +498,7 @@ msgstr "无法删除游客用户" msgid "No admin user remaining, can't delete user" msgstr "管理员账户不存在,无法删除用户" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "电子邮件地址不能为空,并且必须是有效的电子邮件" @@ -515,128 +515,128 @@ msgstr "未安装" msgid "Execution permissions missing" msgstr "缺少执行权限" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "自定义列号:%(column)d 在 Calibre 数据库中不存在" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "无" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "糟糕!选择书名无法打开。文件不存在或者文件不可访问" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "用户没有权限上传封面" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "标识符不区分大小写,覆盖旧标识符" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "已成功更新元数据" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "编辑书籍时出错: {}" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "文件 %(file)s 已上传" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "转换的源格式或目的格式缺失" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "书籍已经被成功加入 %(book_format)s 格式转换队列" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "转换此书籍时出现错误: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "上传的书籍可能已经存在,建议修改后重新上传: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "'%(langname)s' 不是一种有效语言" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "不能上传文件扩展名为“%(ext)s”的文件到此服务器" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "不能上传文件扩展名为“%(ext)s”的文件到此服务器" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "要上传的文件必须具有扩展名" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "文件 %(filename)s 无法保存到临时目录" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "移动封面文件失败 %(file)s:%(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "书籍的此格式副本已成功删除" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "书籍已成功删除" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "您没有删除书籍的权限" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "编辑元数据" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s 不是一个有效的数值,忽略" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "用户没有权限上传其他文件格式" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "创建路径 %(path)s 失败 (权限不足)" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失败" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" @@ -649,470 +649,470 @@ msgstr "Google Drive 设置未完成,请尝试停用并再次激活 Google 云 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "回调域名尚未被校验,请在 Google 开发者控制台按步骤校验域名" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "找不到 ID 为 %(book)d 的书籍的 %(format)s 格式" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google Drive %(fn)s 上找不到 %(format)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "找不到 %(format)s:%(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "发送到电子阅读器" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "此邮件已经通过 Calibre-Web 发送" -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "Calibre-Web 测试邮件" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "测试邮件" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "开启 Calibre-Web 之旅" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "用户注册电子邮件:%(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "转换 %(orig)s 到 %(format)s 并发送到电子阅读器" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, python-format msgid "Send %(format)s to eReader" msgstr "发送 %(format)s 到电子阅读器" -#: cps/helper.py:227 +#: cps/helper.py:230 #, python-format msgid "%(book)s send to eReader" msgstr "%(book)s 发送到电子阅读器" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "无法读取请求的文件。可能有错误的权限设置?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "阅读状态无法设置: {}" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "删除书的文件夹 %(id)s 失败,路径有子文件夹:%(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "删除书籍 %(id)s 失败:%(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "仅从数据库中删除书籍 %(id)s,数据库中的书籍路径无效: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "将作者从“%(src)s”改为“%(dest)s”时失败,出错信息:%(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Google Drive 上找不到文件 %(file)s" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "将标题从“%(src)s”改为“%(dest)s”时失败,出错信息:%(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive 上找不到书籍路径 %(path)s" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "已存在使用此邮箱的账户" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "此用户名已被使用" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "无效的邮箱格式" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "密码不符合密码验证规则" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "上传封面所需的 Python 模块 'advocate' 未安装" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "下载封面时出错" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "封面格式出错" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "您没有访问本地主机或本地网络进行封面上传" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "创建封面路径失败" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "封面文件不是有效的图片文件,或者无法存储它" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "封面文件只支持 jpg、jpeg、png、webp、bmp 文件" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "封面文件内容无效" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "仅将 jpg、jpeg 文件作为封面文件" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "封面" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "找不到 UnRar 执行文件" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "执行 UnRar 时出错" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "数据库不可写入" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "缺少执行权限" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "执行 UnRar 时出错" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "将所有书籍加入元数据备份队列" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "请不要从 localhost 访问 Calibre-Web,以便 Kobo 设备能获取有效的 api_endpoint" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo 设置" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "使用 %(provider)s 注册" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "您现在已以“%(nickname)s”身份登录" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "链接到 %(oauth)s 成功" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "登录失败,没有用户与 OAuth 帐户关联" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "取消链接到 %(oauth)s 成功" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "取消链接到 %(oauth)s 失败" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "未连接到 %(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "使用 Github 登录失败" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "从 Github 获取用户信息失败" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "使用 Google 登录失败" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "从 Google 获取用户信息失败" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth 错误,请重试" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub Oauth 错误: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth 错误,请重试" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth 错误: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} 星" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "登录" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "找不到令牌" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "令牌已过期" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "成功!请返回您的设备" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "书籍" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "显示最近查看的书籍" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "热门书籍" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "显示热门书籍" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "已下载书籍" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "显示下载过的书籍" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "最高评分书籍" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "显示最高评分书籍" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "已读书籍" -#: cps/render_template.py:64 +#: cps/render_template.py:63 msgid "Show Read and Unread" msgstr "显示已读或未读状态" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "未读书籍" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "显示未读" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "发现" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "显示随机书籍" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "分类" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 msgid "Show Category Section" msgstr "显示分类栏目" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "丛书" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 msgid "Show Series Section" msgstr "显示丛书栏目" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "作者" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 msgid "Show Author Section" msgstr "显示作者栏目" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "出版社" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 msgid "Show Publisher Section" msgstr "显示出版社栏目" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "语言" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 msgid "Show Language Section" msgstr "显示语言栏目" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "评分" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 msgid "Show Ratings Section" msgstr "显示评分栏目" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "文件格式" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 msgid "Show File Formats Section" msgstr "显示文件格式栏目" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "归档书籍" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 msgid "Show Archived Books" msgstr "显示归档书籍" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "书籍列表" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "显示书籍列表" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "搜索" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "出版时间晚于 " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "出版时间早于 " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "评分 <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "评分 >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "阅读状态 = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜索自定义栏目时出错,请重启 Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "高级搜索" @@ -1220,45 +1220,45 @@ msgstr "公共书架:%(title)s 已经存在已经存在" msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有书架:%(title)s 已经存在已经存在" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架:%(name)s" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "任务列表" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "等待中" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "失败" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "已开始" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "已完成" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "已结束" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "已取消" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "未知状态" @@ -1291,170 +1291,170 @@ msgstr "有新的更新。单击下面的按钮以更新到版本: %(version)s" msgid "No release information available" msgstr "无可用发布信息" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "发现 (随机书籍)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "热门书籍(最多下载)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下载过的书籍" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "丛书:%(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "评分:无" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "评分:%(rating)s 星" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "分类:%(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "语言:%(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "下载次数" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "评分列表" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "文件格式列表" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "请先配置 SMTP 邮箱设置..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "书籍已经成功加入 %(eReadermail)s 的发送队列" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "糟糕!发送这本书籍的时候出现错误:%(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "请先配置您的 Kindle 邮箱" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "请等待一分钟注册下一个用户" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "注册" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "邮件服务未配置,请联系网站管理员!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "邮件服务未配置,请联系网站管理员!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "您的电子邮件不允许注册" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "确认邮件已经发送到您的邮箱" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "无法激活 LDAP 认证" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "下次登录前请等待一分钟" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "后备登录“%(nickname)s”:无法访问 LDAP 服务器,或用户未知" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "无法登录:%(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 msgid "Wrong Username or Password" msgstr "用户名或密码错误" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "新密码已发送到您的邮箱" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "发生一个未知错误,请稍后再试" -#: cps/web.py:1429 +#: cps/web.py:1430 msgid "Please enter valid username to reset password" msgstr "请输入有效的用户名进行密码重置" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您现在已以“%(nickname)s”身份登录" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 的用户配置" -#: cps/web.py:1511 +#: cps/web.py:1519 msgid "Success! Profile Updated" msgstr "资料已更新" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "使用此邮箱的账号已经存在" @@ -1462,54 +1462,58 @@ msgstr "使用此邮箱的账号已经存在" msgid "Found no valid gmail.json file with OAuth information" msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s 发送到电子阅读器" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "Calibre 电子书转换器 %(tool)s 没有发现" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "硬盘上找不到 %(format)s 格式" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "发生未知错误,书籍转换失败" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 转换失败:%(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到转换后的文件或文件夹 %(folder)s 中有多个文件" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "电子书转换器失败: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 运行失败,错误信息:%(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "电子书转换器失败: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "转换" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "正在重新连接到 Calibre 数据库" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "电子邮件" @@ -1517,11 +1521,7 @@ msgstr "电子邮件" msgid "Backing up Metadata" msgstr "正在备份元数据" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "生成了 %(count)s 个封面缩略图" @@ -1559,7 +1559,7 @@ msgstr "用户名" msgid "Email" msgstr "邮箱地址" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "接收书籍的电子阅读器邮箱地址" @@ -1790,7 +1790,7 @@ msgstr "确定" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "取消" @@ -1842,7 +1842,7 @@ msgstr "按出版日期排序,最旧优先" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "减少" @@ -1949,12 +1949,12 @@ msgid "Language" msgstr "语言" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "确认" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "没有" @@ -2115,7 +2115,7 @@ msgid "Enter " msgstr "输入" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "您真的确认?" @@ -2885,7 +2885,7 @@ msgstr "错误" msgid "Upload done, processing, please wait..." msgstr "上传完成,正在处理,请稍候..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "设置" @@ -3022,7 +3022,7 @@ msgstr "父目录" msgid "Select" msgstr "选择" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "完成" @@ -3030,34 +3030,75 @@ msgstr "完成" msgid "Calibre-Web eBook Catalog" msgstr "Caliebre-Web 电子书路径" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "epub 阅读器" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "浅色" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "深色" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "棕色" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "黑色" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "打开侧栏时重排文本" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "字体大小" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "删除数据" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "等待中" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "垂直" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "已读" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "无效的阅读栏目" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Comic 阅读器" @@ -3254,11 +3295,11 @@ msgstr "出版日期从" msgid "Published Date To" msgstr "出版日期到" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3294,11 +3335,13 @@ msgstr "评分大于" msgid "Rating Below" msgstr "评分小于" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "从:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "到:" @@ -3322,6 +3365,16 @@ msgstr "禁止改变顺序" msgid "Enable Change order" msgstr "允许改变顺序" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "按图书日期排序,最新优先" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "按图书日期排序,最旧优先" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "书架将被公开" @@ -3390,15 +3443,20 @@ msgstr "任务进度" msgid "Run Time" msgstr "运行时间" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "合并" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "活动" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "这个任务将被取消。此任务所有的更改都将被保存" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "如果这是计划任务,则将在下一个计划的时间内重新运行" @@ -3406,6 +3464,10 @@ msgstr "如果这是计划任务,则将在下一个计划的时间内重新运 msgid "Reset user Password" msgstr "重置用户密码" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "按语言显示书籍" diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo index 58fa6319..274ce9c7 100644 Binary files a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo and b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.mo differ diff --git a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po index 15b25b65..41685490 100644 --- a/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hant_TW/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-Web\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: 2020-09-27 22:18+0800\n" "Last-Translator: xlivevil \n" "Language: zh_TW\n" @@ -16,444 +16,444 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "統計" -#: cps/admin.py:150 +#: cps/admin.py:151 #, fuzzy msgid "Server restarted, please reload page." msgstr "服務器已重啟,請刷新頁面" -#: cps/admin.py:152 +#: cps/admin.py:153 #, fuzzy msgid "Performing Server shutdown, please close window." msgstr "正在關閉服務器,請關閉窗口" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "未知命令" -#: cps/admin.py:174 +#: cps/admin.py:175 #, fuzzy msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "發送給%(email)s的測試郵件已進入隊列。請檢查任務結果" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "未知" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "管理頁" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "基本配置" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "界面配置" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "管理用戶" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "全部" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "找不到用戶" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "成功刪除 {} 個用戶" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "顯示全部" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "格式錯誤的請求" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "訪客名稱無法更改" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "遊客無法擁有此角色" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "管理員賬戶不存在,無法刪除管理員角色" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "值必須是 true 或 false" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "無效角色" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "遊客無法擁有此視圖" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "無效視圖" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "訪客的本地化是自動偵測而無法設置的" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "無可用本地化" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "無有效書籍語言" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "參數未找到" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "無效的閱讀列" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "無效的限制列" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "Calibre-Web配置已更新" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "您確定刪除Kobo Token嗎?" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "您確定要刪除此網域嗎?" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "您確定要刪除此用戶嗎?" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "您確定要刪除此書架嗎?" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "您確定要修改選定用戶的本地化設置嗎?" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "您確定要修改選定用戶的可見書籍語言嗎?" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "您確定要修改選定用戶的選定角色嗎?" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "您確定要修改選定用戶的選定限制嗎?" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "您確定要修改選定用戶的選定可視化限制嗎?" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "您確定要更改所選用戶的書架同步行為嗎?" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "您確定要更改 Calibre 庫位置嗎?" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "拒絕" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "允許" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "標籤未找到" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "無效的動作" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "client_secrets.json 未為 Web 應用程序配置" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "日誌文件路徑無效,請輸入正確的路徑" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "訪問日誌路徑無效,請輸入正確的路徑" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "請輸入LDAP主機、端口、DN和用戶對象標識符" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "請輸入一個LDAP服務賬號和密碼 " -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "請輸入一個LDAP服務賬號" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "LDAP群組對象過濾器需要一個具有“%s”格式標識符號" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "LDAP群組對象過濾器的括號不匹配" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP用戶對象過濾器需要一個具有“%s”格式標識符" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "LDAP用戶對象過濾器的括號不匹配" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "LDAP成員用戶過濾器需要有一個“%s”格式標識符號" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "LDAP成員用戶過濾器中有不匹配的括號" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "LDAP CA證書、證書或密鑰位置無效,請輸入正確的路徑" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "添加新用戶" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "編輯郵件服務器設置" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "數據庫錯誤:%(error)s。" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "發送給%(email)s的測試郵件已進入隊列。請檢查任務結果" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "發送測試郵件時出錯:%(res)s" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "請先配置您的郵箱地址..." -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "郵件服務器設置已更新" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "發生一個未知錯誤,請稍後再試。" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "編輯用戶 %(nick)s" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, fuzzy, python-format msgid "Success! Password for user %(user)s reset" msgstr "用戶 %(user)s 的密碼已重置" -#: cps/admin.py:1451 +#: cps/admin.py:1452 #, fuzzy msgid "Oops! Please configure the SMTP mail settings." msgstr "請先配置SMTP郵箱設置..." -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "日誌文件查看器" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "正在請求更新包" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "正在下載更新包" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "正在解壓更新包" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "正在替換文件" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "數據庫連接已關閉" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "正在停止服務器" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "更新完成,請點擊確定並刷新頁面" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "更新失敗:" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "HTTP錯誤" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "連接錯誤" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "建立連接超時" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "一般錯誤" -#: cps/admin.py:1539 +#: cps/admin.py:1540 #, fuzzy msgid "Update file could not be saved in temp dir" msgstr "更新文件無法保存在臨時目錄中" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "更新時檔案無法替換變更" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "未能提取至少一個LDAP用戶" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "未能創建至少一個LDAP用戶" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "錯誤:%(ldaperror)s" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "錯誤:在LDAP服務器的響應中沒有返回用戶" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "數據庫中沒有找到至少一個LDAP用戶" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "{} 用戶被成功導入" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "數據庫路徑無效,請輸入正確的路徑" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "數據庫不可寫入" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "密鑰文件路徑無效,請輸入正確的路徑" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "證書文件路徑無效,請輸入正確的路徑" @@ -470,7 +470,7 @@ msgstr "郵件服務器設置已更新" msgid "Database Configuration" msgstr "數據庫配置" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "請填寫所有欄位!" @@ -504,7 +504,7 @@ msgstr "無法刪除訪客用戶" msgid "No admin user remaining, can't delete user" msgstr "管理員賬戶不存在,無法刪除用戶" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -521,128 +521,128 @@ msgstr "未安裝" msgid "Execution permissions missing" msgstr "缺少執行權限" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, fuzzy, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "自定義列號:%(column)d在Calibre數據庫中不存在" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "無" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "糟糕!選擇書名無法打開。文件不存在或者文件不可訪問" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "標識符不區分大小寫,覆蓋舊標識符" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "已成功更新元數據" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "文件 %(file)s 已上傳" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "轉換的來源或目的格式不存在" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "書籍已經被成功加入到 %(book_format)s 格式轉換隊列" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "轉換此書籍時出現錯誤: %(res)s" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "上傳的書籍可能已經存在,建議修改後重新上傳: " -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, fuzzy, python-format msgid "'%(langname)s' is not a valid language" msgstr "%(langname)s 不是一種有效語言" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 #, fuzzy msgid "File type isn't allowed to be uploaded to this server" msgstr "不能上傳文件附檔名為“%(ext)s”的文件到此服務器" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "不能上傳文件附檔名為“%(ext)s”的文件到此服務器" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "要上傳的文件必須具有附檔名" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "文件 %(filename)s 無法保存到臨時目錄" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "移動封面文件失敗 %(file)s:%(error)s" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "書籍格式已成功刪除" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "書籍已成功刪除" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "編輯元數據" -#: cps/editbooks.py:1013 -#, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +#: cps/editbooks.py:1023 +#, fuzzy, python-format +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "%(seriesindex)s 不是一個有效的數值,忽略" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "創建路徑 %(path)s 失敗(權限拒絕)。" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "保存文件 %(file)s 失敗。" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "已添加 %(ext)s 格式到 %(book)s" @@ -655,487 +655,487 @@ msgstr "Google Drive 設置未完成,請嘗試停用並再次激活Google雲 msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "回調網域名稱尚未被驗證,請在google開發者控制台按步驟驗證網域名稱" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "找不到id為 %(book)d 的書籍的 %(format)s 格式" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "Google Drive %(fn)s 上找不到 %(format)s" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "找不到 %(format)s:%(fn)s" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 #, fuzzy msgid "Send to eReader" msgstr "發送到Kindle" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 #, fuzzy msgid "This Email has been sent via Calibre-Web." msgstr "此郵件已經通過Calibre-Web發送。" -#: cps/helper.py:120 +#: cps/helper.py:123 #, fuzzy msgid "Calibre-Web Test Email" msgstr "Calibre-Web測試郵件" -#: cps/helper.py:121 +#: cps/helper.py:124 #, fuzzy msgid "Test Email" msgstr "測試郵件" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "開啟Calibre-Web之旅" -#: cps/helper.py:143 +#: cps/helper.py:146 #, fuzzy, python-format msgid "Registration Email for user: %(name)s" msgstr "用戶註冊電子郵件:%(name)s" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, fuzzy, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "轉換 %(orig)s 到 %(format)s 並發送到Kindle" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, fuzzy, python-format msgid "Send %(format)s to eReader" msgstr "發送 %(format)s 到Kindle" -#: cps/helper.py:227 +#: cps/helper.py:230 #, fuzzy, python-format msgid "%(book)s send to eReader" msgstr "%(book)s發送到Kindle" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "無法讀取請求的文件。可能有錯誤的權限設置?" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "刪除書的文件夾%(id)s失敗,路徑有子文件夾:%(path)s" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "刪除書籍 %(id)s失敗:%(message)s" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "僅從數據庫中刪除書籍 %(id)s,數據庫中的書籍路徑無效: %(path)s" -#: cps/helper.py:463 +#: cps/helper.py:441 #, fuzzy, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "將標題從“%(src)s”改為“%(dest)s”時失敗,錯誤錯信息:%(error)s" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "Google Drive上找不到文件 %(file)s" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "將標題從“%(src)s”改為“%(dest)s”時失敗,錯誤錯信息:%(error)s" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "Google Drive上找不到書籍路徑 %(path)s" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "此用戶名已被使用" -#: cps/helper.py:702 +#: cps/helper.py:681 #, fuzzy msgid "Invalid Email address format" msgstr "無效的郵件地址格式" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "下載封面時出錯" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "封面格式出錯" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "創建封面路徑失敗" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "封面文件不是有效的圖片文件,或者無法儲存" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "封面文件只支持jpg/jpeg/png/webp/bmp格式文件" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "僅將jpg、jpeg文件作為封面文件" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 #, fuzzy msgid "Cover" msgstr "發現" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "找不到UnRar執行文件" -#: cps/helper.py:1039 +#: cps/helper.py:1017 #, fuzzy msgid "Error executing UnRar" msgstr "執行UnRar時出錯" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 #, fuzzy msgid "Calibre binaries not viable" msgstr "數據庫不可寫入" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, fuzzy, python-format msgid "Missing executable permissions: %(missing)s" msgstr "缺少執行權限" -#: cps/helper.py:1080 +#: cps/helper.py:1058 #, fuzzy msgid "Error executing Calibre" msgstr "執行UnRar時出錯" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 #, fuzzy msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "請不要使用localhost訪問Calibre-Web,以便Kobo設備能獲取有效的api_endpoint" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "Kobo 設置" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "使用 %(provider)s 註冊" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "您現在已以“%(nickname)s”身份登入" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "連接到%(oauth)s成功" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "登入失敗,沒有用戶與OAuth帳戶關聯" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "取消連接到%(oauth)s成功" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "取消連接到%(oauth)s失敗" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "為連接到%(oauth)s" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "使用Github登入失敗。" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "從Github獲取用戶信息失敗。" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "使用Google登入失敗。" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "從Google獲取用戶信息失敗。" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "GitHub Oauth 錯誤,請重試。" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "GitHub Oauth 錯誤: {}" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "Google Oauth 錯誤,請重試。" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "Google Oauth 錯誤: {}" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "{} 星" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "登入" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "找不到Token" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "Token已過期" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "成功!請返回您的設備" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "書籍" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "顯示最近書籍" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "熱門書籍" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "顯示熱門書籍" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "已下載書籍" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "顯示下載過的書籍" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "最高評分書籍" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "顯示最高評分書籍" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "已讀書籍" -#: cps/render_template.py:64 +#: cps/render_template.py:63 #, fuzzy msgid "Show Read and Unread" msgstr "顯示閱讀狀態" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "未讀書籍" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "顯示未讀" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "發現" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "隨機顯示書籍" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "分類" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 #, fuzzy msgid "Show Category Section" msgstr "顯示分類選擇" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "叢書" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 #, fuzzy msgid "Show Series Section" msgstr "顯示叢書選擇" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "作者" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 #, fuzzy msgid "Show Author Section" msgstr "顯示作者選擇" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "出版社" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 #, fuzzy msgid "Show Publisher Section" msgstr "顯示出版社選擇" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "語言" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 #, fuzzy msgid "Show Language Section" msgstr "顯示語言選擇" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "評分" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 #, fuzzy msgid "Show Ratings Section" msgstr "顯示評分選擇" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "文件格式" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 #, fuzzy msgid "Show File Formats Section" msgstr "顯示文件格式選擇" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "歸檔書籍" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 #, fuzzy msgid "Show Archived Books" msgstr "顯示歸檔書籍" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "書籍列表" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "顯示書籍列表" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "搜尋" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "出版時間晚於 " -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "出版時間早於 " -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "評分 <= %(rating)s" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "評分 >= %(rating)s" -#: cps/search.py:221 +#: cps/search.py:234 #, fuzzy, python-format msgid "Read Status = '%(status)s'" msgstr "閱讀狀態 = %(status)s" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "搜詢自定義欄位時出錯,請重啟 Calibre-Web" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "進階搜尋" @@ -1244,45 +1244,45 @@ msgstr "公共書架:%(title)s已經存在已經存在。" msgid "A private shelf with the name '%(title)s' already exists." msgstr "私有書架:%(title)s已經存在。" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "書架:%(name)s" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打開書架出錯。書架不存在或不可訪問" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "任務列表" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "等待中" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "失敗" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "已開始" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "已完成" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "未知狀態" @@ -1315,178 +1315,178 @@ msgstr "有新的更新。單擊下面的按鈕以更新到版本: %(version)s" msgid "No release information available" msgstr "無可用發佈信息" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "發現(隨機書籍)" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "熱門書籍(最多下載)" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "%(user)s 下載過的書籍" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "作者:%(name)s" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "出版社:%(name)s" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "叢書:%(serie)s" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "評分:%(rating)s 星" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "文件格式:%(format)s" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "分類:%(name)s" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "語言:%(name)s" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "下載次數" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "評分列表" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "文件格式列表" -#: cps/web.py:1249 +#: cps/web.py:1251 #, fuzzy msgid "Please configure the SMTP mail settings first..." msgstr "請先配置SMTP郵箱設置..." -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "書籍已經成功加入 %(eReadermail)s 的發送隊列" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "糟糕!發送這本書籍的時候出現錯誤:%(res)s" -#: cps/web.py:1261 +#: cps/web.py:1263 #, fuzzy msgid "Oops! Please update your profile with a valid eReader Email." msgstr "請先設置您的kindle郵箱。" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "註冊" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 #, fuzzy msgid "Connection error to limiter backend, please contact your administrator" msgstr "郵件服務未配置,請聯繫網站管理員!" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "郵件服務未配置,請聯繫網站管理員!" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "您的電子郵件不允許註冊" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "確認郵件已經發送到您的郵箱。" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 #, fuzzy msgid "Cannot activate LDAP authentication" msgstr "無法激活LDAP認證" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, fuzzy, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”身份登入" -#: cps/web.py:1407 +#: cps/web.py:1408 #, fuzzy, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "備援登入“%(nickname)s”:無法訪問LDAP伺服器,或用戶未知" -#: cps/web.py:1412 +#: cps/web.py:1413 #, fuzzy, python-format msgid "Could not login: %(message)s" msgstr "無法登入:%(message)s" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 #, fuzzy msgid "Wrong Username or Password" msgstr "用戶名或密碼錯誤" -#: cps/web.py:1423 +#: cps/web.py:1424 #, fuzzy msgid "New Password was sent to your email address" msgstr "新密碼已發送到您的郵箱" -#: cps/web.py:1427 +#: cps/web.py:1428 #, fuzzy msgid "An unknown error occurred. Please try again later." msgstr "發生一個未知錯誤,請稍後再試。" -#: cps/web.py:1429 +#: cps/web.py:1430 #, fuzzy msgid "Please enter valid username to reset password" msgstr "請輸入有效的用戶名進行密碼重置" -#: cps/web.py:1437 +#: cps/web.py:1438 #, fuzzy, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "您現在已以“%(nickname)s”身份登入" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "%(name)s 的用戶配置" -#: cps/web.py:1511 +#: cps/web.py:1519 #, fuzzy msgid "Success! Profile Updated" msgstr "資料已更新" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "使用此郵箱的賬號已經存在。" @@ -1494,54 +1494,58 @@ msgstr "使用此郵箱的賬號已經存在。" msgid "Found no valid gmail.json file with OAuth information" msgstr "找不到包含 OAuth 信息的有效 gmail.json 文件" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, fuzzy, python-format msgid "%(book)s send to E-Reader" msgstr "%(book)s發送到Kindle" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "沒有發現Calibre 電子書轉換器%(tool)s" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "硬碟上找不到 %(format)s 格式" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "發生未知錯誤,書籍轉換失敗" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "Kepubify 轉換失敗:%(error)s" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "找不到轉換後的文件或文件夾%(folder)s中有多個文件" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "電子書轉換器失敗: %(error)s" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "Calibre 運行失敗,錯誤信息:%(error)s" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "電子書轉換器失敗: %(error)s" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1550,11 +1554,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "編輯元數據" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1592,7 +1592,7 @@ msgstr "用戶名" msgid "Email" msgstr "郵箱地址" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 #, fuzzy msgid "Send to eReader Email" msgstr "接收書籍的Kindle郵箱地址" @@ -1825,7 +1825,7 @@ msgstr "確定" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "取消" @@ -1877,7 +1877,7 @@ msgstr "按出版日期排序,最舊優先" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "減少" @@ -1984,12 +1984,12 @@ msgid "Language" msgstr "語言" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "確認" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "沒有" @@ -2153,7 +2153,7 @@ msgid "Enter " msgstr "書號" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "您真的確認?" @@ -2931,7 +2931,7 @@ msgstr "錯誤" msgid "Upload done, processing, please wait..." msgstr "上傳完成,正在處理中,請稍候..." -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "設置" @@ -3068,7 +3068,7 @@ msgstr "父目錄" msgid "Select" msgstr "選擇" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "完成" @@ -3076,35 +3076,76 @@ msgstr "完成" msgid "Calibre-Web eBook Catalog" msgstr "Caliebre-Web電子書路徑" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "epub閱讀器" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "淺色" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "深色" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 #, fuzzy msgid "Black" msgstr "後退" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "打開側欄時重排文本。" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +#, fuzzy +msgid "Default" +msgstr "刪除數據" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +#, fuzzy +msgid "KaiTi" +msgstr "等待中" + +#: cps/templates/read.html:110 +#, fuzzy +msgid "Arial" +msgstr "垂直" + +#: cps/templates/read.html:113 +#, fuzzy +msgid "Spread" +msgstr "已讀" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +#, fuzzy +msgid "One column" +msgstr "無效的閱讀列" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "Comic閱讀器" @@ -3302,11 +3343,11 @@ msgstr "出版日期從" msgid "Published Date To" msgstr "出版日期到" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3342,11 +3383,13 @@ msgstr "評分大於" msgid "Rating Below" msgstr "評分小於" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "從:" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "到:" @@ -3370,6 +3413,16 @@ msgstr "禁止改變順序" msgid "Enable Change order" msgstr "允許改變順序" +#: cps/templates/shelf.html:28 +#, fuzzy +msgid "Sort according to book added to shelf, newest first" +msgstr "按圖書日期排序,最新優先" + +#: cps/templates/shelf.html:29 +#, fuzzy +msgid "Sort according to book added to shelf, oldest first" +msgstr "按圖書日期排序,最舊優先" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "書架將被公開" @@ -3438,15 +3491,20 @@ msgstr "任務進度" msgid "Run Time" msgstr "運行時間" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +#, fuzzy +msgid "Message" +msgstr "合併" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3454,6 +3512,10 @@ msgstr "" msgid "Reset user Password" msgstr "重置用戶密碼" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "按語言顯示書籍" diff --git a/cps/ub.py b/cps/ub.py index 85819859..0e15b8e2 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -20,14 +20,14 @@ import atexit import os import sys -import datetime +from datetime import datetime, timezone, timedelta import itertools import uuid from flask import session as flask_session from binascii import hexlify -from flask_login import AnonymousUserMixin, current_user -from flask_login import user_logged_in +from .cw_login import AnonymousUserMixin, current_user +from .cw_login import user_logged_in try: from flask_dance.consumer.backend.sqla import OAuthConsumerMixin @@ -54,7 +54,7 @@ from sqlalchemy.orm import backref, relationship, sessionmaker, Session, scoped_ from werkzeug.security import generate_password_hash from . import constants, logger - +from .string_helper import strip_whitespaces log = logger.create() @@ -71,17 +71,19 @@ def signal_store_user_session(object, user): def store_user_session(): - if flask_session.get('user_id', ""): - flask_session['_user_id'] = flask_session.get('user_id', "") + _user = flask_session.get('_user_id', "") + _id = flask_session.get('_id', "") + _random = flask_session.get('_random', "") if flask_session.get('_user_id', ""): try: - if not check_user_session(flask_session.get('_user_id', ""), flask_session.get('_id', "")): - user_session = User_Sessions(flask_session.get('_user_id', ""), flask_session.get('_id', "")) + if not check_user_session(_user, _id, _random): + expiry = int((datetime.now() + timedelta(days=31)).timestamp()) + user_session = User_Sessions(_user, _id, _random, expiry) session.add(user_session) session.commit() - log.debug("Login and store session : " + flask_session.get('_id', "")) + log.debug("Login and store session : " + _id) else: - log.debug("Found stored session: " + flask_session.get('_id', "")) + log.debug("Found stored session: " + _id) except (exc.OperationalError, exc.InvalidRequestError) as e: session.rollback() log.exception(e) @@ -100,13 +102,23 @@ def delete_user_session(user_id, session_key): log.exception(ex) -def check_user_session(user_id, session_key): +def check_user_session(user_id, session_key, random): try: - return bool(session.query(User_Sessions).filter(User_Sessions.user_id==user_id, - User_Sessions.session_key==session_key).one_or_none()) + found = session.query(User_Sessions).filter(User_Sessions.user_id==user_id, + User_Sessions.session_key==session_key, + User_Sessions.random == random, + ).one_or_none() + if found is not None: + new_expiry = int((datetime.now() + timedelta(days=31)).timestamp()) + if new_expiry - found.expiry > 86400: + found.expiry = new_expiry + session.merge(found) + session.commit() + return bool(found) except (exc.OperationalError, exc.InvalidRequestError) as e: session.rollback() log.exception(e) + return False user_logged_in.connect(signal_store_user_session) @@ -184,19 +196,19 @@ class UserBase: def list_denied_tags(self): mct = self.denied_tags or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_allowed_tags(self): mct = self.allowed_tags or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_denied_column_values(self): mct = self.denied_column_value or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def list_allowed_column_values(self): mct = self.allowed_column_value or "" - return [t.strip() for t in mct.split(",")] + return [strip_whitespaces(t) for t in mct.split(",")] def get_view_property(self, page, prop): if not self.view_settings.get(page): @@ -299,7 +311,6 @@ class Anonymous(AnonymousUserMixin, UserBase): self.view_settings = data.view_settings self.kobo_only_shelves_sync = data.kobo_only_shelves_sync - def role_admin(self): return False @@ -335,11 +346,16 @@ class User_Sessions(Base): id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('user.id')) session_key = Column(String, default="") + random = Column(String, default="") + expiry = Column(Integer) - def __init__(self, user_id, session_key): + + def __init__(self, user_id, session_key, random, expiry): super().__init__() self.user_id = user_id self.session_key = session_key + self.random = random + self.expiry = expiry # Baseclass representing Shelfs in calibre-web in app.db @@ -353,8 +369,8 @@ class Shelf(Base): user_id = Column(Integer, ForeignKey('user.id')) kobo_sync = Column(Boolean, default=False) books = relationship("BookShelf", backref="ub_shelf", cascade="all, delete-orphan", lazy="dynamic") - created = Column(DateTime, default=datetime.datetime.utcnow) - last_modified = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) + created = Column(DateTime, default=lambda: datetime.now(timezone.utc)) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) def __repr__(self): return '' % (self.id, self.name) @@ -368,7 +384,7 @@ class BookShelf(Base): book_id = Column(Integer) order = Column(Integer) shelf = Column(Integer, ForeignKey('shelf.id')) - date_added = Column(DateTime, default=datetime.datetime.utcnow) + date_added = Column(DateTime, default=lambda: datetime.now(timezone.utc)) def __repr__(self): return '' % self.id @@ -381,7 +397,7 @@ class ShelfArchive(Base): id = Column(Integer, primary_key=True) uuid = Column(String) user_id = Column(Integer, ForeignKey('user.id')) - last_modified = Column(DateTime, default=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc)) class ReadBook(Base): @@ -401,7 +417,7 @@ class ReadBook(Base): cascade="all", backref=backref("book_read_link", uselist=False)) - last_modified = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) last_time_started_reading = Column(DateTime, nullable=True) times_started_reading = Column(Integer, default=0, nullable=False) @@ -424,7 +440,7 @@ class ArchivedBook(Base): user_id = Column(Integer, ForeignKey('user.id')) book_id = Column(Integer) is_archived = Column(Boolean, unique=False) - last_modified = Column(DateTime, default=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc)) class KoboSyncedBooks(Base): @@ -443,8 +459,8 @@ class KoboReadingState(Base): id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(Integer, ForeignKey('user.id')) book_id = Column(Integer) - last_modified = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) - priority_timestamp = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) + priority_timestamp = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) current_bookmark = relationship("KoboBookmark", uselist=False, backref="kobo_reading_state", cascade="all, delete") statistics = relationship("KoboStatistics", uselist=False, backref="kobo_reading_state", cascade="all, delete") @@ -454,7 +470,7 @@ class KoboBookmark(Base): id = Column(Integer, primary_key=True) kobo_reading_state_id = Column(Integer, ForeignKey('kobo_reading_state.id')) - last_modified = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) location_source = Column(String) location_type = Column(String) location_value = Column(String) @@ -467,7 +483,7 @@ class KoboStatistics(Base): id = Column(Integer, primary_key=True) kobo_reading_state_id = Column(Integer, ForeignKey('kobo_reading_state.id')) - last_modified = Column(DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow) + last_modified = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) remaining_time_minutes = Column(Integer) spent_reading_minutes = Column(Integer) @@ -478,11 +494,11 @@ def receive_before_flush(session, flush_context, instances): for change in itertools.chain(session.new, session.dirty): if isinstance(change, (ReadBook, KoboStatistics, KoboBookmark)): if change.kobo_reading_state: - change.kobo_reading_state.last_modified = datetime.datetime.utcnow() - # Maintain the last_modified bit for the Shelf table. + change.kobo_reading_state.last_modified = datetime.now(timezone.utc) + # Maintain the last_modified_bit for the Shelf table. for change in itertools.chain(session.new, session.deleted): if isinstance(change, BookShelf): - change.ub_shelf.last_modified = datetime.datetime.utcnow() + change.ub_shelf.last_modified = datetime.now(timezone.utc) # Baseclass representing Downloads from calibre-web in app.db @@ -522,7 +538,7 @@ class RemoteAuthToken(Base): def __init__(self): super().__init__() self.auth_token = (hexlify(os.urandom(4))).decode('utf-8') - self.expiration = datetime.datetime.now() + datetime.timedelta(minutes=10) # 10 min from now + self.expiration = datetime.now() + timedelta(minutes=10) # 10 min from now def __repr__(self): return '' % self.id @@ -546,45 +562,20 @@ class Thumbnail(Base): type = Column(SmallInteger, default=constants.THUMBNAIL_TYPE_COVER) resolution = Column(SmallInteger, default=constants.COVER_THUMBNAIL_SMALL) filename = Column(String, default=filename) - generated_at = Column(DateTime, default=lambda: datetime.datetime.utcnow()) + generated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) expiration = Column(DateTime, nullable=True) # Add missing tables during migration of database def add_missing_tables(engine, _session): - if not engine.dialect.has_table(engine.connect(), "book_read_link"): - ReadBook.__table__.create(bind=engine) - if not engine.dialect.has_table(engine.connect(), "bookmark"): - Bookmark.__table__.create(bind=engine) - if not engine.dialect.has_table(engine.connect(), "kobo_reading_state"): - KoboReadingState.__table__.create(bind=engine) - if not engine.dialect.has_table(engine.connect(), "kobo_bookmark"): - KoboBookmark.__table__.create(bind=engine) - if not engine.dialect.has_table(engine.connect(), "kobo_statistics"): - KoboStatistics.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "archived_book"): ArchivedBook.__table__.create(bind=engine) if not engine.dialect.has_table(engine.connect(), "thumbnail"): Thumbnail.__table__.create(bind=engine) - if not engine.dialect.has_table(engine.connect(), "registration"): - Registration.__table__.create(bind=engine) - with engine.connect() as conn: - trans = conn.begin() - conn.execute("insert into registration (domain, allow) values('%.%',1)") - trans.commit() # migrate all settings missing in registration table def migrate_registration_table(engine, _session): - try: - _session.query(exists().where(Registration.allow)).scalar() - _session.commit() - except exc.OperationalError: # Database is not compatible, some columns are missing - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE registration ADD column 'allow' INTEGER")) - conn.execute(text("update registration set 'allow' = 1")) - trans.commit() try: # Handle table exists, but no content cnt = _session.query(Registration).count() @@ -598,190 +589,38 @@ def migrate_registration_table(engine, _session): sys.exit(2) -# Remove login capability of user Guest -def migrate_guest_password(engine): +def migrate_user_session_table(engine, _session): try: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("UPDATE user SET password='' where name = 'Guest' and password !=''")) - trans.commit() - except exc.OperationalError: - print('Settings database is not writeable. Exiting...') - sys.exit(2) - - -def migrate_shelfs(engine, _session): - try: - _session.query(exists().where(Shelf.uuid)).scalar() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE shelf ADD column 'uuid' STRING")) - conn.execute(text("ALTER TABLE shelf ADD column 'created' DATETIME")) - conn.execute(text("ALTER TABLE shelf ADD column 'last_modified' DATETIME")) - conn.execute(text("ALTER TABLE book_shelf_link ADD column 'date_added' DATETIME")) - conn.execute(text("ALTER TABLE shelf ADD column 'kobo_sync' BOOLEAN DEFAULT false")) - trans.commit() - for shelf in _session.query(Shelf).all(): - shelf.uuid = str(uuid.uuid4()) - shelf.created = datetime.datetime.now() - shelf.last_modified = datetime.datetime.now() - for book_shelf in _session.query(BookShelf).all(): - book_shelf.date_added = datetime.datetime.now() - _session.commit() - - try: - _session.query(exists().where(Shelf.kobo_sync)).scalar() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE shelf ADD column 'kobo_sync' BOOLEAN DEFAULT false")) - trans.commit() - try: - _session.query(exists().where(BookShelf.order)).scalar() - except exc.OperationalError: # Database is not compatible, some columns are missing - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE book_shelf_link ADD column 'order' INTEGER DEFAULT 1")) - trans.commit() - - -def migrate_readBook(engine, _session): - try: - _session.query(exists().where(ReadBook.read_status)).scalar() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE book_read_link ADD column 'read_status' INTEGER DEFAULT 0")) - conn.execute(text("UPDATE book_read_link SET 'read_status' = 1 WHERE is_read")) - conn.execute(text("ALTER TABLE book_read_link ADD column 'last_modified' DATETIME")) - conn.execute(text("ALTER TABLE book_read_link ADD column 'last_time_started_reading' DATETIME")) - conn.execute(text("ALTER TABLE book_read_link ADD column 'times_started_reading' INTEGER DEFAULT 0")) - trans.commit() - test = _session.query(ReadBook).filter(ReadBook.last_modified == None).all() - for book in test: - book.last_modified = datetime.datetime.utcnow() - _session.commit() - - -def migrate_remoteAuthToken(engine, _session): - try: - _session.query(exists().where(RemoteAuthToken.token_type)).scalar() + _session.query(exists().where(User_Sessions.random)).scalar() _session.commit() except exc.OperationalError: # Database is not compatible, some columns are missing with engine.connect() as conn: trans = conn.begin() - conn.execute(text("ALTER TABLE remote_auth_token ADD column 'token_type' INTEGER DEFAULT 0")) - conn.execute(text("update remote_auth_token set 'token_type' = 0")) + conn.execute(text("ALTER TABLE user_session ADD column 'random' String")) + conn.execute(text("ALTER TABLE user_session ADD column 'expiry' Integer")) trans.commit() + # Migrate database to current version, has to be updated after every database change. Currently migration from -# everywhere to current should work. Migration is done by checking if relevant columns are existing, and than adding -# rows with SQL commands +# maybe 4/5 versions back to current should work. +# Migration is done by checking if relevant columns are existing, and then adding rows with SQL commands def migrate_Database(_session): engine = _session.bind add_missing_tables(engine, _session) migrate_registration_table(engine, _session) - migrate_readBook(engine, _session) - migrate_remoteAuthToken(engine, _session) - migrate_shelfs(engine, _session) - try: - create = False - _session.query(exists().where(User.sidebar_view)).scalar() - except exc.OperationalError: # Database is not compatible, some columns are missing - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE user ADD column `sidebar_view` Integer DEFAULT 1")) - trans.commit() - create = True - try: - if create: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("SELECT language_books FROM user")) - trans.commit() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("UPDATE user SET 'sidebar_view' = (random_books* :side_random + language_books * :side_lang " - "+ series_books * :side_series + category_books * :side_category + hot_books * " - ":side_hot + :side_autor + :detail_random)"), - {'side_random': constants.SIDEBAR_RANDOM, 'side_lang': constants.SIDEBAR_LANGUAGE, - 'side_series': constants.SIDEBAR_SERIES, 'side_category': constants.SIDEBAR_CATEGORY, - 'side_hot': constants.SIDEBAR_HOT, 'side_autor': constants.SIDEBAR_AUTHOR, - 'detail_random': constants.DETAIL_RANDOM}) - trans.commit() - try: - _session.query(exists().where(User.denied_tags)).scalar() - except exc.OperationalError: # Database is not compatible, some columns are missing - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE user ADD column `denied_tags` String DEFAULT ''")) - conn.execute(text("ALTER TABLE user ADD column `allowed_tags` String DEFAULT ''")) - conn.execute(text("ALTER TABLE user ADD column `denied_column_value` String DEFAULT ''")) - conn.execute(text("ALTER TABLE user ADD column `allowed_column_value` String DEFAULT ''")) - trans.commit() - try: - _session.query(exists().where(User.view_settings)).scalar() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE user ADD column `view_settings` VARCHAR(10) DEFAULT '{}'")) - trans.commit() - try: - _session.query(exists().where(User.kobo_only_shelves_sync)).scalar() - except exc.OperationalError: - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("ALTER TABLE user ADD column `kobo_only_shelves_sync` SMALLINT DEFAULT 0")) - trans.commit() - try: - # check if name is in User table instead of nickname - _session.query(exists().where(User.name)).scalar() - except exc.OperationalError: - # Create new table user_id and copy contents of table user into it - with engine.connect() as conn: - trans = conn.begin() - conn.execute(text("CREATE TABLE user_id (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," - "name VARCHAR(64)," - "email VARCHAR(120)," - "role SMALLINT," - "password VARCHAR," - "kindle_mail VARCHAR(120)," - "locale VARCHAR(2)," - "sidebar_view INTEGER," - "default_language VARCHAR(3)," - "denied_tags VARCHAR," - "allowed_tags VARCHAR," - "denied_column_value VARCHAR," - "allowed_column_value VARCHAR," - "view_settings JSON," - "kobo_only_shelves_sync SMALLINT," - "UNIQUE (name)," - "UNIQUE (email))")) - conn.execute(text("INSERT INTO user_id(id, name, email, role, password, kindle_mail,locale," - "sidebar_view, default_language, denied_tags, allowed_tags, denied_column_value, " - "allowed_column_value, view_settings, kobo_only_shelves_sync)" - "SELECT id, nickname, email, role, password, kindle_mail, locale," - "sidebar_view, default_language, denied_tags, allowed_tags, denied_column_value, " - "allowed_column_value, view_settings, kobo_only_shelves_sync FROM user")) - # delete old user table and rename new user_id table to user: - conn.execute(text("DROP TABLE user")) - conn.execute(text("ALTER TABLE user_id RENAME TO user")) - trans.commit() - if _session.query(User).filter(User.role.op('&')(constants.ROLE_ANONYMOUS) == constants.ROLE_ANONYMOUS).first() \ - is None: - create_anonymous_user(_session) - - migrate_guest_password(engine) + migrate_user_session_table(engine, _session) def clean_database(_session): # Remove expired remote login tokens - now = datetime.datetime.now() - _session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).\ - filter(RemoteAuthToken.token_type != 1).delete() - _session.commit() + now = datetime.now() + try: + _session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).\ + filter(RemoteAuthToken.token_type != 1).delete() + _session.commit() + except exc.OperationalError: # Database is not writeable + print('Settings database is not writeable. Exiting...') + sys.exit(2) # Save downloaded books per user in calibre-web's own database diff --git a/cps/uploader.py b/cps/uploader.py index bb3a49b7..d59142c4 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -23,7 +23,8 @@ from flask_babel import gettext as _ from . import logger, comic, isoLanguages from .constants import BookMeta from .helper import split_authors -from .file_helper import get_temp_dir, validate_mime_type +from .file_helper import get_temp_dir +from .string_helper import strip_whitespaces log = logger.create() @@ -68,6 +69,13 @@ except ImportError as e: log.debug('Cannot import fb2, extracting fb2 metadata will not work: %s', e) use_fb2_meta = False +try: + from . import audio + use_audio_meta = True +except ImportError as e: + log.debug('Cannot import mutagen, extracting audio metadata will not work: %s', e) + use_audio_meta = False + def process(tmp_file_path, original_file_name, original_file_extension, rar_executable): meta = default_meta(tmp_file_path, original_file_name, original_file_extension) @@ -84,12 +92,15 @@ def process(tmp_file_path, original_file_name, original_file_extension, rar_exec original_file_name, original_file_extension, rar_executable) + elif extension_upper in [".MP3", ".OGG", ".FLAC", ".WAV", ".AAC", ".AIFF", ".ASF", ".MP4", + ".M4A", ".M4B", ".OGV", ".OPUS"] and use_audio_meta: + meta = audio.get_audio_file_info(tmp_file_path, original_file_extension, original_file_name) except Exception as ex: log.warning('cannot parse metadata, using default: %s', ex) - if not meta.title.strip(): + if not strip_whitespaces(meta.title): meta = meta._replace(title=original_file_name) - if not meta.author.strip() or meta.author.lower() == 'unknown': + if not strip_whitespaces(meta.author) or meta.author.lower() == 'unknown': meta = meta._replace(author=_('Unknown')) return meta diff --git a/cps/usermanagement.py b/cps/usermanagement.py index d8f64012..31c37a93 100644 --- a/cps/usermanagement.py +++ b/cps/usermanagement.py @@ -19,93 +19,123 @@ from functools import wraps from sqlalchemy.sql.expression import func -from werkzeug.security import check_password_hash -from flask_login import login_required, login_user -from flask import request, Response +from .cw_login import login_required + +from flask import request, g +from flask_httpauth import HTTPBasicAuth +from werkzeug.datastructures import Authorization +from werkzeug.security import check_password_hash + +from . import lm, ub, config, logger, limiter, constants, services -from . import lm, ub, config, constants, services, logger, limiter log = logger.create() +auth = HTTPBasicAuth() + + +@auth.verify_password +def verify_password(username, password): + user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == username.lower()).first() + if user: + if user.name.lower() == "guest": + if config.config_anonbrowse == 1: + return user + if config.config_login_type == constants.LOGIN_LDAP and services.ldap: + login_result, error = services.ldap.bind_user(user.name, password) + if login_result: + [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] + return user + if error is not None: + log.error(error) + else: + limiter.check() + if check_password_hash(str(user.password), password): + [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] + return user + ip_address = request.headers.get('X-Forwarded-For', request.remote_addr) + log.warning('OPDS Login failed for user "%s" IP-address: %s', username, ip_address) + return None + + +def requires_basic_auth_if_no_ano(f): + @wraps(f) + def decorated(*args, **kwargs): + authorisation = auth.get_auth() + status = None + user = None + if config.config_allow_reverse_proxy_header_login and not authorisation: + user = load_user_from_reverse_proxy_header(request) + if config.config_anonbrowse == 1 and not authorisation: + authorisation = Authorization( + b"Basic", {'username': "Guest", 'password': ""}) + if not user: + user = auth.authenticate(authorisation, "") + if user in (False, None): + status = 401 + if status: + try: + return auth.auth_error_callback(status) + except TypeError: + return auth.auth_error_callback() + g.flask_httpauth_user = user if user is not True \ + else auth.username if auth else None + return auth.ensure_sync(f)(*args, **kwargs) + return decorated + def login_required_if_no_ano(func): @wraps(func) def decorated_view(*args, **kwargs): + if config.config_allow_reverse_proxy_header_login: + user = load_user_from_reverse_proxy_header(request) + if user: + g.flask_httpauth_user = user + return func(*args, **kwargs) + g.flask_httpauth_user = None if config.config_anonbrowse == 1: return func(*args, **kwargs) return login_required(func)(*args, **kwargs) return decorated_view -def requires_basic_auth_if_no_ano(f): - @wraps(f) - def decorated(*args, **kwargs): - auth = request.authorization - if not auth or auth.type != 'basic': - if config.config_anonbrowse != 1: - user = load_user_from_reverse_proxy_header(request) - if user: - return f(*args, **kwargs) - return _authenticate() - else: - return f(*args, **kwargs) - if config.config_login_type == constants.LOGIN_LDAP and services.ldap: - login_result, error = services.ldap.bind_user(auth.username, auth.password) - if login_result: - user = _fetch_user_by_name(auth.username) + +def user_login_required(func): + @wraps(func) + def decorated_view(*args, **kwargs): + if config.config_allow_reverse_proxy_header_login: + user = load_user_from_reverse_proxy_header(request) + if user: + g.flask_httpauth_user = user + return func(*args, **kwargs) + g.flask_httpauth_user = None + return login_required(func)(*args, **kwargs) + + return decorated_view + + +def load_user_from_reverse_proxy_header(req): + rp_header_name = config.config_reverse_proxy_login_header_name + if rp_header_name: + rp_header_username = req.headers.get(rp_header_name) + if rp_header_username: + user = ub.session.query(ub.User).filter(func.lower(ub.User.name) == rp_header_username.lower()).first() + if user: [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] - login_user(user) - return f(*args, **kwargs) - elif login_result is not None: - log.error(error) - return _authenticate() - user = _load_user_from_auth_header(auth.username, auth.password) - if not user: - return _authenticate() - return f(*args, **kwargs) - return decorated - - -def _load_user_from_auth_header(username, password): - limiter.check() - user = _fetch_user_by_name(username) - if bool(user and check_password_hash(str(user.password), password)) and user.name != "Guest": - [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] - login_user(user) - return user - else: - ip_address = request.headers.get('X-Forwarded-For', request.remote_addr) - log.warning('OPDS Login failed for user "%s" IP-address: %s', username, ip_address) - return None - - -def _authenticate(): - return Response( - 'Could not verify your access level for that URL.\n' - 'You have to login with proper credentials', 401, - {'WWW-Authenticate': 'Basic realm="Login Required"'}) - - -def _fetch_user_by_name(username): - return ub.session.query(ub.User).filter(func.lower(ub.User.name) == username.lower()).first() + return user + return None @lm.user_loader -def load_user(user_id): +def load_user(user_id, random, session_key): user = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() + if session_key: + entry = ub.session.query(ub.User_Sessions).filter(ub.User_Sessions.random == random, + ub.User_Sessions.session_key == session_key).first() + if not entry or entry.user_id != user.id: + return None + elif random: + entry = ub.session.query(ub.User_Sessions).filter(ub.User_Sessions.random == random).first() + if not entry or entry.user_id != user.id: + return None return user - -@lm.request_loader -def load_user_from_reverse_proxy_header(req): - if config.config_allow_reverse_proxy_header_login: - rp_header_name = config.config_reverse_proxy_login_header_name - if rp_header_name: - rp_header_username = req.headers.get(rp_header_name) - if rp_header_username: - user = _fetch_user_by_name(rp_header_username) - if user: - [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] - login_user(user) - return user - return None - diff --git a/cps/web.py b/cps/web.py index b53fe421..7e66730e 100644 --- a/cps/web.py +++ b/cps/web.py @@ -29,7 +29,7 @@ from flask import request, redirect, send_from_directory, make_response, flash, from flask import session as flask_session from flask_babel import gettext as _ from flask_babel import get_locale -from flask_login import login_user, logout_user, login_required, current_user +from .cw_login import login_user, logout_user, current_user from flask_limiter import RateLimitExceeded from flask_limiter.util import get_remote_address from sqlalchemy.exc import IntegrityError, InvalidRequestError, OperationalError @@ -59,6 +59,8 @@ from .kobo_sync_status import change_archived_books from . import limiter from .services.worker import WorkerThread from .tasks_status import render_task_status +from .usermanagement import user_login_required +from .string_helper import strip_whitespaces feature_support = { @@ -88,21 +90,21 @@ except ImportError: def add_security_headers(resp): default_src = ([host.strip() for host in config.config_trustedhosts.split(',') if host] + ["'self'", "'unsafe-inline'", "'unsafe-eval'"]) - csp = "default-src " + ' '.join(default_src) + "; " - csp += "font-src 'self' data:" + csp = "default-src " + ' '.join(default_src) + if request.endpoint == "web.read_book" and config.config_use_google_drive: + csp +=" blob: " + csp += "; font-src 'self' data:" if request.endpoint == "web.read_book": - csp += " blob:" + csp += " blob: " csp += "; img-src 'self'" if request.path.startswith("/author/") and config.config_use_goodreads: csp += " images.gr-assets.com i.gr-assets.com s.gr-assets.com" csp += " data:" if request.endpoint == "edit-book.show_edit_book" or config.config_use_google_drive: - csp += " *;" - elif request.endpoint == "web.read_book": - csp += " blob:; style-src-elem 'self' blob: 'unsafe-inline';" - else: - csp += ";" - csp += " object-src 'none';" + csp += " *" + if request.endpoint == "web.read_book": + csp += " blob: ; style-src-elem 'self' blob: 'unsafe-inline'" + csp += "; object-src 'none';" resp.headers['Content-Security-Policy'] = csp resp.headers['X-Content-Type-Options'] = 'nosniff' resp.headers['X-Frame-Options'] = 'SAMEORIGIN' @@ -143,14 +145,14 @@ def viewer_required(f): @web.route("/ajax/emailstat") -@login_required +@user_login_required def get_email_status_json(): tasks = WorkerThread.get_instance().tasks return jsonify(render_task_status(tasks)) @web.route("/ajax/bookmark//", methods=['POST']) -@login_required +@user_login_required def set_bookmark(book_id, book_format): bookmark_key = request.form["bookmark"] ub.session.query(ub.Bookmark).filter(and_(ub.Bookmark.user_id == int(current_user.id), @@ -170,7 +172,7 @@ def set_bookmark(book_id, book_format): @web.route("/ajax/toggleread/", methods=['POST']) -@login_required +@user_login_required def toggle_read(book_id): message = edit_book_read_status(book_id) if message: @@ -180,11 +182,11 @@ def toggle_read(book_id): @web.route("/ajax/togglearchived/", methods=['POST']) -@login_required +@user_login_required def toggle_archived(book_id): - is_archived = change_archived_books(book_id, message="Book {} archive bit toggled".format(book_id)) - if is_archived: - remove_synced_book(book_id) + change_archived_books(book_id, message="Book {} archive bit toggled".format(book_id)) + # Remove book from syncd books list to force resync (?) + remove_synced_book(book_id) return "" @@ -204,7 +206,7 @@ def update_view(): ''' @web.route("/ajax/getcomic///") -@login_required +@user_login_required def get_comic_book(book_id, book_format, page): book = calibre_db.get_book(book_id) if not book: @@ -816,7 +818,7 @@ def books_list(data, sort_param, book_id, page): @web.route("/table") -@login_required +@user_login_required def books_table(): visibility = current_user.view_settings.get('table', {}) cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True) @@ -825,7 +827,7 @@ def books_table(): @web.route("/ajax/listbooks") -@login_required +@user_login_required def list_books(): off = int(request.args.get("offset") or 0) limit = int(request.args.get("limit") or config.config_books_per_page) @@ -906,7 +908,7 @@ def list_books(): @web.route("/ajax/table_settings", methods=['POST']) -@login_required +@user_login_required def update_table_settings(): current_user.view_settings['table'] = json.loads(request.data) try: @@ -1285,7 +1287,7 @@ def register_post(): if not config.get_mail_server_configured(): flash(_("Oops! Email server is not configured, please contact your administrator."), category="error") return render_title_template('register.html', title=_("Register"), page="register") - nickname = to_save.get("email", "").strip() if config.config_register_email else to_save.get('name') + nickname = strip_whitespaces(to_save.get("email", "")) if config.config_register_email else to_save.get('name') if not nickname or not to_save.get("email"): flash(_("Oops! Please complete all fields."), category="error") return render_title_template('register.html', title=_("Register"), page="register") @@ -1310,7 +1312,7 @@ def register_post(): ub.session.commit() if feature_support['oauth']: register_user_with_oauth(content) - send_registration_mail(to_save.get("email", "").strip(), nickname, password) + send_registration_mail(strip_whitespaces(to_save.get("email", "")), nickname, password) except Exception: ub.session.rollback() flash(_("Oops! An unknown error occurred. Please try again later."), category="error") @@ -1339,7 +1341,6 @@ def register(): def handle_login_user(user, remember, message, category): login_user(user, remember=remember) - ub.store_user_session() flash(message, category=category) [limiter.limiter.storage.clear(k.key) for k in limiter.current_limits] return redirect(get_redirect_location(request.form.get('next', None), "web.index")) @@ -1370,11 +1371,11 @@ def login(): @web.route('/login', methods=['POST']) -@limiter.limit("40/day", key_func=lambda: request.form.get('username', "").strip().lower()) -@limiter.limit("3/minute", key_func=lambda: request.form.get('username', "").strip().lower()) +@limiter.limit("40/day", key_func=lambda: strip_whitespaces(request.form.get('username', "")).lower()) +@limiter.limit("3/minute", key_func=lambda: strip_whitespaces(request.form.get('username', "")).lower()) def login_post(): form = request.form.to_dict() - username = form.get('username', "").strip().lower().replace("\n","").replace("\r","") + username = strip_whitespaces(form.get('username', "")).lower().replace("\n","").replace("\r","") try: limiter.check() except RateLimitExceeded: @@ -1443,7 +1444,7 @@ def login_post(): @web.route('/logout') -@login_required +@user_login_required def logout(): if current_user is not None and current_user.is_authenticated: ub.delete_user_session(current_user.id, flask_session.get('_id', "")) @@ -1528,7 +1529,7 @@ def change_profile(kobo_support, local_oauth_check, oauth_status, translations, @web.route("/me", methods=["GET", "POST"]) -@login_required +@user_login_required def profile(): languages = calibre_db.speaking_language() translations = get_available_locale() diff --git a/messages.pot b/messages.pot index c47abff7..11fc0a55 100644 --- a/messages.pot +++ b/messages.pot @@ -8,446 +8,446 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-07-07 10:17+0200\n" +"POT-Creation-Date: 2024-08-17 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.15.0\n" -#: cps/about.py:84 +#: cps/about.py:88 msgid "Statistics" msgstr "" -#: cps/admin.py:150 +#: cps/admin.py:151 msgid "Server restarted, please reload page." msgstr "" -#: cps/admin.py:152 +#: cps/admin.py:153 msgid "Performing Server shutdown, please close window." msgstr "" -#: cps/admin.py:160 +#: cps/admin.py:161 msgid "Success! Database Reconnected" msgstr "" -#: cps/admin.py:163 +#: cps/admin.py:164 msgid "Unknown command" msgstr "" -#: cps/admin.py:174 +#: cps/admin.py:175 msgid "Success! Books queued for Metadata Backup, please check Tasks for result" msgstr "" -#: cps/admin.py:207 cps/editbooks.py:573 cps/editbooks.py:575 -#: cps/editbooks.py:615 cps/editbooks.py:658 cps/editbooks.py:1280 -#: cps/updater.py:615 cps/uploader.py:93 cps/uploader.py:102 +#: cps/admin.py:208 cps/editbooks.py:579 cps/editbooks.py:581 +#: cps/editbooks.py:625 cps/editbooks.py:668 cps/editbooks.py:1290 +#: cps/updater.py:615 cps/uploader.py:104 cps/uploader.py:113 msgid "Unknown" msgstr "" -#: cps/admin.py:232 +#: cps/admin.py:233 msgid "Admin page" msgstr "" -#: cps/admin.py:252 +#: cps/admin.py:253 msgid "Basic Configuration" msgstr "" -#: cps/admin.py:290 +#: cps/admin.py:291 msgid "UI Configuration" msgstr "" -#: cps/admin.py:324 cps/templates/admin.html:51 +#: cps/admin.py:325 cps/templates/admin.html:51 msgid "Edit Users" msgstr "" -#: cps/admin.py:368 cps/opds.py:542 cps/templates/grid.html:14 +#: cps/admin.py:369 cps/opds.py:543 cps/templates/grid.html:14 #: cps/templates/list.html:13 msgid "All" msgstr "" -#: cps/admin.py:395 cps/admin.py:1414 +#: cps/admin.py:396 cps/admin.py:1415 msgid "User not found" msgstr "" -#: cps/admin.py:409 +#: cps/admin.py:410 msgid "{} users deleted successfully" msgstr "" -#: cps/admin.py:432 cps/templates/config_view_edit.html:133 +#: cps/admin.py:433 cps/templates/config_view_edit.html:133 #: cps/templates/user_edit.html:45 cps/templates/user_table.html:81 msgid "Show All" msgstr "" -#: cps/admin.py:453 cps/admin.py:459 +#: cps/admin.py:454 cps/admin.py:460 msgid "Malformed request" msgstr "" -#: cps/admin.py:471 cps/admin.py:2046 +#: cps/admin.py:472 cps/admin.py:2046 msgid "Guest Name can't be changed" msgstr "" -#: cps/admin.py:483 +#: cps/admin.py:484 msgid "Guest can't have this role" msgstr "" -#: cps/admin.py:495 cps/admin.py:2000 +#: cps/admin.py:496 cps/admin.py:2000 msgid "No admin user remaining, can't remove admin role" msgstr "" -#: cps/admin.py:499 cps/admin.py:513 +#: cps/admin.py:500 cps/admin.py:514 msgid "Value has to be true or false" msgstr "" -#: cps/admin.py:501 +#: cps/admin.py:502 msgid "Invalid role" msgstr "" -#: cps/admin.py:505 +#: cps/admin.py:506 msgid "Guest can't have this view" msgstr "" -#: cps/admin.py:515 +#: cps/admin.py:516 msgid "Invalid view" msgstr "" -#: cps/admin.py:518 +#: cps/admin.py:519 msgid "Guest's Locale is determined automatically and can't be set" msgstr "" -#: cps/admin.py:522 +#: cps/admin.py:523 msgid "No Valid Locale Given" msgstr "" -#: cps/admin.py:533 +#: cps/admin.py:534 msgid "No Valid Book Language Given" msgstr "" -#: cps/admin.py:535 cps/editbooks.py:440 +#: cps/admin.py:536 cps/editbooks.py:446 msgid "Parameter not found" msgstr "" -#: cps/admin.py:572 +#: cps/admin.py:573 msgid "Invalid Read Column" msgstr "" -#: cps/admin.py:578 +#: cps/admin.py:579 msgid "Invalid Restricted Column" msgstr "" -#: cps/admin.py:598 cps/admin.py:1871 +#: cps/admin.py:599 cps/admin.py:1871 msgid "Calibre-Web configuration updated" msgstr "" -#: cps/admin.py:610 +#: cps/admin.py:611 msgid "Do you really want to delete the Kobo Token?" msgstr "" -#: cps/admin.py:612 +#: cps/admin.py:613 msgid "Do you really want to delete this domain?" msgstr "" -#: cps/admin.py:614 +#: cps/admin.py:615 msgid "Do you really want to delete this user?" msgstr "" -#: cps/admin.py:616 +#: cps/admin.py:617 msgid "Are you sure you want to delete this shelf?" msgstr "" -#: cps/admin.py:618 +#: cps/admin.py:619 msgid "Are you sure you want to change locales of selected user(s)?" msgstr "" -#: cps/admin.py:620 +#: cps/admin.py:621 msgid "Are you sure you want to change visible book languages for selected user(s)?" msgstr "" -#: cps/admin.py:622 +#: cps/admin.py:623 msgid "Are you sure you want to change the selected role for the selected user(s)?" msgstr "" -#: cps/admin.py:624 +#: cps/admin.py:625 msgid "Are you sure you want to change the selected restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:626 +#: cps/admin.py:627 msgid "Are you sure you want to change the selected visibility restrictions for the selected user(s)?" msgstr "" -#: cps/admin.py:629 +#: cps/admin.py:630 msgid "Are you sure you want to change shelf sync behavior for the selected user(s)?" msgstr "" -#: cps/admin.py:631 +#: cps/admin.py:632 msgid "Are you sure you want to change Calibre library location?" msgstr "" -#: cps/admin.py:633 +#: cps/admin.py:634 msgid "Calibre-Web will search for updated Covers and update Cover Thumbnails, this may take a while?" msgstr "" -#: cps/admin.py:636 +#: cps/admin.py:637 msgid "Are you sure you want delete Calibre-Web's sync database to force a full sync with your Kobo Reader?" msgstr "" -#: cps/admin.py:879 cps/admin.py:885 cps/admin.py:895 cps/admin.py:905 +#: cps/admin.py:880 cps/admin.py:886 cps/admin.py:896 cps/admin.py:906 #: cps/templates/modal_dialogs.html:29 cps/templates/user_table.html:41 #: cps/templates/user_table.html:58 msgid "Deny" msgstr "" -#: cps/admin.py:881 cps/admin.py:887 cps/admin.py:897 cps/admin.py:907 +#: cps/admin.py:882 cps/admin.py:888 cps/admin.py:898 cps/admin.py:908 #: cps/templates/modal_dialogs.html:28 cps/templates/user_table.html:44 #: cps/templates/user_table.html:61 msgid "Allow" msgstr "" -#: cps/admin.py:940 +#: cps/admin.py:941 msgid "{} sync entries deleted" msgstr "" -#: cps/admin.py:981 +#: cps/admin.py:982 msgid "Tag not found" msgstr "" -#: cps/admin.py:993 +#: cps/admin.py:994 msgid "Invalid Action" msgstr "" -#: cps/admin.py:1120 +#: cps/admin.py:1121 msgid "client_secrets.json Is Not Configured For Web Application" msgstr "" -#: cps/admin.py:1165 +#: cps/admin.py:1166 msgid "Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1171 +#: cps/admin.py:1172 msgid "Access Logfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1205 +#: cps/admin.py:1206 msgid "Please Enter a LDAP Provider, Port, DN and User Object Identifier" msgstr "" -#: cps/admin.py:1211 +#: cps/admin.py:1212 msgid "Please Enter a LDAP Service Account and Password" msgstr "" -#: cps/admin.py:1214 +#: cps/admin.py:1215 msgid "Please Enter a LDAP Service Account" msgstr "" -#: cps/admin.py:1219 +#: cps/admin.py:1220 #, python-format msgid "LDAP Group Object Filter Needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1221 +#: cps/admin.py:1222 msgid "LDAP Group Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1225 +#: cps/admin.py:1226 #, python-format msgid "LDAP User Object Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1227 +#: cps/admin.py:1228 msgid "LDAP User Object Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1234 +#: cps/admin.py:1235 #, python-format msgid "LDAP Member User Filter needs to Have One \"%s\" Format Identifier" msgstr "" -#: cps/admin.py:1236 +#: cps/admin.py:1237 msgid "LDAP Member User Filter Has Unmatched Parenthesis" msgstr "" -#: cps/admin.py:1243 +#: cps/admin.py:1244 msgid "LDAP CACertificate, Certificate or Key Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1274 cps/templates/admin.html:53 +#: cps/admin.py:1275 cps/templates/admin.html:53 msgid "Add New User" msgstr "" -#: cps/admin.py:1283 cps/templates/admin.html:100 +#: cps/admin.py:1284 cps/templates/admin.html:100 msgid "Edit Email Server Settings" msgstr "" -#: cps/admin.py:1302 +#: cps/admin.py:1303 msgid "Success! Gmail Account Verified." msgstr "" -#: cps/admin.py:1322 cps/admin.py:1325 cps/admin.py:1710 cps/admin.py:1855 -#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:226 -#: cps/editbooks.py:303 cps/editbooks.py:1242 cps/shelf.py:90 cps/shelf.py:150 +#: cps/admin.py:1323 cps/admin.py:1326 cps/admin.py:1711 cps/admin.py:1855 +#: cps/admin.py:1953 cps/admin.py:2074 cps/editbooks.py:228 +#: cps/editbooks.py:309 cps/editbooks.py:1252 cps/shelf.py:90 cps/shelf.py:150 #: cps/shelf.py:193 cps/shelf.py:243 cps/shelf.py:280 cps/shelf.py:354 -#: cps/shelf.py:468 cps/tasks/convert.py:153 cps/web.py:1520 +#: cps/shelf.py:471 cps/tasks/convert.py:156 cps/web.py:1528 #, python-format msgid "Oops! Database Error: %(error)s." msgstr "" -#: cps/admin.py:1332 +#: cps/admin.py:1333 #, python-format msgid "Test e-mail queued for sending to %(email)s, please check Tasks for result" msgstr "" -#: cps/admin.py:1335 +#: cps/admin.py:1336 #, python-format msgid "There was an error sending the Test e-mail: %(res)s" msgstr "" -#: cps/admin.py:1337 +#: cps/admin.py:1338 msgid "Please configure your e-mail address first..." msgstr "" -#: cps/admin.py:1339 +#: cps/admin.py:1340 msgid "Email Server Settings updated" msgstr "" -#: cps/admin.py:1362 cps/templates/admin.html:195 +#: cps/admin.py:1363 cps/templates/admin.html:195 msgid "Edit Scheduled Tasks Settings" msgstr "" -#: cps/admin.py:1374 +#: cps/admin.py:1375 msgid "Invalid start time for task specified" msgstr "" -#: cps/admin.py:1379 +#: cps/admin.py:1380 msgid "Invalid duration for task specified" msgstr "" -#: cps/admin.py:1389 +#: cps/admin.py:1390 msgid "Scheduled tasks settings updated" msgstr "" -#: cps/admin.py:1399 cps/admin.py:1448 cps/admin.py:2070 cps/web.py:1316 +#: cps/admin.py:1400 cps/admin.py:1449 cps/admin.py:2070 cps/web.py:1318 msgid "Oops! An unknown error occurred. Please try again later." msgstr "" -#: cps/admin.py:1403 +#: cps/admin.py:1404 msgid "Settings DB is not Writeable" msgstr "" -#: cps/admin.py:1433 cps/admin.py:2062 +#: cps/admin.py:1434 cps/admin.py:2062 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/admin.py:1445 +#: cps/admin.py:1446 #, python-format msgid "Success! Password for user %(user)s reset" msgstr "" -#: cps/admin.py:1451 +#: cps/admin.py:1452 msgid "Oops! Please configure the SMTP mail settings." msgstr "" -#: cps/admin.py:1462 +#: cps/admin.py:1463 msgid "Logfile viewer" msgstr "" -#: cps/admin.py:1528 +#: cps/admin.py:1529 msgid "Requesting update package" msgstr "" -#: cps/admin.py:1529 +#: cps/admin.py:1530 msgid "Downloading update package" msgstr "" -#: cps/admin.py:1530 +#: cps/admin.py:1531 msgid "Unzipping update package" msgstr "" -#: cps/admin.py:1531 +#: cps/admin.py:1532 msgid "Replacing files" msgstr "" -#: cps/admin.py:1532 +#: cps/admin.py:1533 msgid "Database connections are closed" msgstr "" -#: cps/admin.py:1533 +#: cps/admin.py:1534 msgid "Stopping server" msgstr "" -#: cps/admin.py:1534 +#: cps/admin.py:1535 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/admin.py:1535 cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 -#: cps/admin.py:1539 cps/admin.py:1540 +#: cps/admin.py:1536 cps/admin.py:1537 cps/admin.py:1538 cps/admin.py:1539 +#: cps/admin.py:1540 cps/admin.py:1541 msgid "Update failed:" msgstr "" -#: cps/admin.py:1535 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 +#: cps/admin.py:1536 cps/updater.py:391 cps/updater.py:626 cps/updater.py:628 msgid "HTTP Error" msgstr "" -#: cps/admin.py:1536 cps/updater.py:393 cps/updater.py:630 +#: cps/admin.py:1537 cps/updater.py:393 cps/updater.py:630 msgid "Connection error" msgstr "" -#: cps/admin.py:1537 cps/updater.py:395 cps/updater.py:632 +#: cps/admin.py:1538 cps/updater.py:395 cps/updater.py:632 msgid "Timeout while establishing connection" msgstr "" -#: cps/admin.py:1538 cps/updater.py:397 cps/updater.py:634 +#: cps/admin.py:1539 cps/updater.py:397 cps/updater.py:634 msgid "General error" msgstr "" -#: cps/admin.py:1539 +#: cps/admin.py:1540 msgid "Update file could not be saved in temp dir" msgstr "" -#: cps/admin.py:1540 +#: cps/admin.py:1541 msgid "Files could not be replaced during update" msgstr "" -#: cps/admin.py:1564 +#: cps/admin.py:1565 msgid "Failed to extract at least One LDAP User" msgstr "" -#: cps/admin.py:1609 +#: cps/admin.py:1610 msgid "Failed to Create at Least One LDAP User" msgstr "" -#: cps/admin.py:1622 +#: cps/admin.py:1623 #, python-format msgid "Error: %(ldaperror)s" msgstr "" -#: cps/admin.py:1626 +#: cps/admin.py:1627 msgid "Error: No user returned in response of LDAP server" msgstr "" -#: cps/admin.py:1662 +#: cps/admin.py:1663 msgid "At Least One LDAP User Not Found in Database" msgstr "" -#: cps/admin.py:1664 +#: cps/admin.py:1665 msgid "{} User Successfully Imported" msgstr "" -#: cps/admin.py:1722 +#: cps/admin.py:1723 msgid "DB Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1742 +#: cps/admin.py:1743 msgid "DB is not Writeable" msgstr "" -#: cps/admin.py:1758 +#: cps/admin.py:1759 msgid "Keyfile Location is not Valid, Please Enter Correct Path" msgstr "" -#: cps/admin.py:1762 +#: cps/admin.py:1763 msgid "Certfile Location is not Valid, Please Enter Correct Path" msgstr "" @@ -463,7 +463,7 @@ msgstr "" msgid "Database Configuration" msgstr "" -#: cps/admin.py:1917 cps/web.py:1290 +#: cps/admin.py:1917 cps/web.py:1292 msgid "Oops! Please complete all fields." msgstr "" @@ -497,7 +497,7 @@ msgstr "" msgid "No admin user remaining, can't delete user" msgstr "" -#: cps/admin.py:2040 cps/web.py:1469 +#: cps/admin.py:2040 cps/web.py:1477 msgid "Email can't be empty and has to be a valid Email" msgstr "" @@ -514,127 +514,127 @@ msgstr "" msgid "Execution permissions missing" msgstr "" -#: cps/db.py:768 cps/search.py:137 cps/web.py:747 +#: cps/db.py:767 cps/search.py:150 cps/web.py:749 #, python-format msgid "Custom Column No.%(column)d does not exist in calibre database" msgstr "" #: cps/db.py:1008 cps/templates/config_edit.html:203 #: cps/templates/config_view_edit.html:62 cps/templates/email_edit.html:41 -#: cps/web.py:562 cps/web.py:596 cps/web.py:641 cps/web.py:681 cps/web.py:708 -#: cps/web.py:989 cps/web.py:1019 cps/web.py:1064 cps/web.py:1092 -#: cps/web.py:1131 +#: cps/web.py:564 cps/web.py:598 cps/web.py:643 cps/web.py:683 cps/web.py:710 +#: cps/web.py:991 cps/web.py:1021 cps/web.py:1066 cps/web.py:1094 +#: cps/web.py:1133 msgid "None" msgstr "" -#: cps/editbooks.py:108 cps/editbooks.py:929 cps/web.py:529 cps/web.py:1561 -#: cps/web.py:1606 cps/web.py:1651 +#: cps/editbooks.py:109 cps/editbooks.py:939 cps/web.py:531 cps/web.py:1569 +#: cps/web.py:1614 cps/web.py:1659 msgid "Oops! Selected book is unavailable. File does not exist or is not accessible" msgstr "" -#: cps/editbooks.py:151 cps/editbooks.py:1263 +#: cps/editbooks.py:153 cps/editbooks.py:1273 msgid "User has no rights to upload cover" msgstr "" -#: cps/editbooks.py:171 cps/editbooks.py:744 +#: cps/editbooks.py:173 cps/editbooks.py:754 msgid "Identifiers are not Case Sensitive, Overwriting Old Identifier" msgstr "" -#: cps/editbooks.py:213 +#: cps/editbooks.py:215 msgid "Metadata successfully updated" msgstr "" -#: cps/editbooks.py:231 +#: cps/editbooks.py:233 msgid "Error editing book: {}" msgstr "" -#: cps/editbooks.py:289 +#: cps/editbooks.py:295 #, python-format msgid "File %(file)s uploaded" msgstr "" -#: cps/editbooks.py:317 +#: cps/editbooks.py:323 msgid "Source or destination format for conversion missing" msgstr "" -#: cps/editbooks.py:325 +#: cps/editbooks.py:331 #, python-format msgid "Book successfully queued for converting to %(book_format)s" msgstr "" -#: cps/editbooks.py:329 +#: cps/editbooks.py:335 #, python-format msgid "There was an error converting this book: %(res)s" msgstr "" -#: cps/editbooks.py:662 +#: cps/editbooks.py:672 msgid "Uploaded book probably exists in the library, consider to change before upload new: " msgstr "" -#: cps/editbooks.py:718 cps/editbooks.py:1049 +#: cps/editbooks.py:728 cps/editbooks.py:1059 #, python-format msgid "'%(langname)s' is not a valid language" msgstr "" -#: cps/editbooks.py:756 cps/editbooks.py:1192 +#: cps/editbooks.py:766 cps/editbooks.py:1202 msgid "File type isn't allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:762 cps/editbooks.py:1202 +#: cps/editbooks.py:772 cps/editbooks.py:1212 #, python-format msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" msgstr "" -#: cps/editbooks.py:766 cps/editbooks.py:1206 +#: cps/editbooks.py:776 cps/editbooks.py:1216 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/editbooks.py:774 +#: cps/editbooks.py:784 #, python-format msgid "File %(filename)s could not saved to temp dir" msgstr "" -#: cps/editbooks.py:794 +#: cps/editbooks.py:804 #, python-format msgid "Failed to Move Cover File %(file)s: %(error)s" msgstr "" -#: cps/editbooks.py:851 cps/editbooks.py:853 +#: cps/editbooks.py:861 cps/editbooks.py:863 msgid "Book Format Successfully Deleted" msgstr "" -#: cps/editbooks.py:860 cps/editbooks.py:862 +#: cps/editbooks.py:870 cps/editbooks.py:872 msgid "Book Successfully Deleted" msgstr "" -#: cps/editbooks.py:914 +#: cps/editbooks.py:924 msgid "You are missing permissions to delete books" msgstr "" -#: cps/editbooks.py:964 +#: cps/editbooks.py:974 msgid "edit metadata" msgstr "" -#: cps/editbooks.py:1013 +#: cps/editbooks.py:1023 #, python-format -msgid "%(seriesindex)s is not a valid number, skipping" +msgid "Seriesindex: %(seriesindex)s is not a valid number, skipping" msgstr "" -#: cps/editbooks.py:1197 +#: cps/editbooks.py:1207 msgid "User has no rights to upload additional file formats" msgstr "" -#: cps/editbooks.py:1218 +#: cps/editbooks.py:1228 #, python-format msgid "Failed to create path %(path)s (Permission denied)." msgstr "" -#: cps/editbooks.py:1224 +#: cps/editbooks.py:1234 #, python-format msgid "Failed to store file %(file)s." msgstr "" -#: cps/editbooks.py:1248 +#: cps/editbooks.py:1258 #, python-format msgid "File format %(ext)s added to %(book)s" msgstr "" @@ -647,468 +647,468 @@ msgstr "" msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" msgstr "" -#: cps/helper.py:86 +#: cps/helper.py:87 #, python-format msgid "%(format)s format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 cps/tasks/convert.py:89 +#: cps/helper.py:94 cps/tasks/convert.py:90 #, python-format msgid "%(format)s not found on Google Drive: %(fn)s" msgstr "" -#: cps/helper.py:98 +#: cps/helper.py:99 #, python-format msgid "%(format)s not found: %(fn)s" msgstr "" -#: cps/helper.py:103 cps/helper.py:228 cps/templates/detail.html:58 +#: cps/helper.py:104 cps/helper.py:233 cps/templates/detail.html:58 msgid "Send to eReader" msgstr "" -#: cps/helper.py:104 cps/helper.py:122 cps/helper.py:230 +#: cps/helper.py:105 cps/helper.py:125 cps/helper.py:235 msgid "This Email has been sent via Calibre-Web." msgstr "" -#: cps/helper.py:120 +#: cps/helper.py:123 msgid "Calibre-Web Test Email" msgstr "" -#: cps/helper.py:121 +#: cps/helper.py:124 msgid "Test Email" msgstr "" -#: cps/helper.py:138 +#: cps/helper.py:141 msgid "Get Started with Calibre-Web" msgstr "" -#: cps/helper.py:143 +#: cps/helper.py:146 #, python-format msgid "Registration Email for user: %(name)s" msgstr "" -#: cps/helper.py:154 cps/helper.py:160 +#: cps/helper.py:157 cps/helper.py:163 #, python-format msgid "Convert %(orig)s to %(format)s and send to eReader" msgstr "" -#: cps/helper.py:179 cps/helper.py:183 cps/helper.py:187 +#: cps/helper.py:182 cps/helper.py:186 cps/helper.py:190 #, python-format msgid "Send %(format)s to eReader" msgstr "" -#: cps/helper.py:227 +#: cps/helper.py:230 #, python-format msgid "%(book)s send to eReader" msgstr "" -#: cps/helper.py:232 +#: cps/helper.py:237 msgid "The requested file could not be read. Maybe wrong permissions?" msgstr "" -#: cps/helper.py:347 +#: cps/helper.py:352 msgid "Read status could not set: {}" msgstr "" -#: cps/helper.py:370 +#: cps/helper.py:375 #, python-format msgid "Deleting bookfolder for book %(id)s failed, path has subfolders: %(path)s" msgstr "" -#: cps/helper.py:376 +#: cps/helper.py:381 #, python-format msgid "Deleting book %(id)s failed: %(message)s" msgstr "" -#: cps/helper.py:387 +#: cps/helper.py:392 #, python-format msgid "Deleting book %(id)s from database only, book path in database not valid: %(path)s" msgstr "" -#: cps/helper.py:463 +#: cps/helper.py:441 #, python-format msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:534 cps/helper.py:543 +#: cps/helper.py:512 cps/helper.py:521 #, python-format msgid "File %(file)s not found on Google Drive" msgstr "" -#: cps/helper.py:584 +#: cps/helper.py:562 #, python-format msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" msgstr "" -#: cps/helper.py:622 +#: cps/helper.py:600 #, python-format msgid "Book path %(path)s not found on Google Drive" msgstr "" -#: cps/helper.py:682 +#: cps/helper.py:660 msgid "Found an existing account for this Email address" msgstr "" -#: cps/helper.py:690 +#: cps/helper.py:668 msgid "This username is already taken" msgstr "" -#: cps/helper.py:702 +#: cps/helper.py:681 msgid "Invalid Email address format" msgstr "" -#: cps/helper.py:723 +#: cps/helper.py:702 msgid "Password doesn't comply with password validation rules" msgstr "" -#: cps/helper.py:870 +#: cps/helper.py:848 msgid "Python module 'advocate' is not installed but is needed for cover uploads" msgstr "" -#: cps/helper.py:880 +#: cps/helper.py:858 msgid "Error Downloading Cover" msgstr "" -#: cps/helper.py:883 +#: cps/helper.py:861 msgid "Cover Format Error" msgstr "" -#: cps/helper.py:886 +#: cps/helper.py:864 msgid "You are not allowed to access localhost or the local network for cover uploads" msgstr "" -#: cps/helper.py:896 +#: cps/helper.py:874 msgid "Failed to create path for cover" msgstr "" -#: cps/helper.py:912 +#: cps/helper.py:890 msgid "Cover-file is not a valid image file, or could not be stored" msgstr "" -#: cps/helper.py:923 +#: cps/helper.py:901 msgid "Only jpg/jpeg/png/webp/bmp files are supported as coverfile" msgstr "" -#: cps/helper.py:935 +#: cps/helper.py:913 msgid "Invalid cover file content" msgstr "" -#: cps/helper.py:939 +#: cps/helper.py:917 msgid "Only jpg/jpeg files are supported as coverfile" msgstr "" -#: cps/helper.py:1011 cps/helper.py:1168 +#: cps/helper.py:989 cps/helper.py:1146 msgid "Cover" msgstr "" -#: cps/helper.py:1028 +#: cps/helper.py:1006 msgid "UnRar binary file not found" msgstr "" -#: cps/helper.py:1039 +#: cps/helper.py:1017 msgid "Error executing UnRar" msgstr "" -#: cps/helper.py:1047 +#: cps/helper.py:1025 msgid "Could not find the specified directory" msgstr "" -#: cps/helper.py:1050 +#: cps/helper.py:1028 msgid "Please specify a directory, not a file" msgstr "" -#: cps/helper.py:1064 +#: cps/helper.py:1042 msgid "Calibre binaries not viable" msgstr "" -#: cps/helper.py:1073 +#: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" msgstr "" -#: cps/helper.py:1075 +#: cps/helper.py:1053 #, python-format msgid "Missing executable permissions: %(missing)s" msgstr "" -#: cps/helper.py:1080 +#: cps/helper.py:1058 msgid "Error executing Calibre" msgstr "" -#: cps/helper.py:1170 cps/templates/admin.html:216 +#: cps/helper.py:1148 cps/templates/admin.html:216 msgid "Queue all books for metadata backup" msgstr "" -#: cps/kobo_auth.py:90 +#: cps/kobo_auth.py:92 msgid "Please access Calibre-Web from non localhost to get valid api_endpoint for kobo device" msgstr "" -#: cps/kobo_auth.py:116 +#: cps/kobo_auth.py:118 msgid "Kobo Setup" msgstr "" -#: cps/oauth_bb.py:77 +#: cps/oauth_bb.py:78 #, python-format msgid "Register with %(provider)s" msgstr "" -#: cps/oauth_bb.py:138 cps/remotelogin.py:130 +#: cps/oauth_bb.py:139 cps/remotelogin.py:131 #, python-format msgid "Success! You are now logged in as: %(nickname)s" msgstr "" -#: cps/oauth_bb.py:148 +#: cps/oauth_bb.py:149 #, python-format msgid "Link to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:155 +#: cps/oauth_bb.py:156 msgid "Login failed, No User Linked With OAuth Account" msgstr "" -#: cps/oauth_bb.py:197 +#: cps/oauth_bb.py:198 #, python-format msgid "Unlink to %(oauth)s Succeeded" msgstr "" -#: cps/oauth_bb.py:202 +#: cps/oauth_bb.py:203 #, python-format msgid "Unlink to %(oauth)s Failed" msgstr "" -#: cps/oauth_bb.py:205 +#: cps/oauth_bb.py:206 #, python-format msgid "Not Linked to %(oauth)s" msgstr "" -#: cps/oauth_bb.py:262 +#: cps/oauth_bb.py:263 msgid "Failed to log in with GitHub." msgstr "" -#: cps/oauth_bb.py:268 +#: cps/oauth_bb.py:269 msgid "Failed to fetch user info from GitHub." msgstr "" -#: cps/oauth_bb.py:280 +#: cps/oauth_bb.py:281 msgid "Failed to log in with Google." msgstr "" -#: cps/oauth_bb.py:286 +#: cps/oauth_bb.py:287 msgid "Failed to fetch user info from Google." msgstr "" -#: cps/oauth_bb.py:334 +#: cps/oauth_bb.py:335 msgid "GitHub Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:337 +#: cps/oauth_bb.py:338 msgid "GitHub Oauth error: {}" msgstr "" -#: cps/oauth_bb.py:358 +#: cps/oauth_bb.py:359 msgid "Google Oauth error, please retry later." msgstr "" -#: cps/oauth_bb.py:361 +#: cps/oauth_bb.py:362 msgid "Google Oauth error: {}" msgstr "" -#: cps/opds.py:298 +#: cps/opds.py:299 msgid "{} Stars" msgstr "" -#: cps/remotelogin.py:62 cps/templates/layout.html:67 +#: cps/remotelogin.py:63 cps/templates/layout.html:67 #: cps/templates/layout.html:101 cps/templates/login.html:4 -#: cps/templates/login.html:21 cps/web.py:1353 +#: cps/templates/login.html:21 cps/web.py:1354 msgid "Login" msgstr "" -#: cps/remotelogin.py:74 cps/remotelogin.py:108 +#: cps/remotelogin.py:75 cps/remotelogin.py:109 msgid "Token not found" msgstr "" -#: cps/remotelogin.py:83 cps/remotelogin.py:116 +#: cps/remotelogin.py:84 cps/remotelogin.py:117 msgid "Token has expired" msgstr "" -#: cps/remotelogin.py:92 +#: cps/remotelogin.py:93 msgid "Success! Please return to your device" msgstr "" -#: cps/render_template.py:42 cps/web.py:418 +#: cps/render_template.py:41 cps/web.py:420 msgid "Books" msgstr "" -#: cps/render_template.py:44 +#: cps/render_template.py:43 msgid "Show recent books" msgstr "" -#: cps/render_template.py:45 cps/templates/index.xml:27 +#: cps/render_template.py:44 cps/templates/index.xml:27 msgid "Hot Books" msgstr "" -#: cps/render_template.py:47 +#: cps/render_template.py:46 msgid "Show Hot Books" msgstr "" -#: cps/render_template.py:49 cps/render_template.py:54 +#: cps/render_template.py:48 cps/render_template.py:53 msgid "Downloaded Books" msgstr "" -#: cps/render_template.py:51 cps/render_template.py:56 +#: cps/render_template.py:50 cps/render_template.py:55 #: cps/templates/user_table.html:167 msgid "Show Downloaded Books" msgstr "" -#: cps/render_template.py:59 cps/templates/index.xml:36 cps/web.py:433 +#: cps/render_template.py:58 cps/templates/index.xml:36 cps/web.py:435 msgid "Top Rated Books" msgstr "" -#: cps/render_template.py:61 cps/templates/user_table.html:161 +#: cps/render_template.py:60 cps/templates/user_table.html:161 msgid "Show Top Rated Books" msgstr "" -#: cps/render_template.py:62 cps/templates/index.xml:63 -#: cps/templates/index.xml:67 cps/web.py:766 +#: cps/render_template.py:61 cps/templates/index.xml:63 +#: cps/templates/index.xml:67 cps/web.py:768 msgid "Read Books" msgstr "" -#: cps/render_template.py:64 +#: cps/render_template.py:63 msgid "Show Read and Unread" msgstr "" -#: cps/render_template.py:66 cps/templates/index.xml:70 -#: cps/templates/index.xml:74 cps/web.py:769 +#: cps/render_template.py:65 cps/templates/index.xml:70 +#: cps/templates/index.xml:74 cps/web.py:771 msgid "Unread Books" msgstr "" -#: cps/render_template.py:68 +#: cps/render_template.py:67 msgid "Show unread" msgstr "" -#: cps/render_template.py:69 +#: cps/render_template.py:68 msgid "Discover" msgstr "" -#: cps/render_template.py:71 cps/templates/index.xml:58 +#: cps/render_template.py:70 cps/templates/index.xml:58 #: cps/templates/user_table.html:159 cps/templates/user_table.html:162 msgid "Show Random Books" msgstr "" -#: cps/render_template.py:72 cps/templates/book_table.html:67 -#: cps/templates/index.xml:97 cps/web.py:1135 +#: cps/render_template.py:71 cps/templates/book_table.html:67 +#: cps/templates/index.xml:97 cps/web.py:1137 msgid "Categories" msgstr "" -#: cps/render_template.py:74 cps/templates/user_table.html:158 +#: cps/render_template.py:73 cps/templates/user_table.html:158 msgid "Show Category Section" msgstr "" -#: cps/render_template.py:75 cps/templates/book_edit.html:91 +#: cps/render_template.py:74 cps/templates/book_edit.html:91 #: cps/templates/book_table.html:68 cps/templates/index.xml:106 -#: cps/templates/search_form.html:70 cps/web.py:1025 cps/web.py:1037 +#: cps/templates/search_form.html:70 cps/web.py:1027 cps/web.py:1039 msgid "Series" msgstr "" -#: cps/render_template.py:77 cps/templates/user_table.html:157 +#: cps/render_template.py:76 cps/templates/user_table.html:157 msgid "Show Series Section" msgstr "" -#: cps/render_template.py:78 cps/templates/book_table.html:66 +#: cps/render_template.py:77 cps/templates/book_table.html:66 #: cps/templates/index.xml:79 msgid "Authors" msgstr "" -#: cps/render_template.py:80 cps/templates/user_table.html:160 +#: cps/render_template.py:79 cps/templates/user_table.html:160 msgid "Show Author Section" msgstr "" -#: cps/render_template.py:82 cps/templates/book_table.html:72 -#: cps/templates/index.xml:88 cps/web.py:993 +#: cps/render_template.py:81 cps/templates/book_table.html:72 +#: cps/templates/index.xml:88 cps/web.py:995 msgid "Publishers" msgstr "" -#: cps/render_template.py:84 cps/templates/user_table.html:163 +#: cps/render_template.py:83 cps/templates/user_table.html:163 msgid "Show Publisher Section" msgstr "" -#: cps/render_template.py:85 cps/templates/book_table.html:70 +#: cps/render_template.py:84 cps/templates/book_table.html:70 #: cps/templates/index.xml:115 cps/templates/search_form.html:108 -#: cps/web.py:1107 +#: cps/web.py:1109 msgid "Languages" msgstr "" -#: cps/render_template.py:88 cps/templates/user_table.html:155 +#: cps/render_template.py:87 cps/templates/user_table.html:155 msgid "Show Language Section" msgstr "" -#: cps/render_template.py:89 cps/templates/index.xml:124 +#: cps/render_template.py:88 cps/templates/index.xml:124 msgid "Ratings" msgstr "" -#: cps/render_template.py:91 cps/templates/user_table.html:164 +#: cps/render_template.py:90 cps/templates/user_table.html:164 msgid "Show Ratings Section" msgstr "" -#: cps/render_template.py:92 cps/templates/index.xml:133 +#: cps/render_template.py:91 cps/templates/index.xml:133 msgid "File formats" msgstr "" -#: cps/render_template.py:94 cps/templates/user_table.html:165 +#: cps/render_template.py:93 cps/templates/user_table.html:165 msgid "Show File Formats Section" msgstr "" -#: cps/render_template.py:96 cps/web.py:792 +#: cps/render_template.py:95 cps/web.py:794 msgid "Archived Books" msgstr "" -#: cps/render_template.py:98 cps/templates/user_table.html:166 +#: cps/render_template.py:97 cps/templates/user_table.html:166 msgid "Show Archived Books" msgstr "" -#: cps/render_template.py:101 cps/web.py:823 +#: cps/render_template.py:100 cps/web.py:825 msgid "Books List" msgstr "" -#: cps/render_template.py:103 cps/templates/user_table.html:168 +#: cps/render_template.py:102 cps/templates/user_table.html:168 msgid "Show Books List" msgstr "" -#: cps/search.py:48 cps/search.py:399 cps/templates/book_edit.html:236 +#: cps/search.py:50 cps/search.py:425 cps/templates/book_edit.html:236 #: cps/templates/feed.xml:34 cps/templates/index.xml:12 #: cps/templates/layout.html:46 cps/templates/layout.html:49 -#: cps/templates/search_form.html:227 +#: cps/templates/search_form.html:247 msgid "Search" msgstr "" -#: cps/search.py:188 +#: cps/search.py:201 msgid "Published after " msgstr "" -#: cps/search.py:195 +#: cps/search.py:208 msgid "Published before " msgstr "" -#: cps/search.py:217 +#: cps/search.py:230 #, python-format msgid "Rating <= %(rating)s" msgstr "" -#: cps/search.py:219 +#: cps/search.py:232 #, python-format msgid "Rating >= %(rating)s" msgstr "" -#: cps/search.py:221 +#: cps/search.py:234 #, python-format msgid "Read Status = '%(status)s'" msgstr "" -#: cps/search.py:324 +#: cps/search.py:350 msgid "Error on search for custom columns, please restart Calibre-Web" msgstr "" -#: cps/search.py:343 cps/search.py:375 cps/templates/layout.html:57 +#: cps/search.py:369 cps/search.py:401 cps/templates/layout.html:57 msgid "Advanced Search" msgstr "" @@ -1216,45 +1216,45 @@ msgstr "" msgid "A private shelf with the name '%(title)s' already exists." msgstr "" -#: cps/shelf.py:473 +#: cps/shelf.py:476 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/shelf.py:477 +#: cps/shelf.py:480 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/tasks_status.py:46 cps/templates/layout.html:88 +#: cps/tasks_status.py:47 cps/templates/layout.html:88 #: cps/templates/tasks.html:7 msgid "Tasks" msgstr "" -#: cps/tasks_status.py:62 +#: cps/tasks_status.py:63 msgid "Waiting" msgstr "" -#: cps/tasks_status.py:64 +#: cps/tasks_status.py:65 msgid "Failed" msgstr "" -#: cps/tasks_status.py:66 +#: cps/tasks_status.py:67 msgid "Started" msgstr "" -#: cps/tasks_status.py:68 +#: cps/tasks_status.py:69 msgid "Finished" msgstr "" -#: cps/tasks_status.py:70 +#: cps/tasks_status.py:71 msgid "Ended" msgstr "" -#: cps/tasks_status.py:72 +#: cps/tasks_status.py:73 msgid "Cancelled" msgstr "" -#: cps/tasks_status.py:74 +#: cps/tasks_status.py:75 msgid "Unknown Status" msgstr "" @@ -1287,169 +1287,169 @@ msgstr "" msgid "No release information available" msgstr "" -#: cps/templates/index.html:6 cps/web.py:445 +#: cps/templates/index.html:6 cps/web.py:447 msgid "Discover (Random Books)" msgstr "" -#: cps/web.py:481 +#: cps/web.py:483 msgid "Hot Books (Most Downloaded)" msgstr "" -#: cps/web.py:512 +#: cps/web.py:514 #, python-format msgid "Downloaded books by %(user)s" msgstr "" -#: cps/web.py:545 +#: cps/web.py:547 #, python-format msgid "Author: %(name)s" msgstr "" -#: cps/web.py:581 +#: cps/web.py:583 #, python-format msgid "Publisher: %(name)s" msgstr "" -#: cps/web.py:609 +#: cps/web.py:611 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:623 +#: cps/web.py:625 msgid "Rating: None" msgstr "" -#: cps/web.py:632 +#: cps/web.py:634 #, python-format msgid "Rating: %(rating)s stars" msgstr "" -#: cps/web.py:663 +#: cps/web.py:665 #, python-format msgid "File format: %(format)s" msgstr "" -#: cps/web.py:698 +#: cps/web.py:700 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:727 +#: cps/web.py:729 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/admin.html:16 cps/web.py:965 +#: cps/templates/admin.html:16 cps/web.py:967 msgid "Downloads" msgstr "" -#: cps/web.py:1067 +#: cps/web.py:1069 msgid "Ratings list" msgstr "" -#: cps/web.py:1094 +#: cps/web.py:1096 msgid "File formats list" msgstr "" -#: cps/web.py:1249 +#: cps/web.py:1251 msgid "Please configure the SMTP mail settings first..." msgstr "" -#: cps/web.py:1256 +#: cps/web.py:1258 #, python-format msgid "Success! Book queued for sending to %(eReadermail)s" msgstr "" -#: cps/web.py:1259 +#: cps/web.py:1261 #, python-format msgid "Oops! There was an error sending book: %(res)s" msgstr "" -#: cps/web.py:1261 +#: cps/web.py:1263 msgid "Oops! Please update your profile with a valid eReader Email." msgstr "" -#: cps/web.py:1277 +#: cps/web.py:1279 msgid "Please wait one minute to register next user" msgstr "" #: cps/templates/layout.html:68 cps/templates/layout.html:102 -#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1278 -#: cps/web.py:1282 cps/web.py:1287 cps/web.py:1291 cps/web.py:1297 -#: cps/web.py:1317 cps/web.py:1321 cps/web.py:1334 cps/web.py:1337 +#: cps/templates/login.html:27 cps/templates/register.html:17 cps/web.py:1280 +#: cps/web.py:1284 cps/web.py:1289 cps/web.py:1293 cps/web.py:1299 +#: cps/web.py:1319 cps/web.py:1323 cps/web.py:1336 cps/web.py:1339 msgid "Register" msgstr "" -#: cps/web.py:1281 cps/web.py:1385 +#: cps/web.py:1283 cps/web.py:1386 msgid "Connection error to limiter backend, please contact your administrator" msgstr "" -#: cps/web.py:1286 cps/web.py:1333 +#: cps/web.py:1288 cps/web.py:1335 msgid "Oops! Email server is not configured, please contact your administrator." msgstr "" -#: cps/web.py:1319 +#: cps/web.py:1321 msgid "Oops! Your Email is not allowed." msgstr "" -#: cps/web.py:1322 +#: cps/web.py:1324 msgid "Success! Confirmation Email has been sent." msgstr "" -#: cps/web.py:1368 cps/web.py:1391 +#: cps/web.py:1369 cps/web.py:1392 msgid "Cannot activate LDAP authentication" msgstr "" -#: cps/web.py:1381 +#: cps/web.py:1382 msgid "Please wait one minute before next login" msgstr "" -#: cps/web.py:1400 +#: cps/web.py:1401 #, python-format msgid "you are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1407 +#: cps/web.py:1408 #, python-format msgid "Fallback Login as: '%(nickname)s', LDAP Server not reachable, or user not known" msgstr "" -#: cps/web.py:1412 +#: cps/web.py:1413 #, python-format msgid "Could not login: %(message)s" msgstr "" -#: cps/web.py:1416 cps/web.py:1441 +#: cps/web.py:1417 cps/web.py:1442 msgid "Wrong Username or Password" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1424 msgid "New Password was sent to your email address" msgstr "" -#: cps/web.py:1427 +#: cps/web.py:1428 msgid "An unknown error occurred. Please try again later." msgstr "" -#: cps/web.py:1429 +#: cps/web.py:1430 msgid "Please enter valid username to reset password" msgstr "" -#: cps/web.py:1437 +#: cps/web.py:1438 #, python-format msgid "You are now logged in as: '%(nickname)s'" msgstr "" -#: cps/web.py:1495 cps/web.py:1545 +#: cps/web.py:1503 cps/web.py:1553 #, python-format msgid "%(name)s's Profile" msgstr "" -#: cps/web.py:1511 +#: cps/web.py:1519 msgid "Success! Profile Updated" msgstr "" -#: cps/web.py:1515 +#: cps/web.py:1523 msgid "Oops! An account already exists for this Email." msgstr "" @@ -1457,54 +1457,58 @@ msgstr "" msgid "Found no valid gmail.json file with OAuth information" msgstr "" -#: cps/tasks/convert.py:108 +#: cps/tasks/clean.py:29 +msgid "Delete temp folder contents" +msgstr "" + +#: cps/tasks/convert.py:109 #, python-format msgid "%(book)s send to E-Reader" msgstr "" -#: cps/tasks/convert.py:170 +#: cps/tasks/convert.py:173 #, python-format msgid "Calibre ebook-convert %(tool)s not found" msgstr "" -#: cps/tasks/convert.py:204 +#: cps/tasks/convert.py:207 #, python-format msgid "%(format)s format not found on disk" msgstr "" -#: cps/tasks/convert.py:208 +#: cps/tasks/convert.py:211 msgid "Ebook converter failed with unknown error" msgstr "" -#: cps/tasks/convert.py:227 +#: cps/tasks/convert.py:230 #, python-format msgid "Kepubify-converter failed: %(error)s" msgstr "" -#: cps/tasks/convert.py:248 +#: cps/tasks/convert.py:251 #, python-format msgid "Converted file not found or more than one file in folder %(folder)s" msgstr "" -#: cps/tasks/convert.py:291 -#, python-format -msgid "Ebook-converter failed: %(error)s" -msgstr "" - -#: cps/tasks/convert.py:314 +#: cps/tasks/convert.py:283 cps/tasks/convert.py:325 #, python-format msgid "Calibre failed with error: %(error)s" msgstr "" -#: cps/tasks/convert.py:319 +#: cps/tasks/convert.py:302 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/tasks/convert.py:330 msgid "Convert" msgstr "" -#: cps/tasks/database.py:28 +#: cps/tasks/database.py:26 msgid "Reconnecting Calibre database" msgstr "" -#: cps/tasks/mail.py:278 +#: cps/tasks/mail.py:279 msgid "E-mail" msgstr "" @@ -1512,11 +1516,7 @@ msgstr "" msgid "Backing up Metadata" msgstr "" -#: cps/tasks/tempFolder.py:28 -msgid "Delete temp folder contents" -msgstr "" - -#: cps/tasks/thumbnail.py:97 +#: cps/tasks/thumbnail.py:96 #, python-format msgid "Generated %(count)s cover thumbnails" msgstr "" @@ -1554,7 +1554,7 @@ msgstr "" msgid "Email" msgstr "" -#: cps/templates/admin.html:15 cps/templates/user_edit.html:28 +#: cps/templates/admin.html:15 msgid "Send to eReader Email" msgstr "" @@ -1785,7 +1785,7 @@ msgstr "" #: cps/templates/modal_dialogs.html:64 cps/templates/modal_dialogs.html:99 #: cps/templates/modal_dialogs.html:117 cps/templates/modal_dialogs.html:135 #: cps/templates/schedule_edit.html:45 cps/templates/shelf_edit.html:27 -#: cps/templates/tasks.html:46 cps/templates/user_edit.html:144 +#: cps/templates/tasks.html:47 cps/templates/user_edit.html:144 msgid "Cancel" msgstr "" @@ -1837,7 +1837,7 @@ msgstr "" #: cps/templates/author.html:56 cps/templates/author.html:115 #: cps/templates/index.html:30 cps/templates/index.html:113 -#: cps/templates/search.html:67 cps/templates/shelf.html:55 +#: cps/templates/search.html:67 cps/templates/shelf.html:57 msgid "reduce" msgstr "" @@ -1944,12 +1944,12 @@ msgid "Language" msgstr "" #: cps/templates/book_edit.html:136 cps/templates/search_form.html:46 -#: cps/templates/search_form.html:165 +#: cps/templates/search_form.html:167 msgid "Yes" msgstr "" #: cps/templates/book_edit.html:137 cps/templates/search_form.html:47 -#: cps/templates/search_form.html:166 +#: cps/templates/search_form.html:168 msgid "No" msgstr "" @@ -2110,7 +2110,7 @@ msgid "Enter " msgstr "" #: cps/templates/book_table.html:113 cps/templates/modal_dialogs.html:46 -#: cps/templates/tasks.html:36 +#: cps/templates/tasks.html:37 msgid "Are you really sure?" msgstr "" @@ -2876,7 +2876,7 @@ msgstr "" msgid "Upload done, processing, please wait..." msgstr "" -#: cps/templates/layout.html:91 cps/templates/read.html:76 +#: cps/templates/layout.html:91 cps/templates/read.html:78 #: cps/templates/readcbr.html:70 cps/templates/readcbr.html:96 msgid "Settings" msgstr "" @@ -3013,7 +3013,7 @@ msgstr "" msgid "Select" msgstr "" -#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:45 +#: cps/templates/modal_dialogs.html:134 cps/templates/tasks.html:46 msgid "Ok" msgstr "" @@ -3021,34 +3021,70 @@ msgstr "" msgid "Calibre-Web eBook Catalog" msgstr "" -#: cps/templates/read.html:6 +#: cps/templates/read.html:7 msgid "epub Reader" msgstr "" -#: cps/templates/read.html:81 cps/templates/readcbr.html:104 +#: cps/templates/read.html:84 cps/templates/readcbr.html:104 msgid "Light" msgstr "" -#: cps/templates/read.html:82 cps/templates/readcbr.html:105 +#: cps/templates/read.html:86 cps/templates/readcbr.html:105 msgid "Dark" msgstr "" -#: cps/templates/read.html:83 +#: cps/templates/read.html:88 msgid "Sepia" msgstr "" -#: cps/templates/read.html:84 +#: cps/templates/read.html:90 msgid "Black" msgstr "" -#: cps/templates/read.html:88 +#: cps/templates/read.html:95 msgid "Reflow text when sidebars are open." msgstr "" -#: cps/templates/read.html:93 +#: cps/templates/read.html:100 msgid "Font Sizes" msgstr "" +#: cps/templates/read.html:105 +msgid "Font" +msgstr "" + +#: cps/templates/read.html:106 +msgid "Default" +msgstr "" + +#: cps/templates/read.html:107 +msgid "Yahei" +msgstr "" + +#: cps/templates/read.html:108 +msgid "SimSun" +msgstr "" + +#: cps/templates/read.html:109 +msgid "KaiTi" +msgstr "" + +#: cps/templates/read.html:110 +msgid "Arial" +msgstr "" + +#: cps/templates/read.html:113 +msgid "Spread" +msgstr "" + +#: cps/templates/read.html:114 +msgid "Two columns" +msgstr "" + +#: cps/templates/read.html:115 +msgid "One column" +msgstr "" + #: cps/templates/readcbr.html:8 msgid "Comic Reader" msgstr "" @@ -3245,11 +3281,11 @@ msgstr "" msgid "Published Date To" msgstr "" -#: cps/templates/search_form.html:44 +#: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" msgstr "" -#: cps/templates/search_form.html:45 +#: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" msgstr "" @@ -3285,11 +3321,13 @@ msgstr "" msgid "Rating Below" msgstr "" -#: cps/templates/search_form.html:181 +#: cps/templates/search_form.html:175 cps/templates/search_form.html:187 +#: cps/templates/search_form.html:201 msgid "From:" msgstr "" -#: cps/templates/search_form.html:191 +#: cps/templates/search_form.html:179 cps/templates/search_form.html:191 +#: cps/templates/search_form.html:211 msgid "To:" msgstr "" @@ -3313,6 +3351,14 @@ msgstr "" msgid "Enable Change order" msgstr "" +#: cps/templates/shelf.html:28 +msgid "Sort according to book added to shelf, newest first" +msgstr "" + +#: cps/templates/shelf.html:29 +msgid "Sort according to book added to shelf, oldest first" +msgstr "" + #: cps/templates/shelf_edit.html:14 msgid "Share with Everyone" msgstr "" @@ -3381,15 +3427,19 @@ msgstr "" msgid "Run Time" msgstr "" -#: cps/templates/tasks.html:20 +#: cps/templates/tasks.html:19 +msgid "Message" +msgstr "" + +#: cps/templates/tasks.html:21 msgid "Actions" msgstr "" -#: cps/templates/tasks.html:40 +#: cps/templates/tasks.html:41 msgid "This task will be cancelled. Any progress made by this task will be saved." msgstr "" -#: cps/templates/tasks.html:41 +#: cps/templates/tasks.html:42 msgid "If this is a scheduled task, it will be re-ran during the next scheduled time." msgstr "" @@ -3397,6 +3447,10 @@ msgstr "" msgid "Reset user Password" msgstr "" +#: cps/templates/user_edit.html:28 +msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" +msgstr "" + #: cps/templates/user_edit.html:43 msgid "Language of Books" msgstr "" diff --git a/optional-requirements.txt b/optional-requirements.txt index 3f6b6e37..0d715524 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -36,6 +36,7 @@ python-dateutil>=2.1,<2.10.0 beautifulsoup4>=4.0.1,<4.13.0 faust-cchardet>=2.1.18,<2.1.20 py7zr>=0.15.0,<0.21.0 +mutagen>=1.40.0,<1.50.0 # Comics natsort>=2.2.0,<8.5.0 @@ -43,6 +44,3 @@ comicapi>=2.2.0,<3.3.0 # Kobo integration jsonschema>=3.2.0,<4.24.0 - -# Hide console Window on Windows -pywin32>=220,<310 ; sys_platform == 'win32' diff --git a/requirements.txt b/requirements.txt index e7062a3a..71074892 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,6 @@ -Werkzeug<3.0.0 APScheduler>=3.6.3,<3.11.0 Babel>=1.3,<3.0 Flask-Babel>=0.11.1,<4.1.0 -Flask-Login>=0.3.2,<0.6.4 Flask-Principal>=0.3.2,<0.5.1 Flask>=1.0.2,<3.1.0 iso-639>=0.4.5,<0.5.0 @@ -15,9 +13,10 @@ Wand>=0.4.4,<0.7.0 unidecode>=0.04.19,<1.4.0 lxml>=4.9.1,<5.3.0 flask-wtf>=0.14.2,<1.3.0 -chardet>=3.0.0,<4.1.0 +chardet>=3.0.0,<5.3.0 advocate>=1.0.0,<1.1.0 -Flask-Limiter>=2.3.0,<3.6.0 +Flask-Limiter>=2.3.0,<3.9.0 regex>=2022.3.2,<2024.6.25 bleach>=6.0.0,<6.2.0 python-magic>=0.4.27,<0.5.0 +flask-httpAuth>=4.4.0,<5.0.0 diff --git a/setup.cfg b/setup.cfg index 5e0882e8..2d326d62 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,11 +38,9 @@ console_scripts = [options] include_package_data = True install_requires = - Werkzeug<3.0.0 APScheduler>=3.6.3,<3.11.0 Babel>=1.3,<3.0 Flask-Babel>=0.11.1,<4.1.0 - Flask-Login>=0.3.2,<0.6.4 Flask-Principal>=0.3.2,<0.5.1 Flask>=1.0.2,<3.1.0 iso-639>=0.4.5,<0.5.0 @@ -55,12 +53,13 @@ install_requires = unidecode>=0.04.19,<1.4.0 lxml>=4.9.1,<5.3.0 flask-wtf>=0.14.2,<1.3.0 - chardet>=3.0.0,<4.1.0 + chardet>=3.0.0,<5.3.0 advocate>=1.0.0,<1.1.0 - Flask-Limiter>=2.3.0,<3.6.0 + Flask-Limiter>=2.3.0,<3.9.0 regex>=2022.3.2,<2024.6.25 bleach>=6.0.0,<6.2.0 python-magic>=0.4.27,<0.5.0 + flask-httpAuth>=4.4.0,<5.0.0 [options.packages.find] @@ -101,9 +100,10 @@ metadata = beautifulsoup4>=4.0.1,<4.13.0 faust-cchardet>=2.1.18,<2.1.20 py7zr>=0.15.0,<0.21.0 + mutagen>=1.40.0,<1.50.0 comics = natsort>=2.2.0,<8.5.0 comicapi>=2.2.0,<3.3.0 kobo = - jsonschema>=3.2.0,<4.23.0 + jsonschema>=3.2.0,<4.24.0 diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html index c5f120c0..ed5f5134 100644 --- a/test/Calibre-Web TestSummary_Linux.html +++ b/test/Calibre-Web TestSummary_Linux.html @@ -37,20 +37,20 @@
-

Start Time: 2024-07-10 20:16:18

+

Start Time: 2024-08-15 19:27:26

-

Stop Time: 2024-07-11 03:24:32

+

Stop Time: 2024-08-16 02:42:05

-

Duration: 5h 56 min

+

Duration: 6h 5 min

@@ -852,11 +852,11 @@ - + TestEbookConvertCalibreGDrive 7 - 7 - 0 + 6 + 1 0 0 @@ -920,53 +920,114 @@ - +
TestEbookConvertCalibreGDrive - test_thumbnail_cache
- PASS + +
+ FAIL +
+ + + + - - TestEbookConvertKepubify - 3 - 3 + + _FailedTest + 2 0 0 + 2 0 - Detail + Detail - + -
TestEbookConvertKepubify - test_convert_deactivate
+
_FailedTest - test_ebook_convert_kepubify
+ + +
+ ERROR +
+ + + - PASS - + -
TestEbookConvertKepubify - test_convert_only
+
_FailedTest - test_pip_install
- PASS - - - - - - -
TestEbookConvertKepubify - test_convert_wrong_excecutable
+ +
+ ERROR +
+ + + - PASS @@ -1228,13 +1289,13 @@ TestEditBooks - 38 + 37 36 0 0 - 2 + 1 - Detail + Detail @@ -1437,33 +1498,7 @@ - - -
TestEditBooks - test_rename_uppercase_lowercase
- - -
- SKIP -
- - - - - - - - - +
TestEditBooks - test_typeahead_author
@@ -1472,7 +1507,7 @@ - +
TestEditBooks - test_typeahead_functions
@@ -1481,7 +1516,7 @@ - +
TestEditBooks - test_typeahead_language
@@ -1490,7 +1525,7 @@ - +
TestEditBooks - test_typeahead_publisher
@@ -1499,7 +1534,7 @@ - +
TestEditBooks - test_typeahead_series
@@ -1508,7 +1543,7 @@ - +
TestEditBooks - test_typeahead_tag
@@ -1517,7 +1552,7 @@ - +
TestEditBooks - test_upload_book_cb7
@@ -1526,7 +1561,7 @@ - +
TestEditBooks - test_upload_book_cbr
@@ -1535,7 +1570,7 @@ - +
TestEditBooks - test_upload_book_cbt
@@ -1544,7 +1579,7 @@ - +
TestEditBooks - test_upload_book_cbz
@@ -1553,7 +1588,7 @@ - +
TestEditBooks - test_upload_book_epub
@@ -1562,7 +1597,7 @@ - +
TestEditBooks - test_upload_book_fb2
@@ -1571,7 +1606,7 @@ - +
TestEditBooks - test_upload_book_lit
@@ -1580,7 +1615,7 @@ - +
TestEditBooks - test_upload_book_mobi
@@ -1589,7 +1624,7 @@ - +
TestEditBooks - test_upload_book_pdf
@@ -1598,7 +1633,7 @@ - +
TestEditBooks - test_upload_cbz_coverformats
@@ -1607,7 +1642,7 @@ - +
TestEditBooks - test_upload_cover_hdd
@@ -1792,14 +1827,14 @@ - TestEditBooksList - 19 - 19 + TestEditAuthorsSmb + 9 + 9 0 0 0 - Detail + Detail @@ -1807,7 +1842,7 @@ -
TestEditBooksList - test_booklist_xss
+
TestEditAuthorsSmb - test_change_capital_co_author
PASS @@ -1816,7 +1851,7 @@ -
TestEditBooksList - test_bookslist_edit_author
+
TestEditAuthorsSmb - test_change_capital_one_author_one_book
PASS @@ -1825,7 +1860,7 @@ -
TestEditBooksList - test_bookslist_edit_categories
+
TestEditAuthorsSmb - test_change_capital_one_author_two_books
PASS @@ -1834,7 +1869,7 @@ -
TestEditBooksList - test_bookslist_edit_comment
+
TestEditAuthorsSmb - test_change_capital_one_author_two_books_coauthor
PASS @@ -1843,7 +1878,7 @@ -
TestEditBooksList - test_bookslist_edit_cust_category
+
TestEditAuthorsSmb - test_change_capital_rename_co_author
PASS @@ -1852,7 +1887,7 @@ -
TestEditBooksList - test_bookslist_edit_cust_comment
+
TestEditAuthorsSmb - test_change_capital_rename_two_co_authors
PASS @@ -1861,7 +1896,7 @@ -
TestEditBooksList - test_bookslist_edit_cust_enum
+
TestEditAuthorsSmb - test_rename_author_emphasis_mark_onupload
PASS @@ -1870,7 +1905,7 @@ -
TestEditBooksList - test_bookslist_edit_cust_float
+
TestEditAuthorsSmb - test_rename_capital_on_upload
PASS @@ -1878,6 +1913,102 @@ + +
TestEditAuthorsSmb - test_rename_tag_emphasis_mark_onupload
+ + PASS + + + + + + + TestEditBooksList + 19 + 19 + 0 + 0 + 0 + + Detail + + + + + + + +
TestEditBooksList - test_booklist_xss
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_author
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_categories
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_comment
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_cust_category
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_cust_comment
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_cust_enum
+ + PASS + + + + + + +
TestEditBooksList - test_bookslist_edit_cust_float
+ + PASS + + + + +
TestEditBooksList - test_bookslist_edit_cust_int
@@ -1886,7 +2017,7 @@ - +
TestEditBooksList - test_bookslist_edit_cust_ratings
@@ -1895,7 +2026,7 @@ - +
TestEditBooksList - test_bookslist_edit_cust_text
@@ -1904,7 +2035,7 @@ - +
TestEditBooksList - test_bookslist_edit_languages
@@ -1913,7 +2044,7 @@ - +
TestEditBooksList - test_bookslist_edit_publisher
@@ -1922,7 +2053,7 @@ - +
TestEditBooksList - test_bookslist_edit_series
@@ -1931,7 +2062,7 @@ - +
TestEditBooksList - test_bookslist_edit_seriesindex
@@ -1940,7 +2071,7 @@ - +
TestEditBooksList - test_bookslist_edit_title
@@ -1949,7 +2080,7 @@ - +
TestEditBooksList - test_list_visibility
@@ -1958,7 +2089,7 @@ - +
TestEditBooksList - test_restricted_rights
@@ -1967,7 +2098,7 @@ - +
TestEditBooksList - test_search_books_list
@@ -1985,31 +2116,31 @@ 1 0 - Detail + Detail - +
TestLoadMetadata - test_load_metadata
- ERROR + ERROR
-