From 9657645fad2e66bc93cc32de9cc7555ce0d7adb3 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 11 Jan 2024 21:45:34 +0000 Subject: [PATCH 01/21] feat: adds a certificate template modifier adds a management command to modify certificate templates, with a dry run option. Inherently unsafe; just as a search and replace on the first string match. TODO: * unit tests * make sure the multi-line string replacements work via django admin FIXES: APER-2851 --- .../commands/modify_cert_template.py | 98 ++++++++++++++ lms/djangoapps/certificates/models.py | 39 +++++- lms/djangoapps/certificates/tasks.py | 127 ++++++++++++++++-- 3 files changed, 247 insertions(+), 17 deletions(-) create mode 100644 lms/djangoapps/certificates/management/commands/modify_cert_template.py diff --git a/lms/djangoapps/certificates/management/commands/modify_cert_template.py b/lms/djangoapps/certificates/management/commands/modify_cert_template.py new file mode 100644 index 000000000000..4c4c3baba630 --- /dev/null +++ b/lms/djangoapps/certificates/management/commands/modify_cert_template.py @@ -0,0 +1,98 @@ +"""Management command to modify certificate templates. +""" + +import logging +import shlex +from argparse import RawDescriptionHelpFormatter + +from django.core.management.base import BaseCommand, CommandError + +from lms.djangoapps.certificates.models import ( + ModifiedCertificateTemplateCommandConfiguration, +) +from lms.djangoapps.certificates.tasks import handle_modify_cert_template + +log = logging.getLogger(__name__) + + +class Command(BaseCommand): + """Management command to modify certificate templates. + + Example usage: + ./manage.py lms modify_cert_template --old-text + """ + + help = """Modify one or more certificate templates. + + This is DANGEROUS. + * This uses string replacement to modify HTML-like templates, because the presence of + Django Templating makes it impossible to do true parsing. + * This isn't parameterizing the replacement text, for the same reason. It has + no way of knowing what is template language and what is HTML. + + Do not trust that this will get the conversion right without verification, + and absolutely do not accepted untrusted user input for the replacement text. This is + to be run by trusted users only. + + Always run this with dry-run or in a reliable test environment. + """ + + def add_arguments(self, parser): + parser.formatter_class = RawDescriptionHelpFormatter + parser.add_argument( + "--dry-run", + action="store_true", + help="Just show a preview of what would happen.", + ) + parser.add_argument( + "--old-text", + required=True, + help="Text to replace in the template.", + ) + parser.add_argument( + "--new-text", + required=True, + help="Replacement text for the template.", + ) + parser.add_argument( + "--templates", + nargs="+", + required=True, + help="Certificate templates to modify.", + ) + parser.add_argument( + "--args-from-database", + action="store_true", + help="Use arguments from the ModifyCertificateTemplateConfiguration model instead of the command line.", + ) + + def get_args_from_database(self): + """ + Returns an options dictionary from the current CertificateGenerationCommandConfiguration model. + """ + config = ModifiedCertificateTemplateCommandConfiguration.current() + if not config.enabled: + raise CommandError( + "ModifyCertificateTemplateCommandConfiguration is disabled, but --args-from-database was requested" + ) + + args = shlex.split(config.arguments) + parser = self.create_parser("manage.py", "modify_cert_template") + + return vars(parser.parse_args(args)) + + def handle(self, *args, **options): + # database args will override cmd line args + if options["args_from_database"]: + options = self.get_args_from_database() + + log.info( + "modify_cert_template starting, dry-run={dry_run}, templates={templates}, old-text={old}, new-text={new}".format( + dry_run=options["dry_run"], + templates=options["templates"], + old=options["old_text"], + new=options["new_text"], + ) + ) + + handle_modify_cert_template.delay(options) diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index fa16112f3add..ef4466b5dbd8 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -2,11 +2,11 @@ Course certificates are created for a student and an offering of a course (a course run). """ -from datetime import timezone import json import logging import os import uuid +from datetime import timezone from config_models.models import ConfigurationModel from django.apps import apps @@ -16,11 +16,21 @@ from django.db import models, transaction from django.db.models import Count from django.dispatch import receiver - from django.utils.translation import gettext_lazy as _ from model_utils import Choices from model_utils.models import TimeStampedModel from opaque_keys.edx.django.models import CourseKeyField +from openedx_events.learning.data import ( # lint-amnesty, pylint: disable=wrong-import-order + CertificateData, + CourseData, + UserData, + UserPersonalData, +) +from openedx_events.learning.signals import ( # lint-amnesty, pylint: disable=wrong-import-order + CERTIFICATE_CHANGED, + CERTIFICATE_CREATED, + CERTIFICATE_REVOKED, +) from simple_history.models import HistoricalRecords from common.djangoapps.student import models_api as student_api @@ -32,9 +42,6 @@ from openedx.core.djangoapps.xmodule_django.models import NoneToEmptyManager from openedx.features.name_affirmation_api.utils import get_name_affirmation_service -from openedx_events.learning.data import CourseData, UserData, UserPersonalData, CertificateData # lint-amnesty, pylint: disable=wrong-import-order -from openedx_events.learning.signals import CERTIFICATE_CHANGED, CERTIFICATE_CREATED, CERTIFICATE_REVOKED # lint-amnesty, pylint: disable=wrong-import-order - log = logging.getLogger(__name__) User = get_user_model() @@ -1242,6 +1249,28 @@ class Meta: get_latest_by = 'created' app_label = "certificates" +class ModifiedCertificateTemplateCommandConfiguration(ConfigurationModel): + """ + Manages configuration for a run of the modify_cert_template management command. + + .. no_pii: + """ + + class Meta: + app_label = "certificates" + verbose_name = "modify_cert_template argument" + + arguments = models.TextField( + blank=True, + help_text=( + "Arguments for the 'modify_cert_template' management command. Specify like '-template_ids '" + ), + default="", + ) + + def __str__(self): + return str(self.arguments) + class CertificateGenerationCommandConfiguration(ConfigurationModel): """ diff --git a/lms/djangoapps/certificates/tasks.py b/lms/djangoapps/certificates/tasks.py index 6d524352c378..2b710626d264 100644 --- a/lms/djangoapps/certificates/tasks.py +++ b/lms/djangoapps/certificates/tasks.py @@ -1,17 +1,20 @@ """ -Tasks that generate a course certificate for a user +Tasks that operate on course certificates for a user """ +from difflib import unified_diff from logging import getLogger +from typing import Any, Dict from celery import shared_task -from celery_utils.persist_on_failure import LoggedPersistOnFailureTask +from celery_utils.persist_on_failure import LoggedPersistOnFailureTask, LoggedTask from django.contrib.auth import get_user_model from edx_django_utils.monitoring import set_code_owner_attribute from opaque_keys.edx.keys import CourseKey from lms.djangoapps.certificates.data import CertificateStatuses from lms.djangoapps.certificates.generation import generate_course_certificate +from lms.djangoapps.certificates.models import CertificateTemplate log = getLogger(__name__) User = get_user_model() @@ -21,7 +24,9 @@ CERTIFICATE_DELAY_SECONDS = 2 -@shared_task(base=LoggedPersistOnFailureTask, bind=True, default_retry_delay=30, max_retries=2) +@shared_task( + base=LoggedPersistOnFailureTask, bind=True, default_retry_delay=30, max_retries=2 +) @set_code_owner_attribute def generate_certificate(self, **kwargs): # pylint: disable=unused-argument """ @@ -37,12 +42,110 @@ def generate_certificate(self, **kwargs): # pylint: disable=unused-argument - generation_mode: Used when emitting an event. Options are "self" (implying the user generated the cert themself) and "batch" for everything else. Defaults to 'batch'. """ - student = User.objects.get(id=kwargs.pop('student')) - course_key = CourseKey.from_string(kwargs.pop('course_key')) - status = kwargs.pop('status', CertificateStatuses.downloadable) - enrollment_mode = kwargs.pop('enrollment_mode') - course_grade = kwargs.pop('course_grade', '') - generation_mode = kwargs.pop('generation_mode', 'batch') - - generate_course_certificate(user=student, course_key=course_key, status=status, enrollment_mode=enrollment_mode, - course_grade=course_grade, generation_mode=generation_mode) + student = User.objects.get(id=kwargs.pop("student")) + course_key = CourseKey.from_string(kwargs.pop("course_key")) + status = kwargs.pop("status", CertificateStatuses.downloadable) + enrollment_mode = kwargs.pop("enrollment_mode") + course_grade = kwargs.pop("course_grade", "") + generation_mode = kwargs.pop("generation_mode", "batch") + + generate_course_certificate( + user=student, + course_key=course_key, + status=status, + enrollment_mode=enrollment_mode, + course_grade=course_grade, + generation_mode=generation_mode, + ) + + +@shared_task(base=LoggedTask, ignore_result=True) +@set_code_owner_attribute +def handle_modify_cert_template(options: Dict[str, Any]): + """ + Celery task to handle the modify_cert_template management command. + + Args: + FIXME + template_ids (list[string]): List of template IDs for this run. + """ + + template_ids = options["templates"] + if not template_ids: + template_ids = [] + + # FIXME Check to see if there was that particular logging configuration + log.info( + "[modify_cert_template] Attempting to modify {num} templates".format( + num=len(template_ids) + ) + ) + templates_changed = 0 + for template_id in template_ids: + template = None + try: + template = CertificateTemplate.objects.get(id=template_id) + except CertificateTemplate.DoesNotExist: + log.warning(f"Template {template_id} could not be found") + if template is not None: + log.info( + "[modify_cert_template] Calling for template {template_id} : {name}".format( + template_id=template_id, name=template.description + ) + ) + new_template = get_modified_template_text( + template.template, options["old_text"], options["new_text"] + ) + if template.template == new_template: + log.info( + "[modify_cert_template] No changes to {template_id}".format( + template_id=template_id + ) + ) + else: + log.info( + "[modify_cert_template] Modifying template {template} ({description})".format( + template=template_id, + description=template.description, + ) + ) + templates_changed += 1 + if not options["dry_run"]: + template.template = new_template + template.save() + else: + log.info( + "DRY-RUN: Not making the following template change to {id}.".format( + id=template_id + ) + ) + log.info( + "\n".join( + unified_diff( + template.template.splitlines(), + new_template.splitlines(), + lineterm="", + fromfile="old_template", + tofile="new_template", + ) + ), + ) + # FIXME commit templates_to_change + log.info( + "[modify_cert_template] Modified {num} templates".format(num=templates_changed) + ) + + +def get_modified_template_text( + template_text: str, + old: str, + new: str, +): + """ + Returns the original template text with the first instance of `old` replaced with `new`. + Case-sensitive. + + Although this is a trivial method, it's factored into its own method to allow us to + write unit tests that can be easily modified if the testing algorithm is made more complex. + """ + return template_text.replace(old, new, 1) From 18027adfae18f1c38b0d3b6887a9abfb1e9b9f0f Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 11 Jan 2024 21:56:12 +0000 Subject: [PATCH 02/21] feat: reordering includes undid my auto formatters reordering of the includes, because I'm assuming that's what the lint-amnesty directives are there for. Best practice would have a human-written comment explaining why they need to stay there, but I'm just going have to assume it's correct, Because no such human-written comment exists. FIXES: APER-2851 --- lms/djangoapps/certificates/models.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index ef4466b5dbd8..91a8f52a8b1a 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -20,17 +20,6 @@ from model_utils import Choices from model_utils.models import TimeStampedModel from opaque_keys.edx.django.models import CourseKeyField -from openedx_events.learning.data import ( # lint-amnesty, pylint: disable=wrong-import-order - CertificateData, - CourseData, - UserData, - UserPersonalData, -) -from openedx_events.learning.signals import ( # lint-amnesty, pylint: disable=wrong-import-order - CERTIFICATE_CHANGED, - CERTIFICATE_CREATED, - CERTIFICATE_REVOKED, -) from simple_history.models import HistoricalRecords from common.djangoapps.student import models_api as student_api @@ -42,6 +31,9 @@ from openedx.core.djangoapps.xmodule_django.models import NoneToEmptyManager from openedx.features.name_affirmation_api.utils import get_name_affirmation_service +from openedx_events.learning.data import CourseData, UserData, UserPersonalData, CertificateData # lint-amnesty, pylint: disable=wrong-import-order +from openedx_events.learning.signals import CERTIFICATE_CHANGED, CERTIFICATE_CREATED, CERTIFICATE_REVOKED # lint-amnesty, pylint: disable=wrong-import-order + log = logging.getLogger(__name__) User = get_user_model() From ce48516c90334536c816ba67567c06987ca5d036 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 11 Jan 2024 22:08:48 +0000 Subject: [PATCH 03/21] feat: fixing a long line problem fixing a long line problem FIXES: APER-2851 --- .../certificates/management/commands/modify_cert_template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lms/djangoapps/certificates/management/commands/modify_cert_template.py b/lms/djangoapps/certificates/management/commands/modify_cert_template.py index 4c4c3baba630..747ef68e0ba7 100644 --- a/lms/djangoapps/certificates/management/commands/modify_cert_template.py +++ b/lms/djangoapps/certificates/management/commands/modify_cert_template.py @@ -87,7 +87,8 @@ def handle(self, *args, **options): options = self.get_args_from_database() log.info( - "modify_cert_template starting, dry-run={dry_run}, templates={templates}, old-text={old}, new-text={new}".format( + "modify_cert_template starting, dry-run={dry_run}, templates={templates}, " + "old-text={old}, new-text={new}".format( dry_run=options["dry_run"], templates=options["templates"], old=options["old_text"], From 3ac66de476e4e18048d4d85b204be49019050d27 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 11 Jan 2024 22:17:19 +0000 Subject: [PATCH 04/21] feat: adding migration adding the migration for the ability to manage these command configs via django admin FIXES: APER-2851 --- ...certificatetemplatecommandconfiguration.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py diff --git a/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py b/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py new file mode 100644 index 000000000000..d318a7463659 --- /dev/null +++ b/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.23 on 2024-01-11 22:12 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('certificates', '0035_auto_20230808_0944'), + ] + + operations = [ + migrations.CreateModel( + name='ModifiedCertificateTemplateCommandConfiguration', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')), + ('enabled', models.BooleanField(default=False, verbose_name='Enabled')), + ('arguments', models.TextField(blank=True, default='', help_text="Arguments for the 'modify_cert_template' management command. Specify like '-template_ids '")), + ('changed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Changed by')), + ], + options={ + 'verbose_name': 'modify_cert_template argument', + }, + ), + ] From 392110bdda16494b013d22b5b11a87d3b329e303 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 11 Jan 2024 22:27:47 +0000 Subject: [PATCH 05/21] feat: pep8 fixes pep8 FIXES: APER-2851 --- .../management/commands/modify_cert_template.py | 13 ++----------- lms/djangoapps/certificates/models.py | 1 + 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/lms/djangoapps/certificates/management/commands/modify_cert_template.py b/lms/djangoapps/certificates/management/commands/modify_cert_template.py index 747ef68e0ba7..f30051461729 100644 --- a/lms/djangoapps/certificates/management/commands/modify_cert_template.py +++ b/lms/djangoapps/certificates/management/commands/modify_cert_template.py @@ -1,6 +1,5 @@ """Management command to modify certificate templates. """ - import logging import shlex from argparse import RawDescriptionHelpFormatter @@ -17,23 +16,19 @@ class Command(BaseCommand): """Management command to modify certificate templates. - Example usage: ./manage.py lms modify_cert_template --old-text """ help = """Modify one or more certificate templates. - - This is DANGEROUS. + This is DANGEROUS. * This uses string replacement to modify HTML-like templates, because the presence of - Django Templating makes it impossible to do true parsing. + Django Templating makes it impossible to do true parsing. * This isn't parameterizing the replacement text, for the same reason. It has no way of knowing what is template language and what is HTML. - Do not trust that this will get the conversion right without verification, and absolutely do not accepted untrusted user input for the replacement text. This is to be run by trusted users only. - Always run this with dry-run or in a reliable test environment. """ @@ -75,17 +70,14 @@ def get_args_from_database(self): raise CommandError( "ModifyCertificateTemplateCommandConfiguration is disabled, but --args-from-database was requested" ) - args = shlex.split(config.arguments) parser = self.create_parser("manage.py", "modify_cert_template") - return vars(parser.parse_args(args)) def handle(self, *args, **options): # database args will override cmd line args if options["args_from_database"]: options = self.get_args_from_database() - log.info( "modify_cert_template starting, dry-run={dry_run}, templates={templates}, " "old-text={old}, new-text={new}".format( @@ -95,5 +87,4 @@ def handle(self, *args, **options): new=options["new_text"], ) ) - handle_modify_cert_template.delay(options) diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index 91a8f52a8b1a..1798881c8199 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -1241,6 +1241,7 @@ class Meta: get_latest_by = 'created' app_label = "certificates" + class ModifiedCertificateTemplateCommandConfiguration(ConfigurationModel): """ Manages configuration for a run of the modify_cert_template management command. From cccb960f209722063beeff1acdfa9cca773ddd1d Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Tue, 16 Jan 2024 23:07:51 +0000 Subject: [PATCH 06/21] feat:tests for certificate template modifier still needs mocks for all tests to work FIXES: APER-2851 --- lms/djangoapps/certificates/admin.py | 8 +- .../commands/modify_cert_template.py | 13 +- .../tests/test_modify_certs_template.py | 47 +++++++ ...certificatetemplatecommandconfiguration.py | 4 +- lms/djangoapps/certificates/models.py | 3 +- lms/djangoapps/certificates/tasks.py | 6 +- .../certificates/tests/factories.py | 26 +++- .../certificates/tests/test_tasks.py | 121 ++++++++++++++---- 8 files changed, 183 insertions(+), 45 deletions(-) create mode 100644 lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py diff --git a/lms/djangoapps/certificates/admin.py b/lms/djangoapps/certificates/admin.py index 8b98a2c97151..3facf6f6b530 100644 --- a/lms/djangoapps/certificates/admin.py +++ b/lms/djangoapps/certificates/admin.py @@ -20,7 +20,8 @@ CertificateHtmlViewConfiguration, CertificateTemplate, CertificateTemplateAsset, - GeneratedCertificate + GeneratedCertificate, + ModifiedCertificateTemplateCommandConfiguration, ) @@ -92,6 +93,11 @@ class CertificateGenerationCourseSettingAdmin(admin.ModelAdmin): show_full_result_count = False +@admin.register(ModifiedCertificateTemplateCommandConfiguration) +class ModifiedCertificateTemplateCommandConfigurationAdmin(ConfigurationModelAdmin): + pass + + @admin.register(CertificateGenerationCommandConfiguration) class CertificateGenerationCommandConfigurationAdmin(ConfigurationModelAdmin): pass diff --git a/lms/djangoapps/certificates/management/commands/modify_cert_template.py b/lms/djangoapps/certificates/management/commands/modify_cert_template.py index f30051461729..d720c628e6d6 100644 --- a/lms/djangoapps/certificates/management/commands/modify_cert_template.py +++ b/lms/djangoapps/certificates/management/commands/modify_cert_template.py @@ -1,5 +1,4 @@ -"""Management command to modify certificate templates. -""" +"""Management command to modify certificate templates.""" import logging import shlex from argparse import RawDescriptionHelpFormatter @@ -41,18 +40,15 @@ def add_arguments(self, parser): ) parser.add_argument( "--old-text", - required=True, help="Text to replace in the template.", ) parser.add_argument( "--new-text", - required=True, help="Replacement text for the template.", ) parser.add_argument( "--templates", nargs="+", - required=True, help="Certificate templates to modify.", ) parser.add_argument( @@ -63,7 +59,7 @@ def add_arguments(self, parser): def get_args_from_database(self): """ - Returns an options dictionary from the current CertificateGenerationCommandConfiguration model. + Returns an options dictionary from the current ModifiedCertificateTemplateCommandConfiguration instance. """ config = ModifiedCertificateTemplateCommandConfiguration.current() if not config.enabled: @@ -78,6 +74,11 @@ def handle(self, *args, **options): # database args will override cmd line args if options["args_from_database"]: options = self.get_args_from_database() + # Check required arguments here. We can't rely on marking args "required" because they might come from django + if not (options["old_text"] and options["new_text"] and options["templates"]): + raise CommandError( + "The following arguments are required: --old-text, --new-text, --templates" + ) log.info( "modify_cert_template starting, dry-run={dry_run}, templates={templates}, " "old-text={old}, new-text={new}".format( diff --git a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py new file mode 100644 index 000000000000..2ab242d101f6 --- /dev/null +++ b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py @@ -0,0 +1,47 @@ +""" +Tests for the modify_cert_template command +""" + +import pytest +from django.core.management import CommandError, call_command +from django.test import ( + TestCase, + override_settings, +) # lint-amnesty, pylint: disable=unused-import + + +class ModifyCertTemplateTests(TestCase): + """Tests for the modify_cert_template management command""" + + def setUp(self): + super().setUp() + + def test_command_with_missing_param_old_text(self): + """Verify command with a missing param --old-text.""" + with pytest.raises( + CommandError, + match="The following arguments are required: --old-text, --new-text, --templates", + ): + call_command( + "modify_cert_template", "--new-text", "blah", "--templates", "1 2 3" + ) + + def test_command_with_missing_param_new_text(self): + """Verify command with a missing param --new-text.""" + with pytest.raises( + CommandError, + match="The following arguments are required: --old-text, --new-text, --templates", + ): + call_command( + "modify_cert_template", "--old-text", "blah", "--templates", "1 2 3" + ) + + def test_command_with_missing_param_old_text(self): + """Verify command with a missing param --templates.""" + with pytest.raises( + CommandError, + match="The following arguments are required: --old-text, --new-text, --templates", + ): + call_command( + "modify_cert_template", "--new-text", "blah", "--old-text", "xyzzy" + ) diff --git a/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py b/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py index d318a7463659..ebc6cfd95b9a 100644 --- a/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py +++ b/lms/djangoapps/certificates/migrations/0036_modifiedcertificatetemplatecommandconfiguration.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.23 on 2024-01-11 22:12 +# Generated by Django 3.2.23 on 2024-01-16 18:57 from django.conf import settings from django.db import migrations, models @@ -19,7 +19,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')), ('enabled', models.BooleanField(default=False, verbose_name='Enabled')), - ('arguments', models.TextField(blank=True, default='', help_text="Arguments for the 'modify_cert_template' management command. Specify like '-template_ids '")), + ('arguments', models.TextField(blank=True, default='', help_text='Arguments for the \'modify_cert_template\' management command. Specify like \'--old-text "foo" --new-text "bar" --template_ids \'')), ('changed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Changed by')), ], options={ diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index 1798881c8199..9c58327b99aa 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -1256,7 +1256,8 @@ class Meta: arguments = models.TextField( blank=True, help_text=( - "Arguments for the 'modify_cert_template' management command. Specify like '-template_ids '" + "Arguments for the 'modify_cert_template' management command. Specify like '--old-text \"foo\" " + "--new-text \"bar\" --template_ids '" ), default="", ) diff --git a/lms/djangoapps/certificates/tasks.py b/lms/djangoapps/certificates/tasks.py index 2b710626d264..06078e346105 100644 --- a/lms/djangoapps/certificates/tasks.py +++ b/lms/djangoapps/certificates/tasks.py @@ -66,15 +66,16 @@ def handle_modify_cert_template(options: Dict[str, Any]): Celery task to handle the modify_cert_template management command. Args: - FIXME + old_text (string): Text in the template of which the first instance should be changed + new_text (string): Replacement text for old_text template_ids (list[string]): List of template IDs for this run. + dry_run (boolean): Don't do the work, just report the changes that would happen """ template_ids = options["templates"] if not template_ids: template_ids = [] - # FIXME Check to see if there was that particular logging configuration log.info( "[modify_cert_template] Attempting to modify {num} templates".format( num=len(template_ids) @@ -130,7 +131,6 @@ def handle_modify_cert_template(options: Dict[str, Any]): ) ), ) - # FIXME commit templates_to_change log.info( "[modify_cert_template] Modified {num} templates".format(num=templates_changed) ) diff --git a/lms/djangoapps/certificates/tests/factories.py b/lms/djangoapps/certificates/tests/factories.py index 15d5386aa445..ad7727876076 100644 --- a/lms/djangoapps/certificates/tests/factories.py +++ b/lms/djangoapps/certificates/tests/factories.py @@ -6,6 +6,7 @@ import datetime from uuid import uuid4 +from factory import Sequence from factory.django import DjangoModelFactory from common.djangoapps.student.models import LinkedInAddToProfileConfiguration @@ -15,7 +16,8 @@ CertificateHtmlViewConfiguration, CertificateInvalidation, CertificateStatuses, - GeneratedCertificate + CertificateTemplate, + GeneratedCertificate, ) @@ -23,15 +25,16 @@ class GeneratedCertificateFactory(DjangoModelFactory): """ GeneratedCertificate factory """ + class Meta: model = GeneratedCertificate course_id = None status = CertificateStatuses.unavailable mode = GeneratedCertificate.MODES.honor - name = '' + name = "" verify_uuid = uuid4().hex - grade = '' + grade = "" class CertificateAllowlistFactory(DjangoModelFactory): @@ -44,7 +47,7 @@ class Meta: course_id = None allowlist = True - notes = 'Test Notes' + notes = "Test Notes" class CertificateInvalidationFactory(DjangoModelFactory): @@ -55,7 +58,7 @@ class CertificateInvalidationFactory(DjangoModelFactory): class Meta: model = CertificateInvalidation - notes = 'Test Notes' + notes = "Test Notes" active = True @@ -112,8 +115,21 @@ class CertificateDateOverrideFactory(DjangoModelFactory): """ CertificateDateOverride factory """ + class Meta: model = CertificateDateOverride date = datetime.datetime(2021, 5, 11, 0, 0, tzinfo=datetime.timezone.utc) reason = "Learner really wanted this on their birthday" + + +class CertificateTemplateFactory(DjangoModelFactory): + """CertificateTemplate factory""" + + class Meta: + model = CertificateTemplate + + name = Sequence("template{}".format) + description = Sequence("description for template{}".format) + template = "" + is_active = True diff --git a/lms/djangoapps/certificates/tests/test_tasks.py b/lms/djangoapps/certificates/tests/test_tasks.py index c2c73f053cdd..c02c5f1dbf8d 100644 --- a/lms/djangoapps/certificates/tests/test_tasks.py +++ b/lms/djangoapps/certificates/tests/test_tasks.py @@ -3,6 +3,7 @@ """ +from textwrap import dedent from unittest import mock from unittest.mock import patch @@ -13,7 +14,11 @@ from common.djangoapps.course_modes.models import CourseMode from common.djangoapps.student.tests.factories import UserFactory from lms.djangoapps.certificates.data import CertificateStatuses -from lms.djangoapps.certificates.tasks import generate_certificate +from lms.djangoapps.certificates.tasks import ( + generate_certificate, + handle_modify_cert_template, +) +from lms.djangoapps.certificates.tests.factories import CertificateTemplateFactory @ddt.ddt @@ -21,23 +26,24 @@ class GenerateUserCertificateTest(TestCase): """ Tests for course certificate tasks """ + def setUp(self): super().setUp() self.user = UserFactory() - self.course_key = 'course-v1:edX+DemoX+Demo_Course' + self.course_key = "course-v1:edX+DemoX+Demo_Course" - @ddt.data('student', 'course_key', 'enrollment_mode') + @ddt.data("student", "course_key", "enrollment_mode") def test_missing_args(self, missing_arg): kwargs = { - 'student': self.user.id, - 'course_key': self.course_key, - 'other_arg': 'shiny', - 'enrollment_mode': CourseMode.MASTERS + "student": self.user.id, + "course_key": self.course_key, + "other_arg": "shiny", + "enrollment_mode": CourseMode.MASTERS, } del kwargs[missing_arg] - with patch('lms.djangoapps.certificates.tasks.User.objects.get'): + with patch("lms.djangoapps.certificates.tasks.User.objects.get"): with self.assertRaisesRegex(KeyError, missing_arg): generate_certificate.apply_async(kwargs=kwargs).get() @@ -48,13 +54,13 @@ def test_generation(self): enrollment_mode = CourseMode.VERIFIED with mock.patch( - 'lms.djangoapps.certificates.tasks.generate_course_certificate', - return_value=None + "lms.djangoapps.certificates.tasks.generate_course_certificate", + return_value=None, ) as mock_generate_cert: kwargs = { - 'student': self.user.id, - 'course_key': self.course_key, - 'enrollment_mode': enrollment_mode + "student": self.user.id, + "course_key": self.course_key, + "enrollment_mode": enrollment_mode, } generate_certificate.apply_async(kwargs=kwargs) @@ -63,31 +69,31 @@ def test_generation(self): course_key=CourseKey.from_string(self.course_key), status=CertificateStatuses.downloadable, enrollment_mode=enrollment_mode, - course_grade='', - generation_mode='batch' + course_grade="", + generation_mode="batch", ) def test_generation_custom(self): """ Verify the task handles certificate generation custom params """ - gen_mode = 'self' + gen_mode = "self" status = CertificateStatuses.notpassing enrollment_mode = CourseMode.AUDIT - course_grade = '0.89' + course_grade = "0.89" with mock.patch( - 'lms.djangoapps.certificates.tasks.generate_course_certificate', - return_value=None + "lms.djangoapps.certificates.tasks.generate_course_certificate", + return_value=None, ) as mock_generate_cert: kwargs = { - 'status': status, - 'student': self.user.id, - 'course_key': self.course_key, - 'course_grade': course_grade, - 'enrollment_mode': enrollment_mode, - 'generation_mode': gen_mode, - 'what_about': 'dinosaurs' + "status": status, + "student": self.user.id, + "course_key": self.course_key, + "course_grade": course_grade, + "enrollment_mode": enrollment_mode, + "generation_mode": gen_mode, + "what_about": "dinosaurs", } generate_certificate.apply_async(kwargs=kwargs) @@ -97,5 +103,66 @@ def test_generation_custom(self): status=status, enrollment_mode=enrollment_mode, course_grade=course_grade, - generation_mode=gen_mode + generation_mode=gen_mode, ) + + +class ModifyCertTemplateTests(TestCase): + """Tests for handle_modify_cert_template""" + + # FIXME: put in mocks for .get and .save + def setUp(self): + super().setUp() + self.cert1 = CertificateTemplateFactory + self.cert2 = CertificateTemplateFactory + self.cert3 = CertificateTemplateFactory + + def test_command_changes_called_templates(self): + """Verify command changes for all and only those templates for which it is called.""" + self.cert1.template = "fiddledee-doo fiddledee-dah" + self.cert2.template = "violadee-doo violadee-dah" + self.cert3.template = "fiddledee-doo fiddledee-dah" + expected1 = "fiddleeep-doo fiddledee-dah" + expected2 = "violaeep-doo violadee-dah" + expected3 = "fiddledee-doo fiddledee-dah" + options = { + "old_text": "dee", + "new_text": "eep", + "templates": [1, 2], + } + handle_modify_cert_template(options) + assert self.cert1.template == expected1 + assert self.cert2.template == expected2 + assert self.cert3.template == expected3 + + def test_dry_run(self): + """Verify command doesn't change anything on dry-run.""" + self.cert1.template = "fiddledee-doo fiddledee-dah" + self.cert2.template = "violadee-doo violadee-dah" + expected1 = "fiddledee-doo fiddledee-dah" + expected2 = "violadee-doo violadee-dah" + options = { + "old_text": "dee", + "new_text": "eep", + "templates": [1, 2], + "dry_run": True, + } + handle_modify_cert_template(options) + assert self.cert1.template == expected1 + assert self.cert2.template == expected2 + + def test_multiline_change(self): + """Verify template change works with a multiline change string.""" + self.cert1.template = "fiddledee-doo fiddledee-dah" + new_text = """ + there's something happening here + what it is ain't exactly clear + """ + expected = f"fiddle{dedent(new_text)}-doo fiddledee-dah" + options = { + "old_text": "dee", + "new_text": dedent(new_text), + "templates": [1], + } + handle_modify_cert_template(options) + assert self.cert1.template == expected From 994b8a3d49fdb4409137d42c2c0baa4629120d55 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Wed, 17 Jan 2024 21:41:21 +0000 Subject: [PATCH 07/21] feat: adding tests to modify cert template Re-factored to make the code more testable, and added some more tests, also improved dry run logging FIXES: APER-2851 --- .../tests/test_modify_certs_template.py | 3 - lms/djangoapps/certificates/tasks.py | 105 ++++++++++-------- .../certificates/tests/test_tasks.py | 62 ++++++----- 3 files changed, 95 insertions(+), 75 deletions(-) diff --git a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py index 2ab242d101f6..c6ac0d2c903a 100644 --- a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py +++ b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py @@ -13,9 +13,6 @@ class ModifyCertTemplateTests(TestCase): """Tests for the modify_cert_template management command""" - def setUp(self): - super().setUp() - def test_command_with_missing_param_old_text(self): """Verify command with a missing param --old-text.""" with pytest.raises( diff --git a/lms/djangoapps/certificates/tasks.py b/lms/djangoapps/certificates/tasks.py index 06078e346105..8229cef3948c 100644 --- a/lms/djangoapps/certificates/tasks.py +++ b/lms/djangoapps/certificates/tasks.py @@ -4,7 +4,7 @@ from difflib import unified_diff from logging import getLogger -from typing import Any, Dict +from typing import Any, Dict, List from celery import shared_task from celery_utils.persist_on_failure import LoggedPersistOnFailureTask, LoggedTask @@ -61,7 +61,7 @@ def generate_certificate(self, **kwargs): # pylint: disable=unused-argument @shared_task(base=LoggedTask, ignore_result=True) @set_code_owner_attribute -def handle_modify_cert_template(options: Dict[str, Any]): +def handle_modify_cert_template(options: Dict[str, Any]) -> None: """ Celery task to handle the modify_cert_template management command. @@ -81,7 +81,34 @@ def handle_modify_cert_template(options: Dict[str, Any]): num=len(template_ids) ) ) - templates_changed = 0 + + templates_changed = get_changed_cert_templates(options) + for template in templates_changed: + template.save() + + +def get_changed_cert_templates(options: Dict[str, Any]) -> List[CertificateTemplate]: + """ + Loop through the templates and return instances with changed template text. + + Args: + old_text (string): Text in the template of which the first instance should be changed + new_text (string): Replacement text for old_text + template_ids (list[string]): List of template IDs for this run. + dry_run (boolean): Don't do the work, just report the changes that would happen + """ + template_ids = options["templates"] + if not template_ids: + template_ids = [] + + log.info( + "[modify_cert_template] Attempting to modify {num} templates".format( + num=len(template_ids) + ) + ) + dry_run = options.get("dry_run", None) + templates_changed = [] + for template_id in template_ids: template = None try: @@ -94,8 +121,8 @@ def handle_modify_cert_template(options: Dict[str, Any]): template_id=template_id, name=template.description ) ) - new_template = get_modified_template_text( - template.template, options["old_text"], options["new_text"] + new_template = template.template.replace( + options["old_text"], options["new_text"], 1 ) if template.template == new_template: log.info( @@ -104,48 +131,36 @@ def handle_modify_cert_template(options: Dict[str, Any]): ) ) else: - log.info( - "[modify_cert_template] Modifying template {template} ({description})".format( - template=template_id, - description=template.description, - ) - ) - templates_changed += 1 - if not options["dry_run"]: - template.template = new_template - template.save() - else: - log.info( - "DRY-RUN: Not making the following template change to {id}.".format( - id=template_id + if not dry_run: + log.info( + "[modify_cert_template] Modifying template {template} ({description})".format( + template=template_id, + description=template.description, + ) ) - ) - log.info( - "\n".join( - unified_diff( - template.template.splitlines(), - new_template.splitlines(), - lineterm="", - fromfile="old_template", - tofile="new_template", + template.template = new_template + templates_changed.append(template) + else: + log.info( + "DRY-RUN: Not making the following template change to {id}.".format( + id=template_id ) - ), - ) + ) + log.info( + "\n".join( + unified_diff( + template.template.splitlines(), + new_template.splitlines(), + lineterm="", + fromfile="old_template", + tofile="new_template", + ) + ), + ) log.info( - "[modify_cert_template] Modified {num} templates".format(num=templates_changed) + "[modify_cert_template] Modified {num} templates".format( + num=len(templates_changed) + ) ) - -def get_modified_template_text( - template_text: str, - old: str, - new: str, -): - """ - Returns the original template text with the first instance of `old` replaced with `new`. - Case-sensitive. - - Although this is a trivial method, it's factored into its own method to allow us to - write unit tests that can be easily modified if the testing algorithm is made more complex. - """ - return template_text.replace(old, new, 1) + return templates_changed diff --git a/lms/djangoapps/certificates/tests/test_tasks.py b/lms/djangoapps/certificates/tests/test_tasks.py index c02c5f1dbf8d..8cf8150235df 100644 --- a/lms/djangoapps/certificates/tests/test_tasks.py +++ b/lms/djangoapps/certificates/tests/test_tasks.py @@ -16,7 +16,7 @@ from lms.djangoapps.certificates.data import CertificateStatuses from lms.djangoapps.certificates.tasks import ( generate_certificate, - handle_modify_cert_template, + get_changed_cert_templates, ) from lms.djangoapps.certificates.tests.factories import CertificateTemplateFactory @@ -108,52 +108,59 @@ def test_generation_custom(self): class ModifyCertTemplateTests(TestCase): - """Tests for handle_modify_cert_template""" - - # FIXME: put in mocks for .get and .save - def setUp(self): - super().setUp() - self.cert1 = CertificateTemplateFactory - self.cert2 = CertificateTemplateFactory - self.cert3 = CertificateTemplateFactory + """Tests for get_changed_cert_templates""" def test_command_changes_called_templates(self): """Verify command changes for all and only those templates for which it is called.""" - self.cert1.template = "fiddledee-doo fiddledee-dah" - self.cert2.template = "violadee-doo violadee-dah" - self.cert3.template = "fiddledee-doo fiddledee-dah" + self.template1 = CertificateTemplateFactory.create( + template="fiddledee-doo fiddledee-dah" + ) + self.template2 = CertificateTemplateFactory.create( + template="violadee-doo violadee-dah" + ) + self.template3 = CertificateTemplateFactory.create( + template="fiddledee-doo fiddledee-dah" + ) + self.template1.save() + self.template2.save() + self.template3.save() expected1 = "fiddleeep-doo fiddledee-dah" expected2 = "violaeep-doo violadee-dah" - expected3 = "fiddledee-doo fiddledee-dah" options = { "old_text": "dee", "new_text": "eep", "templates": [1, 2], } - handle_modify_cert_template(options) - assert self.cert1.template == expected1 - assert self.cert2.template == expected2 - assert self.cert3.template == expected3 + new_templates = get_changed_cert_templates(options) + assert len(new_templates) == 2 + assert new_templates[0].template == expected1 + assert new_templates[1].template == expected2 def test_dry_run(self): """Verify command doesn't change anything on dry-run.""" - self.cert1.template = "fiddledee-doo fiddledee-dah" - self.cert2.template = "violadee-doo violadee-dah" - expected1 = "fiddledee-doo fiddledee-dah" - expected2 = "violadee-doo violadee-dah" + self.template1 = CertificateTemplateFactory.create( + template="fiddledee-doo fiddledee-dah" + ) + self.template2 = CertificateTemplateFactory.create( + template="violadee-doo violadee-dah" + ) + self.template1.save() + self.template2.save() options = { "old_text": "dee", "new_text": "eep", "templates": [1, 2], "dry_run": True, } - handle_modify_cert_template(options) - assert self.cert1.template == expected1 - assert self.cert2.template == expected2 + new_templates = get_changed_cert_templates(options) + assert new_templates == [] def test_multiline_change(self): """Verify template change works with a multiline change string.""" - self.cert1.template = "fiddledee-doo fiddledee-dah" + self.template1 = CertificateTemplateFactory.create( + template="fiddledee-doo fiddledee-dah" + ) + self.template1.save() new_text = """ there's something happening here what it is ain't exactly clear @@ -164,5 +171,6 @@ def test_multiline_change(self): "new_text": dedent(new_text), "templates": [1], } - handle_modify_cert_template(options) - assert self.cert1.template == expected + new_templates = get_changed_cert_templates(options) + assert len(new_templates) == 1 + assert new_templates[0].template == expected From e0ef013f022b281af7fbb3959d873241456551c6 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Wed, 17 Jan 2024 22:00:30 +0000 Subject: [PATCH 08/21] feat: fixing some codestyle/lint errors not sure why the manual linter didn't complain FIXES: APER-2851 --- .../tests/test_modify_certs_template.py | 2 +- .../certificates/tests/test_tasks.py | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py index c6ac0d2c903a..6e7284b8f8ed 100644 --- a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py +++ b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py @@ -33,7 +33,7 @@ def test_command_with_missing_param_new_text(self): "modify_cert_template", "--old-text", "blah", "--templates", "1 2 3" ) - def test_command_with_missing_param_old_text(self): + def test_command_with_missing_param_templates(self): """Verify command with a missing param --templates.""" with pytest.raises( CommandError, diff --git a/lms/djangoapps/certificates/tests/test_tasks.py b/lms/djangoapps/certificates/tests/test_tasks.py index 8cf8150235df..2e6c84464936 100644 --- a/lms/djangoapps/certificates/tests/test_tasks.py +++ b/lms/djangoapps/certificates/tests/test_tasks.py @@ -112,18 +112,18 @@ class ModifyCertTemplateTests(TestCase): def test_command_changes_called_templates(self): """Verify command changes for all and only those templates for which it is called.""" - self.template1 = CertificateTemplateFactory.create( + template1 = CertificateTemplateFactory.create( template="fiddledee-doo fiddledee-dah" ) - self.template2 = CertificateTemplateFactory.create( + template2 = CertificateTemplateFactory.create( template="violadee-doo violadee-dah" ) - self.template3 = CertificateTemplateFactory.create( + template3 = CertificateTemplateFactory.create( template="fiddledee-doo fiddledee-dah" ) - self.template1.save() - self.template2.save() - self.template3.save() + template1.save() + template2.save() + template3.save() expected1 = "fiddleeep-doo fiddledee-dah" expected2 = "violaeep-doo violadee-dah" options = { @@ -138,14 +138,14 @@ def test_command_changes_called_templates(self): def test_dry_run(self): """Verify command doesn't change anything on dry-run.""" - self.template1 = CertificateTemplateFactory.create( + template1 = CertificateTemplateFactory.create( template="fiddledee-doo fiddledee-dah" ) - self.template2 = CertificateTemplateFactory.create( + template2 = CertificateTemplateFactory.create( template="violadee-doo violadee-dah" ) - self.template1.save() - self.template2.save() + template1.save() + template2.save() options = { "old_text": "dee", "new_text": "eep", @@ -153,14 +153,14 @@ def test_dry_run(self): "dry_run": True, } new_templates = get_changed_cert_templates(options) - assert new_templates == [] + assert not new_templates def test_multiline_change(self): """Verify template change works with a multiline change string.""" - self.template1 = CertificateTemplateFactory.create( + template1 = CertificateTemplateFactory.create( template="fiddledee-doo fiddledee-dah" ) - self.template1.save() + template1.save() new_text = """ there's something happening here what it is ain't exactly clear From a35a6f908e9957d8fe5b753d8b963ac9fd046501 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 18 Jan 2024 13:49:22 +0000 Subject: [PATCH 09/21] feat: linter Fixing a linter air FIXES: APER-2851 --- .../management/commands/tests/test_modify_certs_template.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py index 6e7284b8f8ed..03d9b05d5413 100644 --- a/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py +++ b/lms/djangoapps/certificates/management/commands/tests/test_modify_certs_template.py @@ -4,10 +4,7 @@ import pytest from django.core.management import CommandError, call_command -from django.test import ( - TestCase, - override_settings, -) # lint-amnesty, pylint: disable=unused-import +from django.test import TestCase class ModifyCertTemplateTests(TestCase): From b4bf07660e90e960b4e562bc8286ae68bd212b90 Mon Sep 17 00:00:00 2001 From: Deborah Kaplan Date: Thu, 18 Jan 2024 15:14:24 +0000 Subject: [PATCH 10/21] feat: fixes from code review improving a comment FIXES: APER-2851 --- .../certificates/management/commands/modify_cert_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/certificates/management/commands/modify_cert_template.py b/lms/djangoapps/certificates/management/commands/modify_cert_template.py index d720c628e6d6..f4ae5f64d2b6 100644 --- a/lms/djangoapps/certificates/management/commands/modify_cert_template.py +++ b/lms/djangoapps/certificates/management/commands/modify_cert_template.py @@ -16,7 +16,7 @@ class Command(BaseCommand): """Management command to modify certificate templates. Example usage: - ./manage.py lms modify_cert_template --old-text + ./manage.py lms modify_cert_template --old-text "" --new text "

boo!

" --templates 867 3509 """ help = """Modify one or more certificate templates. From 7b7a0d3773ef57be492e41e7fb1f33af5b718747 Mon Sep 17 00:00:00 2001 From: Andy Shultz Date: Wed, 17 Jan 2024 09:41:24 -0500 Subject: [PATCH 11/21] fix: make reindexing wait for the data using on_commit includes a very long comment explaining this for future developers --- cms/djangoapps/contentstore/signals/handlers.py | 16 +++++++++++++--- .../contentstore/tests/test_courseware_index.py | 4 +++- .../views/tests/test_course_index.py | 7 ++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cms/djangoapps/contentstore/signals/handlers.py b/cms/djangoapps/contentstore/signals/handlers.py index 20c14089e0a6..e0bc9fcc9558 100644 --- a/cms/djangoapps/contentstore/signals/handlers.py +++ b/cms/djangoapps/contentstore/signals/handlers.py @@ -127,6 +127,17 @@ def listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable= dump_course_to_neo4j ) + # DEVELOPER README: probably all tasks here should use transaction.on_commit + # to avoid stale data, but the tasks are owned by many teams and are often + # working well enough. Several instead use a waiting strategy. + # If you are in here trying to figure out why your task is not working correctly, + # consider whether it is getting stale data and if so choose to wait for the transaction + # like exams or put your task to sleep for a while like discussions. + # You will not be able to replicate these errors in an environment where celery runs + # in process because it will be inside the transaction. Use the settings from + # devstack_with_worker.py, and consider adding a time.sleep into send_bulk_published_signal + # if you really want to make sure that the task happens before the data is ready. + # register special exams asynchronously after the data is ready course_key_str = str(course_key) transaction.on_commit(lambda: update_special_exams_and_publish.delay(course_key_str)) @@ -139,10 +150,9 @@ def listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable= # Push the course out to CourseGraph asynchronously. dump_course_to_neo4j.delay(course_key_str) - # Finally, call into the course search subsystem - # to kick off an indexing action + # Kick off a courseware indexing action after the data is ready if CoursewareSearchIndexer.indexing_is_enabled() and CourseAboutSearchIndexer.indexing_is_enabled(): - update_search_index.delay(course_key_str, datetime.now(UTC).isoformat()) + transaction.on_commit(lambda: update_search_index.delay(course_key_str, datetime.now(UTC).isoformat())) update_discussions_settings_from_course_task.apply_async( args=[course_key_str], diff --git a/cms/djangoapps/contentstore/tests/test_courseware_index.py b/cms/djangoapps/contentstore/tests/test_courseware_index.py index 7d7a0d533b07..98a60dce901f 100644 --- a/cms/djangoapps/contentstore/tests/test_courseware_index.py +++ b/cms/djangoapps/contentstore/tests/test_courseware_index.py @@ -5,7 +5,7 @@ import time from datetime import datetime from unittest import skip -from unittest.mock import patch +from unittest.mock import patch, Mock import ddt import pytest @@ -585,6 +585,8 @@ def test_large_course_deletion(self): self._test_large_course_deletion(self.store) +@patch('cms.djangoapps.contentstore.signals.handlers.transaction.on_commit', + new=Mock(side_effect=lambda func: func()),) # run right away class TestTaskExecution(SharedModuleStoreTestCase): """ Set of tests to ensure that the task code will do the right thing when diff --git a/cms/djangoapps/contentstore/views/tests/test_course_index.py b/cms/djangoapps/contentstore/views/tests/test_course_index.py index 73db1a10b944..b30f8c95a631 100644 --- a/cms/djangoapps/contentstore/views/tests/test_course_index.py +++ b/cms/djangoapps/contentstore/views/tests/test_course_index.py @@ -6,7 +6,6 @@ import datetime import json from unittest import mock, skip -from unittest.mock import patch import ddt import lxml @@ -644,7 +643,7 @@ def test_verify_warn_only_on_enabled_blocks(self, enabled_block_types, deprecate ) @override_settings(FEATURES={'ENABLE_EXAM_SETTINGS_HTML_VIEW': True}) - @patch('cms.djangoapps.models.settings.course_metadata.CourseMetadata.validate_proctoring_settings') + @mock.patch('cms.djangoapps.models.settings.course_metadata.CourseMetadata.validate_proctoring_settings') def test_proctoring_link_is_visible(self, mock_validate_proctoring_settings): """ Test to check proctored exam settings mfe url is rendering properly @@ -685,9 +684,11 @@ class TestCourseReIndex(CourseTestCase): ENABLED_SIGNALS = ['course_published'] + @mock.patch('cms.djangoapps.contentstore.signals.handlers.transaction.on_commit', + new=mock.Mock(side_effect=lambda func: func()), ) # run index right away def setUp(self): """ - Set up the for the course outline tests. + Set up the for the course reindex tests. """ super().setUp() From f2606ca62c52909fade2329acc15e332411b74d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B4mulo=20Penido?= Date: Thu, 18 Jan 2024 17:04:07 -0300 Subject: [PATCH 12/21] fix: capitalization of "Manage Tags" menu item in Studio (#34072) --- cms/templates/studio_xblock_wrapper.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/templates/studio_xblock_wrapper.html b/cms/templates/studio_xblock_wrapper.html index 328a0a37e90d..0d6cafc95d66 100644 --- a/cms/templates/studio_xblock_wrapper.html +++ b/cms/templates/studio_xblock_wrapper.html @@ -137,7 +137,7 @@ % endif % if use_tagging: % endif % if is_course: From 4cfd6ca8c732c02d5d13c570f80307c5c95c21c9 Mon Sep 17 00:00:00 2001 From: John Nagro Date: Thu, 18 Jan 2024 18:45:46 -0500 Subject: [PATCH 13/21] feat: release edx-enterprise 4.10.4 (#34076) --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index a5624628b794..eaaee5ea139c 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -23,7 +23,7 @@ click>=8.0,<9.0 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.10.2 +edx-enterprise==4.10.4 # django-oauth-toolkit version >=2.0.0 has breaking changes. More details # mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index bde36b461c61..f348cf7067ae 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -474,7 +474,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.2 +edx-enterprise==4.10.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 7d29ec2995f1..a4150a7bd223 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -755,7 +755,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.2 +edx-enterprise==4.10.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 499073ba1271..45ee2bc02007 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -552,7 +552,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.2 +edx-enterprise==4.10.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 7ea60ecd1c4e..58fcc9b1ee5b 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -580,7 +580,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.2 +edx-enterprise==4.10.4 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From 2ae915587da507ca095de80a12795c664a63a27f Mon Sep 17 00:00:00 2001 From: Jenkins Date: Sun, 21 Jan 2024 20:38:52 +0000 Subject: [PATCH 14/21] chore(i18n): update translations --- conf/locale/ar/LC_MESSAGES/django.po | 35 ++++++++++++++------ conf/locale/ar/LC_MESSAGES/djangojs.po | 2 +- conf/locale/ca/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/ca/LC_MESSAGES/djangojs.po | 2 +- conf/locale/de_DE/LC_MESSAGES/django.po | 35 ++++++++++++++------ conf/locale/de_DE/LC_MESSAGES/djangojs.po | 2 +- conf/locale/el/LC_MESSAGES/django.po | 31 ++++++++++++----- conf/locale/el/LC_MESSAGES/djangojs.po | 2 +- conf/locale/en/LC_MESSAGES/django.po | 8 ++--- conf/locale/en/LC_MESSAGES/djangojs.po | 4 +-- conf/locale/eo/LC_MESSAGES/django.mo | Bin 1196568 -> 1196486 bytes conf/locale/eo/LC_MESSAGES/django.po | 8 ++--- conf/locale/eo/LC_MESSAGES/djangojs.mo | Bin 451899 -> 451899 bytes conf/locale/eo/LC_MESSAGES/djangojs.po | 4 +-- conf/locale/es_419/LC_MESSAGES/django.po | 35 ++++++++++++++------ conf/locale/es_419/LC_MESSAGES/djangojs.po | 2 +- conf/locale/eu_ES/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/eu_ES/LC_MESSAGES/djangojs.po | 2 +- conf/locale/fa_IR/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/fa_IR/LC_MESSAGES/djangojs.po | 2 +- conf/locale/fr/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/fr/LC_MESSAGES/djangojs.po | 2 +- conf/locale/id/LC_MESSAGES/django.po | 28 ++++++++++++---- conf/locale/id/LC_MESSAGES/djangojs.po | 4 +-- conf/locale/it_IT/LC_MESSAGES/django.po | 35 ++++++++++++++------ conf/locale/it_IT/LC_MESSAGES/djangojs.po | 2 +- conf/locale/ja_JP/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/ja_JP/LC_MESSAGES/djangojs.po | 2 +- conf/locale/ka/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/ka/LC_MESSAGES/djangojs.po | 2 +- conf/locale/lt_LT/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/lt_LT/LC_MESSAGES/djangojs.po | 2 +- conf/locale/lv/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/lv/LC_MESSAGES/djangojs.po | 2 +- conf/locale/mn/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/mn/LC_MESSAGES/djangojs.po | 2 +- conf/locale/pl/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/pl/LC_MESSAGES/djangojs.po | 2 +- conf/locale/pt_BR/LC_MESSAGES/djangojs.po | 2 +- conf/locale/pt_PT/LC_MESSAGES/django.po | 35 ++++++++++++++------ conf/locale/pt_PT/LC_MESSAGES/djangojs.po | 2 +- conf/locale/rtl/LC_MESSAGES/django.mo | Bin 779799 -> 779752 bytes conf/locale/rtl/LC_MESSAGES/django.po | 8 ++--- conf/locale/rtl/LC_MESSAGES/djangojs.mo | Bin 289311 -> 289311 bytes conf/locale/rtl/LC_MESSAGES/djangojs.po | 4 +-- conf/locale/ru/LC_MESSAGES/djangojs.po | 2 +- conf/locale/sk/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/sk/LC_MESSAGES/djangojs.po | 2 +- conf/locale/sw_KE/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/sw_KE/LC_MESSAGES/djangojs.po | 2 +- conf/locale/th/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/th/LC_MESSAGES/djangojs.po | 2 +- conf/locale/tr_TR/LC_MESSAGES/django.po | 33 +++++++++++++----- conf/locale/tr_TR/LC_MESSAGES/djangojs.po | 10 +++--- conf/locale/uk/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/uk/LC_MESSAGES/djangojs.po | 2 +- conf/locale/vi/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/vi/LC_MESSAGES/djangojs.po | 2 +- conf/locale/zh_CN/LC_MESSAGES/django.po | 25 +++++++++++--- conf/locale/zh_CN/LC_MESSAGES/djangojs.po | 2 +- conf/locale/zh_HANS/LC_MESSAGES/django.po | 25 +++++++++++--- conf/locale/zh_HANS/LC_MESSAGES/djangojs.po | 2 +- conf/locale/zh_TW/LC_MESSAGES/django.po | 27 +++++++++++---- conf/locale/zh_TW/LC_MESSAGES/djangojs.po | 2 +- 64 files changed, 615 insertions(+), 236 deletions(-) diff --git a/conf/locale/ar/LC_MESSAGES/django.po b/conf/locale/ar/LC_MESSAGES/django.po index 2ff7b2d9034b..a3f8c67f9c78 100644 --- a/conf/locale/ar/LC_MESSAGES/django.po +++ b/conf/locale/ar/LC_MESSAGES/django.po @@ -70,7 +70,7 @@ # طاهر , 2014 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -110,7 +110,7 @@ # wd3bbas , 2014 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -224,7 +224,7 @@ # طاهر , 2014 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -248,9 +248,9 @@ # SalmaGhazal , 2014 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Arabic (https://app.transifex.com/open-edx/teams/6205/ar/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # NELC Open edX Translation , 2020 @@ -259,7 +259,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: NELC Open edX Translation , 2020\n" "Language-Team: Arabic (https://app.transifex.com/open-edx/teams/6205/ar/)\n" @@ -8349,6 +8349,13 @@ msgstr "المهنة" msgid "Specialty" msgstr "التخصص" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13053,6 +13060,10 @@ msgstr "نسخة مطابقة لـ ’{0}‘" msgid "Invalid prerequisite course key" msgstr "رقم المساق الأساسي غير صالح" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "تعيين التاريخ" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13268,10 +13279,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "جرى إعادة فهرسة المساق بنجاح." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "تعيين التاريخ" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -23977,6 +23984,10 @@ msgstr "تكبير أو تصغير" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -24343,6 +24354,10 @@ msgstr "تصفّح المساق" msgid "Outline" msgstr "المخطّط الكلّي" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "ناشر" diff --git a/conf/locale/ar/LC_MESSAGES/djangojs.po b/conf/locale/ar/LC_MESSAGES/djangojs.po index 6cab9e39272a..998f763d98e1 100644 --- a/conf/locale/ar/LC_MESSAGES/djangojs.po +++ b/conf/locale/ar/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/ca/LC_MESSAGES/django.po b/conf/locale/ca/LC_MESSAGES/django.po index 1c80a4eddbe2..a4c7c0ff3296 100644 --- a/conf/locale/ca/LC_MESSAGES/django.po +++ b/conf/locale/ca/LC_MESSAGES/django.po @@ -16,7 +16,7 @@ # Susanna Pujol, 2021 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Catalan (http://app.transifex.com/open-edx/edx-platform/language/ca/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -26,7 +26,7 @@ # Xavi Armengol , 2016 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Catalan (http://app.transifex.com/open-edx/edx-platform/language/ca/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7497,6 +7497,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11665,6 +11672,10 @@ msgstr "Duplicat de '{0}'" msgid "Invalid prerequisite course key" msgstr "Clau del curs prèvia no vàlida" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11884,10 +11895,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "El curs ha estat correctament reindexat." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22747,6 +22754,10 @@ msgstr "Amplia o redueix" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23117,6 +23128,10 @@ msgstr "Navegació del curs" msgid "Outline" msgstr "Esbós" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/ca/LC_MESSAGES/djangojs.po b/conf/locale/ca/LC_MESSAGES/djangojs.po index d8a5612c6ec0..3520d91dacbe 100644 --- a/conf/locale/ca/LC_MESSAGES/djangojs.po +++ b/conf/locale/ca/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Catalan (http://app.transifex.com/open-edx/edx-platform/language/ca/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/de_DE/LC_MESSAGES/django.po b/conf/locale/de_DE/LC_MESSAGES/django.po index 8543ceecd7f8..1fd02b4411f5 100644 --- a/conf/locale/de_DE/LC_MESSAGES/django.po +++ b/conf/locale/de_DE/LC_MESSAGES/django.po @@ -45,7 +45,7 @@ # Андрей Поляков , 2016 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -72,7 +72,7 @@ # Vassili Simon , 2014 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -146,7 +146,7 @@ # Waheed Ahmed , 2019 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -166,9 +166,9 @@ # Stefania Trabucchi , 2019 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from German (Germany) (https://app.transifex.com/open-edx/teams/6205/de_DE/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # Stefania Trabucchi , 2019 @@ -177,7 +177,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Stefania Trabucchi , 2019\n" "Language-Team: German (Germany) (https://app.transifex.com/open-edx/teams/6205/de_DE/)\n" @@ -8330,6 +8330,13 @@ msgstr "Beruf" msgid "Specialty" msgstr "Spezialgebiet" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13174,6 +13181,10 @@ msgstr "Duplikat von '{0}'" msgid "Invalid prerequisite course key" msgstr "Ungültiger Vorbedingungskursschlüssel." +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Datum festlegen" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13391,10 +13402,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kurs wurde erfolgreich neuindiziert." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Datum festlegen" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -24500,6 +24507,10 @@ msgstr "Aufklappen oder zusammenlegen" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -24873,6 +24884,10 @@ msgstr "Kursnavigation" msgid "Outline" msgstr "Übersicht" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Herausgeber" diff --git a/conf/locale/de_DE/LC_MESSAGES/djangojs.po b/conf/locale/de_DE/LC_MESSAGES/djangojs.po index e71deeb0d49d..45884078f345 100644 --- a/conf/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/conf/locale/de_DE/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/el/LC_MESSAGES/django.po b/conf/locale/el/LC_MESSAGES/django.po index 984bf341417d..912aca5f2def 100644 --- a/conf/locale/el/LC_MESSAGES/django.po +++ b/conf/locale/el/LC_MESSAGES/django.po @@ -22,10 +22,10 @@ # Panos Chronis , 2014 # Anestis, 2014 # kafroulitsa , 2014 -# Ειρήνη Απέργη, 2023 +# Ειρήνη Απέργη, 2023-2024 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -40,7 +40,7 @@ # Ειρήνη Απέργη, 2023 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -76,7 +76,7 @@ # Ειρήνη Απέργη, 2023 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7684,6 +7684,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11918,6 +11925,10 @@ msgstr "" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12125,10 +12136,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21868,6 +21875,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22193,6 +22204,10 @@ msgstr "" msgid "Outline" msgstr "" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/el/LC_MESSAGES/djangojs.po b/conf/locale/el/LC_MESSAGES/djangojs.po index 824494efd6fc..51b73a38f77b 100644 --- a/conf/locale/el/LC_MESSAGES/djangojs.po +++ b/conf/locale/el/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/en/LC_MESSAGES/django.po b/conf/locale/en/LC_MESSAGES/django.po index 44254de34cd7..8382f851668b 100644 --- a/conf/locale/en/LC_MESSAGES/django.po +++ b/conf/locale/en/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:36+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.128712\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.373996\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -21467,10 +21467,6 @@ msgstr "" msgid "Manage Access" msgstr "" -#: cms/templates/studio_xblock_wrapper.html -msgid "Manage tags" -msgstr "" - #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" diff --git a/conf/locale/en/LC_MESSAGES/djangojs.po b/conf/locale/en/LC_MESSAGES/djangojs.po index c58571ee6258..aedc9458b52b 100644 --- a/conf/locale/en/LC_MESSAGES/djangojs.po +++ b/conf/locale/en/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:35+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.075048\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.438254\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo index dd5dcf50d3088bd13a9b2faf8387196984f95c33..b1fd48c47e47687abe4ad9ff5919736bfbef94a3 100644 GIT binary patch delta 93691 zcmXWkb$}IB8^`h4-Fuhr?gf_a?(XjHPC-hVp}Rp!q@_XNrAxY7B&4K78WfNc-tTXo z@t@B*=iZq)@jPed-rdD{qpKVnRmHs>Kk&W7e+%L{PD*?>*>MIZah$!$Le%W6?jPb* z#Wh$S-=GdCG9bihf#+U(-+raJ&bVe#C@?M^*>MtW*Q#iG{=GX5U*ed+&dz~SxyJijSO)@sUI5^ z;uOb|$k?3l(IHMEOzN8xV{m<^JcS@H)W+V}5L4kv)QKKpW_*G%Fu|A*CljVY)hnUq zsvefZ23Q#9V+Fi~>Uh$zcHXX-i~4xX$Mv0^6q4dI%z?piAx>({hk3ECUmxSwSNQd- ze*GP4>9ULuaacL0A|}R`sDbpu2%P2Dw_*zFm(bOLFDT^17!yLAELaqEg7%ml2cu53 z8WZ9%)QsG~;ts3rIYv*KD*Ed7QfFk(`O>wH6D*`yGs62_fu9chd@ z(Kw8bOHebi4z*OLFdAOK^!Pi*#V;6+ai&;@6Qk<+Q5`OZ-oQ}jA3TMiQeid?8ui)MXX#rJb-_8P zsosy8u}8QYKl`umm>=SNNBs^mGuj6=b7L`<@_z{hZ4et#JwAYC@HbTSCRt)Z zS0A*gvzRJm`nLTkAi~mgzsISmbPi%+Vu`DKM`)i3UFhA}^WyfpOz!I$paiU;W)b;YBtC3WrpcA)4 zrO|hOeH<$97oe7Ar~mrzsH}L3h4F9HiL?D=Gm#H9!YZhA`wn&fDHscvpwf5aPvpNE zcG3_BkNI!7g6jDLREMIjv;&i&-j@lr@f1RhtS;(8oiH{I^V_GOmUbDc16xtoJC52< zep~5UPu|d=ss4gdG4(22!%V1pRn&>=q1L*sUmt)9vT+!JGf^l0pYJ8qKJpre;TP1> z4P9+ncEqKi4d*dxir=C}oMer)XU2}y^J5D)CG>B zX7mbbiQb_`9%G~J6LpdEyUrjhI1_y5p*E0JsN3WPEQZd{mWIVqu~8N^qK;S_`=XZW zC~Cy#P#3<9>hM3f6@!~>$#!EDb@?a-1;<%bwEyAz1$E+-n?sz|_ziBybEu^lvn9lN z7veZOFpT=ft#;ups5L)?3d-}S8Tu2|p^yISakh~?nzED>6dVmu2VTaLobfJdLs_@W zPH+(w^$$^ZL1(uGT{vn9Ghqv?g9^%@Q8Tq0mG8Ix_J6S|_0T;m*?9^zC{)H&d+8w~ z>WJ5<58h`duD?ITX-|C^YAWxeX5cM0!%V+ewv0lp@k(5S&oKwiJzyO;ikgYrsC&iV z2gv_$3ds-Jqf=VUPrU=~zy(+a>mIV3#%#<-J;vb>r!6jI7qM|*@al7jkL`8K!)DnzEt?g1Qfje;; zzQa>`{e-1qos+f{%}~d8M9n~d)W9dX6qL6!QMcWNs5c%&P4y*IR6jtC?73f0d@98G zNIeZ|ZIhq28Ow)Ss;8*))IMWr+6Hx=;i&crm>1mz6f~u0u{?&HwHGR)(rX|poyPgj zMU7w;Dr@$jX5<_yx*uZ%enD+iY0g=_IO@0-s4VM+Uj9#`u#SdB_zhM)Z$YyYYf}Fc z70m@MSkFuQ)cUe|7ng2-M6G~ZPXjvqI%p5HKk)wBUz4G`!%TJ522RoGHOX4pw{{;W+gk~USUVYVpl_) zDztaIM*i=iu#G}>>~)>baJV1;#G$`iHnhKCGc*l#ciV!Bjf<$~hdZc^>tFl@12=8W zkDxmG5cU42SPMU(vaHH2@?R(Ddn?2V;AB*g%s>U#PpBx}iHd=zsHuL3kI=boGxQfK zsQ$&_nCOmuo|uDLlH1srkv~Dk>Xf@{v61q=YbVTb-!7aBbwD}Xg|$#q8|{H@C@C-& zC#Z~iHf;FNp7Ca(g6(Ili#t&Ri1DZ01yiFsUJ^Bs%BcOLo=ZVf(-kw~0L+GqF$JE+ z!uSa5W5grdIQpTMVhHNQKcHsvC(MESP#t`VI#1@mEOyFc9qMgRJE!|U3Z*DKK|RA| zeQZ;h7ZrT}^F4&Rz(p*Ak5MB||HMX|9p_MYQR$cXsXZNMM|HF!s=Wg$1_mSNbDh%^ z6vg*Z(fS!RHL;%A6Hz4UE>;nGwn zqI@MT$BU>L?)SG1Y$!%o{x7DWHCc-r@v~mQb^ll%Z^sJMFJe(l^2T1Ti;9^RsOSID zsQf>U>c~~ph+kp^_IPWb7p9?t`X6+2QV8-Gqp8b}irS{AnfM0v31<>2J%2)F$68d- zZb!|)5mf%)!oTqeK2`l+TcVTiZ7HIB@PiMvLH+Lo`Jaw-I!A*JeErcz^5B!@eWuSA z3r(>FulK?>cpjT#p8xFQ_GDa5J@CbXYXerL{vVFV%3m$WFQT3U;_=0fVq&1N+8s`f5*aZIu12M!%;Id2DOAUP)oEB zE8$@b#~8s-Z%dEwQczDbq0*^0Do6&SrgRi4ZKnIKL|tGnHpdgF*vSwc>ZN6W)PAuU zYvU8t`HMxd^NvMj(Nt8HxqB$+LYJ@=BfNv^K&fca2MIVL!v^}g_E8atGYkNkT|;X7W)7ROG!3^fBg zQ6oNpy8WI*ZNc|34;GFa>TOtEu@Lpa_&xp)mtmE7q0ayC8D_&J@$I-Xs4V+}$(8@{ z64(@GM_sreYDP+8MXZ9#=joURSEJr{0(GJbsIB@wY9{{n>!As)gYi%^lMdDKf>;1M zqpPT2L?JW&j#}HWM4{eyJuy*BQVrGK7PZrLL(R-MRMdZuTGIunSXhsW`t7KW-ok?T z5Y^F?iLFD~5{J6piA&L-4W}|{q#aTBf?=2yr(tf~jivD^YD%*w3H3fBHb!kk<544A ziuv$YRPaSf8tT-*MyTujglX|`Qu1F>{E!AcsYFX=J&uEl<|L?~D~QV5vZxMLK?PSE zzdjh%fmx`TS&y3X-Kd#4=hy%6Uw?y|kx)0eO>q&_32URa#;$(*7%W14A!@C!pr-IK z>H_akYaTO&ohK!#1Nl(xWl%F&$FH~bU+;|yYIisVt=ad!i~TpO@!zlmH3Mf*Be{m^ z=o8e10x9i6@lmmn&aan5O>s@s@!z8MnIWk2OfX&N2MRjT226>2P$RsC>F|+XkDkgd zlnnL$ET|I}Ld8gVRMzxFU2qU;2F9Y^KgX}HKrPi)^q&9EQqa`i@ft`U)RYBM+X)h( zraA+v=S5H#sD^r9BUG$(MrF%5)cY2prg#&oqeoE#yM#LKE+$g`|4l(7kDA6#oB^{? z&x2}jh8oEL|Ml@$m-=k~^+&jZdLY6sv<7vd?Wm3&MRoWA>O8MdOXH*^|1)7a3Xxb9 zHI+S4BU#|LZ$^#e3M%@aqNX$~U8wim5D#_1Lf8N+qGoI%=EF^>Xn%m3=@jX0Bg>hd z{MQ=Sq(LX_g*nm1qU_llF*81n40T4)9zP>9LVXTuC;VR~?cwA(YE2VlwwTF|`Ki}J z-77|;Hz2>h8MUDu&+J;^0u6csx{ihLD{AK|l*L9|3bm$>DH-~6Yu+2x!7-?*Uy96t>#U`qbl8oG_S2}S{R<;7N-o)} z3TlZK;$mEjt*~ldyVlK-74yr)5F)TWpPV`o%!4?*Sa4AfGrMosk&R2n_UwD=ws-N}nv7Ue_@ zq&(_Dq%P|G15rym9M$28#mRqNXgdws0Z*ew_zKhDXViX>vV=`>ebkA1pk}BaYD$Nq zW@I|%#x>Xvf5#D6yCk0@@Dggn3zlMo!^|#)92DB2_WT*BXx@Vgnpdb9a7x=qlAtHeEtp@IGp05|^>|tf;IghMGaQG6k(+J*>={bwCBv#gr> z5szRgj8V~|x*Dnj6Hpyq?AJG=I&$2v|A9*5cc|FNTFKVDIw~d_qOR8-6D$9FQBV+$ z$A$PB_2F`AWn1gVsHuI0I`9K39mA{Gg|nh&tQ>0UTcAeR1GS_RQTLXus159Q%!7Yp zCa&*9R<#YNI+mtB1~rw(e1Av9!VA=izo0IdyjrODn-BR>BU^w9*43yP`~!7drs_6; zLcXO@9jSt@4rt@QFdx;^WvJjdf!Xm_RJu4dY$~&(qP`$%#8psB&=fUOeQ*&DL1jyd znijO_P#rIXO|VW)^1lW_w~mHZG<>LKCvH;P?giaZBb$KRa4w$18g*=|OUlLRhjmdmr8$24Hq=P= zVi2$R^_!>|d55_$tbuJ@`A~UZ7S+)XH~Yf!Op+poVw?H`dXY@kKa`}u!U3OYe& zRJ!y*P0=X7z5vy+wZ8lP*Dv|6KSrJSgKwOcR?mRya4}Rc*2B5@t=}HC6*n`Nh6oA@ zmWG%U$D-C|o9`*qef$n)!v9bkONQ2VTrJevyS}UODfNq35BIgP4J}?~tp@;^F-=ik_t_`ZkTOtSV2b)Iv;1dPe+{lB%~8Qm+?`HS{5_zbu8 zwwYMg$7bdXYHNMt*E9B|1JrBcW}Jo!>N5Q-hTMLxeJQk#hS6Lo!*@3Fwf)VPSe66w z53q;E{@9lKc5Hyj28KEluqQUd57-(T3<~vrn6({;P>&oO>ivXeDR!d%0u{Us-63|O zA*iXmgl90t&`_r#{)G`(YMAZyt?@tV$8a7VVE`Igi{bXz9%n?Teyz?~gyS)CWTeKR@;dsE*q zp63FLm|zd3JyF@T4HaWYQCV^u72I!3*NHaKp6^qm-cSVfhFYlnZI6oneyFW=7HWT3 zg8HUpBkH)5zIRZ^y+v(k;gf7<&4@wjZE+oTM(_Logp=(-AuZ}IR}Qs-^u#i_0xRI3 zm=?27v8}i!YU3J-opB9npNK!zf;A)NrQQQIfTgJ5`~`Jyd9Bx#|L-Y8#cb28=lN0j zTLJZfBF}W&QVXJHrX;E(^-#z4LtS_nDqUy#^`HFuF8q=9GpK#0>kJF(1?XxozePbi zV8WR;Wob}rR|>V4*Fx=NjW7oG^j{y0y6`05#i%9upa1$f)JSimmgpgB0H6GN+*#zm z)-vNP+j8@xf~6YjrqUj@mcvl*n}*TwM~sK7P#xcex;-C3b?8270RN&c9A&n>Kb3DT z45PiwY|=;hU4e!cI3CsGKT#Kcj#=>wszX`6w~mxUO?4eq475ibHwm?5Gf}}h*LQ{Q zW>kmvVYF;_1hEA^`9e9Gua6h zBg0WMH31cjvr${UyM=;Id=9JO72JyH=7oAcwYrLm{=xG@oyK?&b%NvzEISJO4#J;l z--}wB?myT)VHnn-J_QGaa1+DA*!ag#r;qOcGZxv-6kO~zI9;$X2i(GMG4T>R@i^>9 zz0gwI2{)joFu^j5iNdInmPO4_H7t#-QB%GYtK$w-3#^@jYY zXfKJ%lB%c^jX+KLTvU)9Le1bMR675T5!iHvE#+X;>myOYIT5unEs{E5KLwrmHfn0$ z`1SZd*&1d>tyLM+>n%`0Hy9&u8K%Xq>o@=z5Z&Oq5h~ToQaC|JE#l)i5g+lHD+AYj3&igm=E>7cBrfxDxVP+hIDRCoercPsdti0YjG6ngCSZ4`pjSFwI zAgqq6w?V~9KhzS8L3MD2OF`+f4t3#us0*LN+;|JM=COaa=+2Icl>(?Oxf<%k?NB4@ z<2x92;Zdk;n2S1YJ?j03P}g%WQP56yA2sFgP*ML0GhmcW_E{|lYAVNJB|L(iG3I95 zANpY_>U*#?enP#k`4+q23RDnoMQy#mAlGx9!xYq$6R3_{M~&I9J( ziMdektMAvl`_906v~S0A7=5c{$#u+2{Ud6iIkxFMJ23cg0DDQtndPzTf-zx7}5 z=eG|=#mZPzOe{ui)q7DFIEC5pKUAJ)*>3lOD!vU-18axg{l6cDwlu89Oc-N_EkQoi zl$XL>I0OsedhCMtuohO|X^-6tQ8RfOHT5^K2uAL*jMYixNVu6u`%!e8^>X_6E@Yq z`ldK(=WB<9czqvs!@{TRrnUm#QNM-v@v?h5)Y(a4=b2FF1ok>>UqTf@HXQv2~;+YU}QS+D|5^TLjAgsOLb zLH_H+!)VZmXQ8&@UoZ(CMWxX#)Ce2DvU>R@wJ`cIBG`jqE7SzwQ)uH+v-J8OH&W^tk@gX z!8NG0zK^<2>VGVFbEE2wT?)EMbj7kb5fwCNF&92X%|wbfHo|GY^!L|bH^7=*8+D5*& zJf4g#s6WHfSoK4wGZ-hKmNd#o|7M1Y{!&QNI8`vK?*BC@u!TDV{WlCjP2E`3J>dXG z;5kf(FHuVs|C5a@BWlKqqh_EfYJ}ZT4;tU0W@Hd5Hm0DmV-0%W|81fWg@*m8H9m&Q zhF?*^_yiTzuTUNOfSS@MpUqUL4&_62q!Oy59Z($^j~e+b|MeeH>AnY3v;R2%P|%6v z|7XvB5vVoJh05RZm=@chPB_YUDk^s7qb|G)GvHNJ2mZtC81coPj%%Qzz87Z3Iq0UR z@QeS#ebfdK^{X9_9@T+L7=i6kua7~^*b>x~uSNyeE>uTPqTcru6};grgzBj=9~Qv^ z_>B|hdSA6Hr=cnh*YFmm4+--|5E2^Zw51-29dR6LW?rD8KP)WFn}I~AffPWsH}UO; zTAHD#rJR8ZzPYG$T^QzudBL%VhB7pqL#h<-g$M}P&Sh?WW|Mcr`QOCt_!^6Cv;Uq=%bQsRYnW!nv6eY}Ct3sHEdTUfi zX5w^QfQp@LQEg;JP%%&vwNbT4?SMm3Q9lh9JXwT8p|*Joo>>PvA2e#Swn$FdQojBQJj7Il0s-(slqRPtYMfk~AA z-6&|SMxlagA#TE=al*VutEZ?b-xAkO{2Ud%pRgt-k7ph4f=b8lP$M6Qn%NboePRP@ zNzbA>atmEe$v+fyU}${1Kmu$;JuT+MfvBuljf(CqsEz12>iA2jyuOR-SfT`$Rr#?r z^-5S6$D;;v5WOW&K>llQ4kol2NQyc^9#mA<_S;*cM${h_6SGmVvIVulTtfxdD^y3{ zqK^NH+R9@kvh0aO#Zp7ei0u-Q|7w^>gHALT%i+(c6aIsmviGQ)Qq;sY^0K})d>i90 zyxtBKoavL;@mW#PpUbZoz~t16qV}5xE(Kj+E^6mmh3fGx)QB&jmf$%?V9KOn-i}!U z^?Gm2g40kV-i5m0aZHP6QA_m_b)JuYJxj7M?VUDR=$(ODs~`RP zN>qopp!S19s2RMCdf!vj@o!N3!dKM5k|nnp&W5^9IqahRZ$zOo4F^%d6+MNmVH#AF zWip|aGjjmF-~YMizu~R_LbQ~& zWxlzi}GmLpK3}} zG|$Fwa5=WdcsatHHrN~6<7I4)MRJCDUp&mg;nYKOg?WG4H3}zEFPq!8Z1*e$txZTC zo5K9~o_bwWepkzDBkqKn^8Tos)fm(W7NI(J0M+sHs2RG3TDrebTlxpo`I6@IuY;to z>(r&74m8JlI1Mx4eN@y(%Wq3l8&#i&mGKTL2s0P3juk-7WI5DQwMGSXXVm-VqVj(Q z>V3PsI{9~nf`aNPDp-OAZDdJM?M1LF)VtwZ^H7gy}~l&ScCQLZN7w_v>@niiJ5dsqR6I zv}SR;U_(^Uc1KP5aMV&QMs;K-s)NT-JLg&Se*f<(1?Bfc)Kon|9q=#ejo~G%9v5|j zG^m-%fQzsYZpJI9DIQ&2i9Q(9zo5-L)7taOOpRpDMTq1=6!iw7ZnRLQNeT+ zb-+1Phi;>0>N#qw4VJd{?3jakG1TXPE~vZc6x0%~Kn34^)OmmRy-PLd{(EsP9&HxIE*6G*|f5yR>pt_xC8ftA%p{DdbDjULU*k{8$ zHSM_BzVER+?`vMm*8U_`p?)7*V~*N3V^gu9p8p^C4Jqo_2Ga{QBRf%3bOaSN?@=8M zscTamf$C5})LNEDt?@|I8qe}wg?ir})DoY>oOlCMDF36^vllX=qP8&V!J-zH#jdEe z-GC+WFs8xK`nFM}Lp^AeN2O~g)ZMTbsw2}-9axS!elsfOUZJaKbsE?SqoVRPGwOgc zetRuUOT8zmBQr1yu0p;4BI-gCp7j=J!-s136^xEQG_{#piMq~i zmxA*6H}rz5nSEM~Kpjv4HR9T+8EAnu@Eg>O?Lh_SVgL0rsI|X|iiwY?<5M-a_ht3X zhxuuDi&M~rdtp|bj+t-|mcjd29y7GCPq|%DGxHD?OetDgUN^-^>f=x|upSiyM^LeG z3ALnuq6YE-308jprvvE$op-3I{*1*jMr+%sDx>ZhUoj`=h<4-ywqBYlBk z_!*UkPCHww=%^7lMxCcKDhozqO6C8L6m-CD)JTt@4mgFHvfoh`e2z-5H>eIqYj5e8 z997SaI<5@P$2zDreu|wjqJwpG0_y#9(bWZ3Q_$4z!3aEsTEnNP6NGiNEwnIJpgs~y z;R!5;Q9D^Slt%?)XHDD)=g)vY;7i1M7^s-mq@2jdU6f z>gg&}&kms0^aN^uxPsd8zT&T#rF)ojB80D4QSU$2!(!+hYDS-!n8p zYZX)nhqx3p)iW?Hu0ic!r%_WG?OS_eeAGUX2{ncFFdq&_Z9H4CCEmbhShSaIJaf<+ zd2j1rXH*c5Lv`F;PC*x5hw9N;)P?S$qC0jUJ20DXRoqN_7o3VI`dZMgMJ?qfjKJfl z82AenTOU!6X3_fD66Zi(cb&=<)WfFM;B>-$)CZzEROmbFNOe??yP%e)7wQ5oYCo8P zn(}j~DZYoA@CYNSyH z*ojl4f+>SmX{_mxr3mrtA_&3yn&rk<^M8!mufp(z^ zsF5^8b+{F3O?#s*G!=CZScKYF_M#W0=*H+|;YM>HLx4YbGR2JMujqDS)#aJW!m_g0VBs_(SaW{4y>Bqzd#RF*f_zy zptz1Yf60m7#^pMdC};!fftt$cSPxgA_VV|rH4RL%B}m|#0d>Jbs1aB8>y1%C)&+~= zcua$b{r3B)_lHi_CnEAMJ_TJU3F?jMQEw=Rnwffjy*nz+hMYp<-h{>cSUL zY5NlOzR#$RCY)mD&43zk0gSEuZ$v>I=!iO?H)@I}qSkyiM#ojCJ$?%|#&}cx&j+X( z+TgnvyHY=m`9t`CGR?B5+jN`yKB)a*2)cPGjHaNG?Z629)qleq)RKHgjWq5IJ1{jW zD>9-wRt`0DHL(r$Kn3vy?1oWi+TF7+Y9OHpfn0X6d9u_pfIw-;JqQ&$F0(q0#9VagxEoYvSKd*NB!f~6MP1^z~T zTF&ufnD;AQjThNt`dVDf``q&sDpTmW*uE^@iBUMbt{mBN9+qVpoC4B!!L2K3u&*K1$jg?ng8Z|-% zS$kA_Pv2pv?3jYenk85SccSk5f1`pe=_U*GOY7*-G3vd#y#mQK3U6}Wq)Q8cn zPeYOQwsTFzYScHN^8N$1$53 zU~$ZY+HZQG?v^t)k^hw_Y@K ziPB(ZEQdN_cMM>E)DAiXmFF{1Bb|$yfpw_!9zxCJKd26b@A0m~`cu%_rAOUF%3v03 zgSx;ZREMUcF1!?Vf%T|ZIe?n_Q>cL?*lW*>xiBB~F{q{5g^lnLYJVuTPoE{p{|*#% z;S~Gr0>w}xu83NzuBf1yfLh!2s2Dkp%7*iPd-h+f1C=lh!@;v==%_{_72UC}hIdIFlYHJ7ssN^`~t=c#Zmd{t{W1FKVigjX^D1$#Z_MeAs(i{!u7tQ8ISa4_z`mX|CB68~yb zSsFDn-Ebc+L9JoS%hvJH_yhIzs2#5IZ}#QXZ>Xh6c*SO{6zU$)0L$XEE3RGW5)BbF zeD+Os)z-WuY71?H>R2z-eLl-I`{tuIR-ir^)qV-H;|J6|A>(xmx@uU1`f`lG*SH?z zyT9A-|NMe!X~=LR%=^2)N~jYoLhW3K@mq9m+6L4Mb)ltL7tdiCOnb{Z)(#`6FUEFw z0IOrS*{MEe3)cu64%CrI_w4lIBvsrNyx z?R3=6cLkL#UvWAXcoydU84nDzsA~fJVPh3I`EO}VK+c&DZ1_R!6 z{4vyylsG)#ani+w5e-Z3}^Kcn{ z!L+zEdceCqyN4+#%74df7!f1jZJE_E1NHu>sQuCRE^6c%Vg|gY<5sAxc@AoSIE@YP zD{844#0q$~XBV{toZVdFu61laDy@#9b}}bk z!28*84b+9^p?1VWr~$o1owq>zfR`POQLoQI4eT(MR{lSxkdyq(njqlZ#U=>@4*#~O zQ!H`7;UBb{CcVs0q^!Z0JWdY!(_M#)8Z*q$Dg5s zyhuuxSozq)hZ%eZW)zOEjB~29>aJ0{KisbuG1>G4MbfWjDv}u$f;QjDSb{y^%O3DK{A!XAxw{Tas|AH%6^!R;Jbv1+PAsQba?{a-|g2zEzw2P6V!XuNE7A_ zcu&(cu_E>ExB~x&!?1C_fcGb!S5Y(Mw$2~$eue5fen&%(0``W7xL@^x0q-d|Mezwy?${hJVNc9e*wSnaGg{|1KwWW4YhWMP%&}K zZ;w{YmZ&v)CqSjo3si?w7Plptg-WxvI0(<+Pgto$!2898=eUacn34hSAE(bzO7C}x zZVJ(O;REWzVWk630CQm?%#TW!s+bCg;YnPGy8U)66YxHm0q26OYxjcO_3SP>7AMob1N(7&`TFF) zf@yaHi{6Nab~kH^+VOty>n|}c_1ul@-p~$9GGj+DRv1gx)Q*eS!h)+V*5>^qupwT; z2+Y#bHlC`e?D)AQ`QM7dI~w9)!&cVQ&ZxDUkC|{WCcxvUwY%ZJeh-sT{|ifFXzPIY zal9PHrCu9#-ZrQh=;ODKN5$HFmx4}k6l35W)JUJAHk#CJY=AM%xQ2!GZ#o_HO3u53j>S-}L zZbqGOFDl*6q0+5N2g~=D7=txV+A-jL0}|QEvMdMk4{1Avkfm{*%v~&>T`b87HlXf) z&rlsp)YbO(QrMLGU@VANFfGRFW*yFj%92{ByWtS5i94}0M(J)dS{ZeoR#-y$zng+C z^d7Zl>AtZ%&4*E`*TQtz7`0S`Q78T$$KeCiOm*);Fk&y%47sQ+eIiD|ji?ydjv4SY zhI4)AHHFyt-Zx55o2tYZhxQ0ej=3==Rzr=vF)C&Tp<-jK-@XV_Q$OIpeh0PjJVnJ+ zly7ZdsnOL5Gx-hqQ5`AaTOH$5Z-!dy9;gcsM~!G1X2i9qj$TB~;9dXqzfljRAN}?O zy)2d@Q5`DUi~QFX+mHs0q&sRu8i3p!oaKJ|YgEVnLj`Bd-gYm@j#}&Ps1B}1P5o|E zRvbmm+*edblJ~LeFU9gqYy!t|*2e5jczkBX5- zsC}X}Y9Qk=8qUVrY*33(`^L-ucKkc6MLmi;AmIH#un{h&;R9a49|!Wt6vC7b3OJK+ zM?4j(hdtae_&6%gtZx%o^;X=w~jPHb-W!aSo>mYbO%yUkAFw? z_)pZ7y+TEMj1jih8Bp)bfr{cH*a>U;Zbt=S>X8rM;XG}WAf~^7Sg56L{_7f_G zc49Q;|1}D&X}E`#u-sUS>PZ+ueG6*penq9#1ON4~akgP)MRlMH>WOF?-QK|Db|6`b2wQa`gWGKRpGdLlM-4Dx*f+5_LdNzuiT3;Cs|gw-FU9dr{GS z6?NQgRFJ(y#n2nnlE$87uct?yC;ue!UmH*j8WdbjQ61=rY9HdaPw?yCqeij})!|)! z{e=Je9n?%bL+uCePy>iM+0K^~HFFtI*DE}kG*QpW(;%B*Htd0l-UX-;oj`T$I_knN zQEU7K72Oe2>_Qb#J7NRW`-Y%ipM<*LCe-=%`mdjLDQJpr`VH@}Aobu>i-F>(5j911 zustfx24YT}fm(tCSRHSmI+}T!UAQDxpxzGEu{Br^R2#Yfz8zHAM7L77VORYVlE7L zzdi5bMC$+G1RVCG?VwQ?>BBDh*NTGHXa{Pcz=eMby>hU!0WH^ zBW_t9@css5!wP#OYyOjscp8@B^(rfEDJS7H>W5G#4uQDY$U0O?B3F0cRxjGT0uEpgNXiy`3j=gRSu_-vtQ1WoCEcGOI$#-3`FH^!flpDIZ(k`8uMd+RNAdarRjcD`u&F5h#sPX zJ!HF?VmtY-k5mO{$c^=|9gao?+h3R&6Ya35FNu$+H$1+lks=?x4~+hI`QRH3HR8(63iR1xp)@iPJEE z3sF!z*budL2QdO~pw|2|>cV-BkTqBqwetm!+7cy1#Y}Eg@Kr&bw~pyLttf=i@D1uj zy-+6@i5qxf29}{->LhtfeFWAaJ+GY!IO|w~tmgwxU)rx+V2Y_%yKGC>`!^fdkEmGM zhvV@HYKi+?(F~J+t0;7&;WuoB#jjdAE%Xh!W+&>1*LZy_Y7JXmw=H-Q>Un-QDp>!( z^cd}T`+_0|_NBf8H518h*ztL>jPk!Fg$P`Nx$q#C#Mh_}<-Qs4zBZqZ8>uJ0WlMDw zHIiGn0OQ@Z4QxIBMg0mYcz?NL8`EdpLw)-n_K~gkUGo1O4bLfj!Uy-P$A8?nFBBR* z2zbBkb{*64dhv($h}H_VQ!YS_{0Qov@C2)1@CFfZ9*uJhOeF zG-^L+i<+r-SO8}{cP-71Kev&*#lpOh;)R`{KI#Hv@C0tcRXFga%|O~$0q>vTtcF_q z2dLv?y|!<~Dx#KfJL-ao{|sw4LjBx3J1+CTHgoN;GwnxFOOo@w%}8g|{_+CrVb}+YF}D$gG&IaX<@a_hjTcZ4 z4)H$PU9b^qgga3|br|HWdN;E!*ogXQETa6sNkKbV;y}>57gWP$)Q92{ypGy32L*#pdEALg)BjK>&JiB; zZd&cJHT4tN0kcF2df6}yHRac_DCUS7^wz#JdjJ0aZz}LYv}i$ZqbPwI@fMtp*H9ho z5jx{K9${dw%57Yjw>1ReJZ z4Yeq!0~zDmg`1+La5(nFHP{D}#S400K21R_!2#5aJjcykAaDGjmzEC_1ij~glnI00 zGh$9uY!$)eSkJHbNEo!={~b?*ZVF3KBi)EvyZe4ULn52BG(94<{sC&RfRL7UQ6b4W@j+)ZaDTCg9`5T-~ zJ#MO?w{!i3y6F^2Z5`-<`=}4bI%-c7^qvzYp~F(lLk(blM9_PryXX5AwV|a$0}5xg8R&vjsgFgaVWMp62wkjAK~vQa%i(@(fT7ug-c6`6_M?6iwWHO|VR=3k zYg2!Td$DxRp!ZKR|A(`vf65i~cDiY~gWgB4OW2n754Z)J=OJrc)+$ckp!dbX!F)mQ z3Fr?@%^O~0X(rOQCgbz{alD3F#GzC!?T#U-!OTN#2qZYOH^u8s1oA~zio#wmN z_h?b_Unl&-Z}@~MsV6RG=JT!X`;G5J-&MXxP+Rd`)XgPnahs`TIF0%b7$38hFiWCl zqD~3&U-{gChK$$^^^`gj?P)L`^$e&B6vC)j4x3_iRL57LI`%W_ zCbb)5;uHV%e^J-_ifPb|R@&As3+e>rQ9Z5h+X8i=9{%h7F|S4>_N@MS-*Z86`ZdyfU(NkTE<7+ z-6F6g7DX-HK-5%E$LhEMb>T;-8GMdWxW4nof8jIg!l4x`I1-{RlnHfUc8raAQ5`LV zI#C@|P&GznQ%BSij6ii@GHMCtpx(dScP+YV*i1n|w-a@u3#c`}jhcZ+sE)lyO?mW+ zW@=Ov=S6j>f^P%VaUD<{{tk8A7}Wdcqq1dvMe<)$dXNUK{cY53(Wzu3k3^j~3+hBg z{PxPIk=5|q8=*Sh(QogIO1oix`v~koeVX6?1vQ|M%C7Y^L1k-*MD?&Bs>fAOQ`rKw z1f5X__CT%ia8$6(Ma|e^R7X~03f%73FQJb619iT?QOE!1QqX}3t5{m3Le;bQ=0#n& zm|ri0%7&__ndyp}i9y&JN2Ai~q3>(d1IK?DiHWOPhl`AqQ z_Shf$qb~Fk$KeOm`$tr>t#mvVq&^w*;$hT?-(h}?THVfD0(IeXNDT1ze||#?%*6|B zQByP%b-^D|Q@RQ@Guu!j-0yn|b;2vCnYn?Q`cJ6XN>alHk{>l=l~BRi2%{?hJ5x~4 zd!g2RH4ekQmjH6>(sL?xfN=kxr^GU z+SIovqrvEAq+vY;`77!TA29AeH>Prlx0NdEswL$t>BS#K3;2I@31=b}1x%Qw)}I+hK!Vb#HO*ab7=WSolI z@I01pW;2tpx%mxlq5T-D;{#ie{|c6+ErQNv+=umWW=o6OKT$!MqE*oQad|aV@GL@| z;Ahl`u3`j!LUkl%YqJ7s06kF0eUA-sC2HyZb1CSFrFom6bC@YvjPsl^kCWv*HL;@U2HJ~1qx3zaQyCkl}i z#-XxcJx;^>SO)uiV`;Pvi&MXZTI)DHY{X?yOVAce;26}taTt|7S5U$C276-Po2`{><65%4aUOm z!+e3$YUJK`nLISc`$o=#HbIGzE?9 z1TLUncYM%(WeWMdac9hgp!dJmZZ{?9{a#d6Yn29C+M8zec9*Q2ak^n z_z+8d+z-~_tc!!*U&mfXP5t5}1Upt)O8#%45Nlb``*YYmxSV>=_Yut)Xk&K&$a~*L)D*RI7Z!MGZhC1Q(ueYG2`Z-_am5}QF*?0i+v~! z`Cric8gDGtr#;@*p!cJjjxL36G(5(Q*kD`G`(@L>cB}WsZ)i`u!|Kye50fQ#+DElX zsF58?SgKAf({%4)}ISaG*~ik^u>sk<@u*f$juP#t)K-EsL|+wtP=vk|nz z_O$TwV7=@zHqHY{^6==~J!UsTNOKja0m>-0QqU$J~e zZ7eO0*q2SyP*Wau)ONTC)PqP()Y=|H?O?Hv*$n1D)#u|R+=aR;Ryb}h!sgWf#gSP5 zgtmC{?<$2tG{ih<=~5nRQ*Vd0a4Txf0;lZzfF}5g`Yrqo&z%l>|1+u;XRJQsY|#6+ zAUmB4dcSs;>3q=pSrv4AUnOlp?F%jcvaR_8j;6lpvCT+wKmI9yw`>oldHEp$GrM~RYz zdk-2dQF;CYcEEe6HLIM|Mz|15QGbi|u|TqL@9Xx7s5QQf#W8Ji8(2%sPW>!?iytww z^1oY(aPN!6*_fFZVx+Va=SQ8muU|ijxv57>74Cf>SQL9v--J40y42y`4>Yz{t*xHdg(0T-bc5v9O2$QViLN|c*CC*N@Lla;oe`X zjKVS0i{%RUesk#{YJ@R!+u9Dr)6~zQmTW;Dn~D3_fO>ZYjI$m$oT0X-an59s-_W|TCYJ@QgTWr+9 zs?>kN-x%>L%uD@P@o?|S=L0G>QkMw#zMk(^g8c7F!xb9z&{?KrxVK}yNB)@6*;mRs zHo085^FOxM)aApyr`t;vZK@xl9VN8Y+cN4mb{O=%~-n}eH+w=|h9<3hXF5cI>pDkhb@2veb z>O4dG+s+wpfOUK~PVn-7V7T{Vwzv2bZyY)<4+wYaPF;}h1_|ksZjc7)?nb&~=hyVpMZ>|AT@b@t4ifim)|BVzO!ao-qIw#QJcBF$KvfetV|@*XIj@CVo( zCLTvQvHw0KL~9Q~aX>NSW7I10!JNoDpzMw}VQb`XCdWAUk#kQmWeU$Q&vzb*nWmg+ z^-O}*8{$}HRTvdqT*=aX@P1iskmGRMs6izt7GvWA7`nl_Jv?U8?g;)*|- zXG%E(c0*1aAEUwQr?4LKEhzZ~=9_<60#DNMTkt&js~2JaQ%Uq+jCsNLmYCM=f#Ulg zL7AC+OU?5Qfg_N&LYd0^%d8`NUQ_%bg~xaLr(su1*KJ>%-Cuu9W3~l#S1?`F}rflt)5MA5ptKm z&6CEwh=y=5A};e1iE?o2OXGPcOA>yC6~I<77fkp%M!(%E4@{5<^Mo?8U*6ixRD5Sa z>;~9~{B-}>c0B+#N6yRnXDc`vidjE#c>hC`r$_>qKHJTLVxQiGE_+;t2a&_?xpai* z-~*PVPa>DSHS2ci%-n!SDEG0)rG6yV>(UuK3R{yu%;!?2ya{DyQpUPexyQ!x{ih?y zcuvLw*x&DRzM_F(z@@v@)v(LnvxTj>-aO9bbcBbXj3`SI>&Qqr898xMm&4yCJ2PPx z?x2Bpa3|be#47Am)TJR>+F~w^WG=(4TwnH) zOT+BCrCjRK-Yf0WIO1hFmqtiS%e&MAwya?F1uB{@9fyO({ySB2>Bng9z#Q~!NM#ov z7Gepix$FenctyULDqUU6L+B~>-_rG@d6Dj{~IVScVt6TzCxe4 z9Ela1z{cap?oW1NaGY*`_XiT#knlfLwvY;eSweyW!1T z`sA|-iXEqKZX@ps*C77^MY-m+aH&Uq0L2;#v@~UJ1f@fhTVnsynCkmvh_dx<>(W1y zUk7DstG08gBN+k3Azg){_1W6HG{EQqWlE32cCcp$m&51Io$ufQW*+}1oZ^AM=mwerJLFcC^LT{LPC`11zZnvj&i9hz6`}PCL3)X z>;q*=<6#;25LSZO#<-lausf^*H$mBq{)W=g%41#X`)|Tk$V0}t^wBQ;cvHg2Y7(ot za1P3v^qb&PUw;-#MXz94SZ$(d{Uj($u@Z_dJcHtxGEA}&Er45)kHE69*JPW4tx$9+ z;S_V(xgj1j;w&N|J%0^FTgy##X*hlciU({u&GP?&;$lZlcj=K#V214x-Qg7SU&3v0 z%uMqOMP|7)g8CVLN`8acCZB>58y1`+9mf9Zl8^!eVKMj^W`vpM+HO@5%G#}hvLv2) zE)B&xz*5MkVLg~Q-e#sT6dhUvC93`xehy2_H!J%d${vz`0UlTEe?Ez(@Eu$Mn=G`c ze*?=Q*ZkZXm<~nz@4_Z9=OSxhG!$Jp2IaxSz1ZZsP&yb7CE~dPC4R`c#MlHzq`*WH zQs6WcvrE0y?6yAafV>P!xtL|vfr_v*^5m%e9QH#lx!msG3dPYpf}$&#SGY9l{S?ZK z9D-fpn-$oWW)fH_v1)hvZYkiUa6GoCe8z7DL2 zJRP=zmthT9Xsub%2q^OTwb-dVBBlPqD(C=ZEjL1m1^M0)leFmxWgJc0ec|F?6eu_2W18}z=7~790xn^V$IdH35kJ_0U9e*b_=PtSM3*2swuy7W1q zBm4;YKAa`?pYaeOQ9>$){7$6P^QeVL&5yhE2`1SIoAL~&&44kM_dSKuv6|;h$u>c8?QftgMZWVkll`E0+U>9n?K{2;=3sh2amC+7H z+uSyXGzE%-`VMx7sqbL_y+};BabSFkN|x4X86=b(7T9QR!M;j+U~gZZ<_)DjiL4)6rb40C0*4%LF&kSAny zNAzj7L^iiRI6Q`{xG*ETtySS1Ho{3z8oUBq!t6QS>dD5zImp+b1R%X~xi!MM4<&9$ z`hi7lJ1X?s7*$*LN>w;Q1QSPF}E&mb}KNERN zA{&W;CER+Lv;ssqjyUH?$R3cPvf1$r$hRXpXW?eJwz^wg?I*R|8j|&dGGhl| zb?B?@*2w1*DCT(r_JK+2xb^ve9F)`YN_E}p%5ya|Yj^}}$^M`E6YF_bxQQDlLvf|W z8@ct|ehqAgd8{la85SD>mo0$Jt52Zt~O-<>VK{3-5&CG9XgY{_N zDc{_!q1RlPC=roN3tL-X8|%m#Scq~-+PZa5s0zm;cYqR@{02XP8Qa-f4}xMPm!X(* z!S-e?Q{hPDJ5a2pT?g!6rt&I@FJO+2ZuRXK;R@ttolHyLL0QA4olPklb#ZF|au{Zn z`?|XI`JfiO##B#%JIU|V)0QetFY^c8VOR23LUB}q-q?RB5^Z|hnk|K^k>fsfYsj=0 ziaEW765S5#b^Fm9bqNp|6n|<)X$XgCX_I~K!3OGcJM>w1F$0ewLkXX zh(!JYWP2bUPE^4^Zs3^(f;t*qs+_Px3fB}=Hv5`3oddyNnxWUY&zt3Uxpvx zzBeni!x3l3D!0CoP-8U?g#y8K)`8+1F)QSUa0u+W)wKS>4!1tZ^w?<~cn(KX;ly3G zhxm89on4gQ373)Ib-yXK?|^O7b76oE)jB9jkNvec%oI^D=7?L5V79}x$Ssb#^{h7W zmo~LWpu7z?9kdR4W8w`*D|TA9`)}J@_BfiM;>1_3`@_Y|Zs-Z_FyjLwVr15#@((&6AFS5??%ei~Vb$ z@y_kYgTWlw4c>&Z{Z{+W9Lp%!0r@BtPnV5PhRc1QLAmb|>b{3{ zkmve5y8S+cGm+=Tdep<^@O$)7YBo$yeujXxQx;}Nz67hleXA=u?8v!(Uut~dya>%9SGq?yuL2g^fQ z`}t5jVP=^91Dnbka3Jz>C{Hpeb9;2pSOu3Lzl2PsGcS+n$O|aDT>88orwgnDJHh=> z>dlnTquX<37~w0w`AbEQev;v2L63UEHAQWT>J{_owi_t!QO`IG$`ocV;c@M7QJo^05s=P--u~Zd2_WA#-6)a;wMUQ&8 zLX|wuIVwzC&7&X3xeR3&Tu|MkkL$^6c$}Qbm7!QeZzvr*6_tB^?9n%&PQtw853OlS zwH~%ZJ_b|6Y_+g|QL^&2JQ`y4h6|8aLkSSd)b?mxKL%Dn_SUf}tOa)<_krzUwz{VM zlc8AA1}Hjn0gAF_sOQn3bQWxcoVdP6pSW5?NQjbr3uO&6Hn6oC3B?mWhN5&08+!C; z<_9RcQ1cV3;3Sk07HZ_t51F-t`H^qK9x$%4E!_wxy7fU5kA8IPCOm^2S=ZE~MoCMQ$G=|L|zAF zo2}X2>PytYbR-8XOa5@!5*~q-#QxKDvGSsR)kNWEWwApjSZo=>LE}Z(Kc90%E3Y~=cl&&wS+~H<6$y*9_si1KO`}f zj5K{by8q9ItC8#UwcYRqJchigpGP0hJM}lm6Fb18PtP0R8m@OA=+X1OB!f&hN<(qI z?V&93Kv)${hq9zs2Vws*vh0IB8qbe{((|)WwAeR9zoE@31!d%ipeR|wp~jJL53)0i zZTLMRDJbUFd4z4-*Px8F_ehT((T;~=_xGX9pfd{lmxi*AvK}^qqMf~90XPMUHXnhV zVcOBQIgNvJkdMI$u+bP>>)TMKxb|4%cqp6E5jYk4#(A8t-~u=TwvCLpwYvvDCnMDa z8}V*91-ZyXGsELh9v%lwGF=HyHYHjDx03%5N(1pzJbL()b*h=&K`0I_(=^+T55ir@ zq3IT|L{5>IMMmQp=0Kjn`b=f#nI1j0IylFsxcOX@lg_iX-w8!0>c@LD_DeS3wIU1at=0e*?um04`N zTY_cgf(yW9lzRv((DCuhZ4dcomATqQUwAZ}e-8IjZqYiA^9%JfTu-Ew5c?~;2}i?? zS+;tdbrfj7!#0z^PTQ3BK>0vX|6LaA_1tGml5W3E$O%){L0@^ChZ6ti_|~R4c)_D_{Au`r9v-;t(I2H-{)0#VIIZVZ3qC9S zXxntcYu4e-P&T8+*I6R!i@o8|Z@Jod%SJr;w#P|Ae#JXB6OHd%hn)xL+FC9gBC!*8 zcQTCX zqM_DXYp}#SkMkn~dkGIw?qULO#Cb%)=?T5cK`~x+3~jt#jc&KXQ51X&#b=N3c^%pJ zZ$a?~o>;GjVzr>`1-+v3QrHUlC=}P5!SB_Gs4UEZ{3#UIz0e==s*C)M40%k>6!2=` zaW3rDpJZ4Z=T&=-B=I^26Z0t;*n@KYQhL?V+)d-v=(j;yubvq#gyJ_`>8wK~peS8e zI2LA3?^Uy22c=w*NCwO30!4{lz`AfpMz226B+lg3cRU8bVdTeT_G-L88g53u3}u9) zvv@TUS_wsd4cow!S-ra1422Q{9*3X653+eRpoxqkA)Cf2D4x*C?p58(-v5D3?NcaIStqx3d~lRS@_03%`3uS}S2eHIHzUgXP=eTE`Mlz3`TQ>lS=-z2 z94zyp-4MucBW??qlYa|Nha(Hvl!ps?)zLJ9ACZ3$wuP^utbOxBUfoj;LfJE1g-xf% zL0S7t@Urax*@}2o8~=svxUjFN%}Cl}RV)w7-@a3S(5C@yw(36t}b zw1&Qda*p`^M_#8I90kRpeG6B?vZcIE3)*)ckQf6il(w1p3RXhSUdCpk2bAsdODIYc zDr-wq0oF#I0;Pc)P@>^%<;*&UL0Qr-p@eRK!Hq0sm-1exGfY<5>qO#7M5=l9OeT3v zub%yGfcvj?*joCVc=c?z6BGwC7M6xvpiJrSP{QW3ZA|zyFzLuset>9qf zZ=tMRxH%ME=nG{gU&F|F65XcSn*If4ZHi5^&Eg4MiCllW`Gc3R74o(jUJa+iGrb!3 z_k=RF@6WOZJ3_JhQ7{W!2xTUYz+5otY*XGcv$1~(m%k)K*61~qsp>q(eEUi$BXQ3) z=73VZDwK*xMDtg}uE-~$nB9l-%zPI@aX3H13h-f+x#F#zp7E^79xkjSLn>}F-?qmE zusHHlxF6Pd@aj=)b0|yrI~)je95i_uY>Ipht{3|+e8?)i z4P|OxLD`hb9QNu_=})i#a@-M{iAqr3m>dX2IkO$N`zu3nJT0U0P$+9X8?J|cLs^n# zC(L2phfQeT$#>GGaw3!|dkOo(@u$4{Zq~n0W@7efuRd(PgR(h||H>LX1qUGCgCD}C zXKcnMLy=>@wgHub(!m?BHhc~B_kXK>V_G{5N=&ySD&K$=k&}FD{-80GDLo3M+&@q@ zsmy0>qz&Q6$a|n{r$c z*FxD{UqwiW3od`tt0$OWLs6E#KUvSy-Lh?VE)?JGyKOFcCKP2Ye8;Pw?;QqbBd5G; zal$582|2?(8*xXt5P3Hg9jklaIuyA>LUyH!4@{}vduZBR9;z}yS@X#-9-f5NVT+%w z+!s)k>L~mI-h@(a+#`E#NcY(Mi|045o)?^eXShE8ca5|nPTfDOf}v2RWIn73@4|NQ z!>87^;~c*+=krpmCPKA z7Rg+IabG@RvM+lHUN^Xh5&y@WpJD)}d3eERo8i@iSibw;OG zz^5_f$8kQ@odHmka1)e{XG!AIhuWDihbU3fq(0TkQt$}!R4Ddc^L>-2Krx?>llkZ!}(pr^sKC!lzG8T~hjVii@SP4*d(yas6yMpT-l5(i`(FSBic2k@)u(nGfqjr~!ZNTI#M3W%)~=6%O7ADW;R`6pKdl2iurVNx(8+RDOud7k=DEj z30d1}C4Bm* zD4y~rl-SW%*{7jd6(}>Sg)Q>99G2nheUQVrq%c9X0scL_WuiIs!BBQ z>7&+MDESE*`t*sXER+!+gtG6a`NXH&Z9mu%`FkizTB?z;Bb3c-Iur+X8Ez8$Pv6*X zI19yt6>8$sZT2QShTO5KX?f0OKK1QApgcStg_+@NC{vlXxlhlM8bcZRR49AFB`Eb~ zYhn54q0H#}Eg|hYZAh$xo8ThGskAe&o_^OzB=j`MdvGZEb0C zcQgl-q^qs*(;hwzT--f<>H$ka+03rMvoN+7_J5cPu90{G7xeXMG(2{o$)yIF{pTF! z(}&IRP@aT5pIL{08{yOVKYpamROwMZ{a{go(LQGq4Ge%IVS+I}jebW%QP$f~22y7% z_AgrQ8|TxI>k6ET+;6doCeE4v63^B?Z(Md%z;#%>eGXXgwss*AISzoOz+o zSq6tddA3XaxtY~KD4WR>D0ba;kyShcipP5m#c|bKY)dm4RzNPW#60ByD9?VM!gZ*HdWu{~^p#&%op_p6G9F${x5v`M#e@s2KnQ4K0SiH2-}JMw_I-(9D_3`P;Z0T|2;Spx%)<+o{+qQ zWs!$%vR&>F6bF@iv)TE0_!woq1|=#!vE6j%1#E*{Wrt5c54;Y_5@gxwb4JjnI$&nT5cEk6N+TPL}$`Vb6jp4PU*#9FE1-~?{Pjk#RoxZRv`7_`ucoCjqY6l!QJ1%?L zJmn224yD&uwte4%ax7Q=jQNAjuqSfd*FHT>9|@)WpD-tE`%T2Of66zewP&Dg9{)k{ zP#wSZIT>KavlbzhhhkpqVH|t}#SH(2n_$j!(fuEab)-9QYu^V-By<_(g=H?7we*aT zkhPuyWy&tX3^3D0tDpiD?T?2tWw)R>o?_qGW-C<1aoCz;+q1#VB=RPcR3tdQrncVg{ zN0H0jw~;4&U^DbF6i3qoN-Ve%)`hQN30VE11t?>o%-D4(o;2&vwj?8={{7!Q5;7&8 zM?U>vVO2N*`8<@5+ckbnPZP4XzuA62?GIC;?NFvP(^FfjzOXFvX*deHpP8eX3`G}G z{AnHN4#mTM1y_sxm-@@J@g9_s_@CP@*cMJhehL@D$lvC{QoXP>UJ8$p-}a@?*+)k+ zy)yg1@vmunvNyIjjECZKpF&ylWN)oQQ(#2)>Dwg4Y`VR(8-Iwh>VG^yQ1L#KdH>r3i4&`?!Q{37etA1cTluhjy*cR6D*!3My9MoGV5l~TYY{WTA#iPBk z8Y)!`#OhuU4@GHyhGK59LA#+kT!uUk%32o<#X2M4L@0Lc4ae${%n&FZa3PeXJqDY? z1aa1(=1`XINF2X^C_M@#v5e}l74qkBDEt@7c04d?teWLHSQYsXsAl+ntZqJ|pfnVh zELL4}T_{R87m7c*0F%R_$*tqHp#-hVBP2?acnzf^g;T`puGI@lLxGgB>ZuyRTF4`z zOzj0&2^L8etBz$D6vy&2l$lGGI#!jgB$RD=I+Uf@1k1rt8XHig9tlydzR`?8TDvhH zlqnhw<;KfUqS>P9Y>6g8vHNSV0?e8|RwJ7(P(0#pD7tYU%3kqFhFJ9vm!Rw^A7+e| z(2e+yL_;#hWs22LCftBok!NL&)zj_0Fc)%xEH?5MP(0#sSQh%S#_Gf5$FL2$;kL*N?)5vj2A}5UZ{;QNdV!K3@hUM)Mbn)yM6o zP^LUXVOzU#a5WWNg(u+f;&5=vCvtaPkCF;yuatLB`lvMKR8__^4B z^(r>i58)K#qE&5*PrxR~NvoN%^n~q^Pr)JZgX*#R2Z(E6e&okdrmhj|jHlt6Q1Y+T zidBc>s%L71uqkr5wJB$Jm<)L1>WBXBTs|o#93DzkrF{JTG*O)rZnZ zA6v4OFf-S`g_Ge^DD4dEYcm!3nuHX{)z6f!7L+Mo0ww=PD1P8A6lJQ_KUPDj5l}Xt zXD}Xa8(`K_ZD6b(w+9EARg8ySxPAc+ge3->gW3+0i~avV;v+8n0lUK7L(I{{!<3L)p9z!n!cWXJ*br;7a6V!%Z3YLvdjJS@PrWvHiluV*gV{ zn*+%;24&&GL-;ubb4`fVv!GK@IyPovtRAEN0Y{5GDOOLj+>>MVZMG#){KkH`4Z5bp zIve0VC?2oF)L4zM-obpxv!r$Ys2#Oh=DPqWo!I`ih> zc(`7FZmjbI*Hg@sk+8N4Vx1caIZ0WFIU;vkY`bIDC9%#=lv@Kgkw11ttUl-zT#5Z> zJ7~v3gLjdTp$J;;GCR%mCMmZH(1F$$GH`*GahxJIu8X-f7C2Z5PT)xf?Jw z*JtlDE7$_XPy7vw!BYEe4;TPfQ2x?>>|fS$z+v0{c0h{AH z@~jHO8a zYpkA#%=v>o05kmyj*pPY@u%Im^||eS*I*nsruo|(Og?x7`6QI>c<$OBWovyiJQl#w2TvNTox zv*>jQlqZ>4Fb#YN#ihQ-n{Z;5pTO~OE0kchSOUMA-*_l~;4l*Eqkj->;$7F*tw%*#mwx%Ox-qvJ>>{Luh6wGj<<} zR_6-&HM;E!$Fr1A;ePT5CGo3AEtu4=G2d@c9M-V+{kj*VOlI63AtBpmjpW9Aa5?hO z6jnjnlr{rDz$xVCO6Au>={>MF@{rViJu`j+=OYhK<5w4+Jgr~9S9BZPL;j&mmft_K zUzawR#qXq{!;v{8)>2?wHou17O|tu)q$p1?hu=OG`+;9~t@e4XqE~Po<+tXu4mbVK zujctD+)4iC{C<6(pj`p$SoI<{^(3g_*Qe-7P-gNLl$ja%v0YD9 z)0TK8>?iwws#<=HOr}FwTUTwr1_(9bNaS#RzaAjYhO(a*Y~a^-IBvlS$n_ig)zRF5 zvWqtQ#AY(w$gk1vY4|MzDbd)khuE&>(lCeFa3AeErCXR1zJlVp`nB}yTe3-7`PELp zgJM?gTl@8B=2y4|d08931}atBT0{5X8S+1AXI7G-y_a5hAiFDI&u$2 zERROGFLQ4&~sh+jjl6L20KZ8FpvdOF;% z(ee6-Ut_#BBmDZUmx)K3@}?c**Jr%~vx-*RcC&a+yJtZ8?01goOc~5L+t&8pJk#z4@isHL=bIHBhVpF~9T%9cj9z3*ns2dR zp9RlBIjY&e+y>k)vfAu8-x?dyGI)@VG+OI-Zc#Al7q-^VH~94%jX&RL@~2yEO;c?1 zYq0qPlz?U8cE9@i|Dfp7pdD6U@}1V<%kVh)opxD%Do&3B~2MKH%4=Im1Eo3qQe$E&vR!1q9oU)ET zK5ZRt^OY%cnlskngYc*KP|Gr3+Zv}k=hw(5`FF+@a2yTgxnwu)gc67}xNPM^SN!_$ z>iN;H;q*Z$U$0;Dn&0^uR`|)Ue}4PHUF(?Zq3O-(&@H~9Zjcp(M zHNJ23o4M39zx(y`{}gWH`zOrp{HC#u5EU%5{;2h*Z|CpBh|20>-6iR-vH#VZPP#o0gx8@go z@5}-1hw_QauK)S<1B@Ns3#f87a0Q&&EYVq4AfmfjT2DYXkK0g`Wv(}%o-MsEpfTG4 zxQYDku>oC@RDLVB9Bv{1gFrwX&UGkuT`w3=*Zc|&M;;jpsOxsZ0p~iq-bOeVPDmOF zI4ek`OCE5h!7oz=)coqCu?qZY1M1o4LGkr<(gk#ie}uh|7o-oUL-Aw?XuQxKif=y! z_rj7H1L{eiLkYP?X0ib#$!zzZh>(y_t5BAJo=)$BJCNVc8qm|PGjIlSg=_(R#=8uc zA@|8{BTteep!@rAC`&gqr!i};fck~=PWrLpW@cQ=n}T1=}X#um!T}} zoR0#ktm#Sx?EU{oBrbDdSm}Un3U$j^kKaHU(d@FerlraSG*r6>my_SBd_cqR1Qi0h zt#*LR$j@HUM)nn)hCH&8&0wgq4P-eK|52xk%pCR?sLBY)I0f6nh1CLjknk3Mf?T_L zKpz&@z^lk_;2C(OMnEH-r5{^^~U`4lplaTQEkM36CpS=SbT(sS+dZ;fO^U!Q1*^KgKVbr z495P&#m*RP7m^RLg5SYaE7h1ux(l zxM*fT9~>&oHQneBlTq$lm0Rgq6+VK}frk46P7ZV>d%{lEUjfIfJ3tkuyBR9N|bfTkL-~iH5NH&jEdUT?U&Yr+Z{GF%&LGj(Z%? zm~JN&4_5yd>u~sqt?dlBfczA{2ArC3JM01Z!EfgU=m}+;?(n5=Yp9l0nvLBQOiNo-Fu7CD-KuakmCcTo3+cqk1v@z{NQ$D6*NFv%MUs-0dWBL@YF z`+{~<0^1{Bhw@}oHa6(IWQ6~~wI{;!Y_UtBk>UAPX* zAcxZh)sE}JWymL?m|e&8LABraG6dBX*M_14BVh-aA)|GC94vzT2$qHEGX-_GYz_M$ zpM^)n{>x^zkvLiGhH9`P1xCQC@FbK2$v{?{x|UF8Vgf7*ec5aYE5K!muqK$1{3IXP z{e|HkgR;t|B&+X_dkCY3_4#YB+@Awbkf0=C4#!0e)dt&o{me|4Ezmu zQ_;NALH!l1nq|o6{;TDK`dl!$a?r`c^`upT>Uhe-PRjI9yWVD%ytrONZMEnz3fnmW(mCfK89P@fZ0*9tnV zk+;I>FkCyRd(86M*uOMTv`$bR$s{-*IZ!vKZ#1lhqOEo68HYeI$5rqsY*|03fkyfU zrfkRI=j5ksXiK&WN`#d76B}_KxE*;pl%t#mjj(@IfDd^DHJ}&)D$*mEC*w{+7woWa(x*T&v^~j zfSztPfQC@6FNEUAE<@4!OxJii@nQ2g_JXKE{K|3f@wGR%2uc2u7 zr@hS6{RT%O7wl~v+yy^FehCZ1{-2sIZGdHw|AggX!9FGrfD35f*+W9Kv~FJ;(P1b` z@*8Xf%k>NDGvET)7CBe{pgt8(g|a7<9$-r|5UxYM2}i^61A`i-`v%#PZHAf2KM%!9 z{(=#i`sstsC4LR1K&c^S&u!phs6oH#V7q1rwuO4e&w(1}aLTd7b!>2Q67@$?w% z9(l)vpg#3hof6bv*SQAMQ~rk;wk^M$gZ*!zqJ4AmfUwKFpgvp{iVy1FdgS;#s3#f8 zmYN*1(yZnA8uMuF)&}+KG_rpYbk1`BQ}`o1ye{b6g7eo0^~h$>26MrMHU>4`_!W-f zdbds3|808ubdz=9;$q~@{=F6TlP zPe@043NA!$?G5Rf?!WL0N98;Uu1eLtiw z_b?PWNit-y|4t;Pz=Kfixmxm&y3|py67oV=9NvcFT2rM6=_b`1RzcnaWxM_lO3+y( zWk}6+JX|B!;X`JkWvYSYUQOt=MpgnSv6g5m5T{eAG-P&(c&dnlr=aRV9N z#8e1nN?+z?t#A~p@`RjRG*qlW$f=u<8w!VCiu^5=BOwiq22=^@gF=a_Ayuw7umBD9sut3{VMWc5 zBautqS|MiyJPbvN%G3_&o^TpoM6OULq~`d3-H_87`975UD%CUHxdQtl53g?>`ZGd8 zeDUZ8A@zXi8-~=re}VF&RI5L+DIM6<%3X#J$nV`Oqz96pv{HB)!!v9tHbU99KbjdLqGCvgNz5gq?JOJFE0{0=4-~UQ>WatAv5LFQ4>{K< zcNa=LaCkvTgViDnZSBv)ugG8ixjCAyi$c1&y@N8(iZl13B4wDn^3~8V;8Lr^^ zD|i%szRQ-V`EIM{4U~7ymhTB^n7!}-jtIH(!H~Z9``eL_ex+;QgSp82P%8N5y7j!v4J-KmO`GENP#j0KpF(=L6uM<=egkeJ zfAwwC_C|MXM#6V7NAkD9d2r-CV~YE>MZ>;#5?IFI*9aGx)u*Qya!63hSv>bJ!Mn zCTs_vN9D$e!+LOW0G1^`RZQ5KA@<*lgzQqkT81;*71p)S;ts3pT?dD9y|5>&AGO#9 z#f9eehV{T=1?-Ld9Ln=T2VYnNl7moU!lbcb{kEICP-d=1D69_86%M1!V*eyIap8lw zum%u6!lTHGl30Z;l7{tgX(t>_e&_eY>Y#pw5^lFl7FG}FP9E0H=n9nl)+xgJS#obm z8$eemO8XE>J$q7xotyIfUov%Azx^s@dSk-OVcoT!WV4YB&K`D7Q|=-ZKd|6~ux{7& za)+IItj~aRKMZTA<>a>+>8@IRqziKSK6zXP3<$d5_wbcu$pDv5;Da+`@w5; zv{FgyP=+#L^|%|$gzfXc<;#Yhk8rtv!#c1)`LMo&F}eaBLq1qBtRFN;S=p}FsS?)r zc$ZhTk^fqakS6tWQHC1K81fV-XG0A>4m%^@UvLZTSJMWTrB)=Y_J6ikSnYIb z?XYgcE$Y}va?}lL!0;^;<(XM8tncO2tWSfCs7a%+bDR7ho7#-+Z)P*nwt3hNpW!{q zZEX>DDiE;DX=A!`wOv>vpz4wKmN5&ar(mKEVGX6SbPlUao&=}SK)x=vhKHe;U5&0` zHQS${Y&z|`*#Po%N9(EQEsP`oo8DnPfcOdaKyL7z7#HfPV7N4-Gr9@FtWF`~u~~<1HKo>kSL@goM^y zAyJi#e_<(D@w2c#`HX@xwco=0aPDw(IHzHKd-VU% zLwQbc#>&VzYJvG+YbX)b4A>qf9B0=%!ALbSrjn2u_yOjG8OB=!)nNwYUa$_F0i}UE zP#jU}31R*1h|915^1o1KB=1CPxIHX{JO_%4J_AR>5|d0R4^G1V2ar)JSVO|hBy3Q7mwpK30;BP@-abDE8$Gn|1u4Yq{or-z*n;c%D+Zh;c6e+!4f1~bBX z6mxL~YbKAyNoU#&w1(A@*THV^IZO^)&$6`~1Z70K;0pK)Yyzjw4(nmm&u}+#vN_i9 zS(skR!OYM**Yfj1S>hTI60&{Hhtkj^D9Yi?3+t&@Iw;S8tzibZ29|`UVFmbJyiI)- zC~G|g$}{A8C=K6(8Q^>Kjai`RS|upT8Cga`*8C=vsd6od7KFK^V3fU~DAngsI{Ial zKSH_h85A=OEVTME!EDGM!@RIB>;hLnS@PJ=!xGZ*`|l*A!gsJDOt#2I-V7!~UJUcV zov;kN3uWyyEw&N2fnx77p^RuLJO*z>^Or8Mson%d+5d^k6_?7)V}CPA)aAk*D0W_O znT@CelrPz5OUO@oc#QJ5X3SZQWm7V7tZ z3?v~-unfvnek~W^&rr-Jw90f~B$TN<4G+T?P}X?YYU35y8u@Sd8T@38b@(!rnS2GM zd~j`8-=N3`Bhp}95@KFG;X!x=N<+iG2^gI$Yv3Z}eJ~z=vfixdcQ_xp z#0DG4B`8b#6pHJ0Z#20DoQ>RnBla&-M>P0yW7C~MEMXPT@sW91Q3s~~P z#>kUlTX-MVgjKefF3p9Nk*`6iH{({@J8Hms$Ukqz{=XzqVw-J`Z{X$kIIG!iBQCSs z*cwU&Bct*LC`BlOM9c$i( zz<#jEG4nf-4J1U#{)M9L-H)5L?}K8FZ(s*l?u5D4wQweK%t>=V^PxDN8&Gs9_LL1I zC+vd!4EmVSW~amY!GumHdq1q zA1KON`ig~K(_z{~oQQmHvE8(5VLd}CeLc+9$>BBZO!;4L*nJIe;=(Dv2JRC3zkVmI zXEZbKTEUF>!g{_p35uin@V-58^n$X6_n;_Sg$H3h2Urtjx`$yssGJ97k9Z4@zyd#q z^%3q*I01R@BR0E)%;;luO+NoW<4M?=2Rr=Ero&Xdc^Y<7!p_eLD#;)9()R6K|JYJZ zhl8oe`8TY80WkztLEH?d!545A9Q(#RW{S7ANi~Mu$=?nq!u0R3|0^WckyrsE|CuMu zM8LEJxgV4zNRl8=P_l%+WUufzY~xA6LVar$>dUnGiCvmE7) z(~e$%Vs$AzaS_MGT3qwkg}eSZ_0hQkar#u;4~n*a2Xn(JLA%}$_C!7mYr#CBI1ONi z!FI?e;SVrpIL`SECWwpEJ>d^{8+m&YI>-#qP8x|*-`qMyoPI=NFKoz^Z%G;FY=()` z#AzJAGhLj1)A5M(G|Y|FGRLWs?adaaPs<&$$7#4;A_w==z%95P7S0)`OYsPb-4D$b zr%JvFN+|a>LP8!S_I(hiKcihdU!3DY-c}$^-}%^AIL>)O!F9#s^o@wQCE_&T_@z{w z1}YUx$EjbK4rO1jRwhoP;#IIMa_zEl>LIto{m8y@abgtC*#Mt0_R0P$ne3mxQlsS+fKbdC0xKVfrrNBg*jyn)=3n5ynZZ#j+p4YyvS$>XFmz${cF zFFxe$@bM+*Ieg5u7BUyndgVH&PWn1Y_xPzC=Q3U6Z+7IBO@AoI&5ezsjaOh&`bN`I zVk;GTAGye@P8C^c zw?65g7*7VSAE5jr^7*k*`S6);_~#iSA*I6`noe>VH|d))nY8gS z<;rqjTJrdwaOZr2_yK7W1acnd-Y0ZiUTMi6&2@S4hjGrt=)6s%Pc`BLVo6UUEnj$^kZVDPw1y`B&nq3(ucg}V)bl<0Wk~am(f{*W zN!??qyFA0;i$I*$(JtNdIq_A}Cdit&7&m5&|1@oa^cndkL4DPwoV;ex)!d}{*t@fW z`zFP2qgaGb%{c|h?#jQZjCKjd{?98J-JU{Mr$uK}K3cUJ`C+uoYKFkCa5?Mg($;91 z?KHcZG=Ed(-2NZ!;+X&czPzl!NdBde?=(8a&8_Lvr)2z}SB7Z%EDfZMR{Sb{aJmGk zt9hcA{)=W0h_-QrYIq;p`6AlRWX4i1It5bgg6LAnGfH3bPsiV+y2v*SaSdI~L-rf0 z*hICnDH>0a0`!VM4shD>Zw15TV{`xa<)->dbcJuYcXmdV?>N2XPwkv=bjGFd@6>sS z`}mU`eetJy`rZ3kt(y^NceGM|RKQtJBL%2zNVITgWO>!+rcBIvIy&_+4WEFq|1({j z`8q$+xV(5DS6{~r`u|n#O&+al9_5zN#%Su8B0c3BXY^GfK0yZDRA$<~#lIh^Ge@*8 zem~gZ?@*ip(K$~S9q{kbx#qoSeH~^ko-^QX{F4`d(&4-!uSc|rvE0Y+R{!7EYEqM^ z<28K>S$k(WEH7tx}f=+9WH+7i|A+|2V1%2bYC zuS>OZ68M;Ac=O*W9<8eZP4E#{eI0@48OC9{R*dfd8O`Tne2FRvyzynLBuEs$I3u4j z+!7s?+?RxE`6&l|&0qxl9-RISfMkrJTTSS~-_h&E$SXzljmXOx?P?3UT8D1&j=D1i z${!}li*Ml3*EHBWnjT6$wfyV~N4a#G3i3wBx0>`T`dcbma4iLw#MjM~AbBKTbeVf` znV$=C9!1*?M5iDt`JnqQc3GVqU&Q9CDCz9h6+ zJ6bejwBH-JoxeKffSw3}GV=O}d-%N$XFJ!9F&5s%&_~iS^zDCNIS`K1Pu^tI7e6}a zd`?{t_&3bY-+DKr;~8jNUJn@f116*&{l1L+DE?&T1erbj0kad}(z5txnVH`HQC0Ye zyCgj4+kTx)G+USM#&GxP=ym=mS6{!-y|pykJ=%(7$_Ju*)BOilME`F}t9-Y)cOF9B`5#|LhmO3@2j=+go!&mC=uAKP#WMz1Z2&XZMvFC%e-PROeVW$G~O z6qKnFy*D9wS?NF~=Kns|>QV1C8kW~ed|`t;Zil~ zlxLo<+{2fGIVq^W2G>V3_*UE&qR&3k*_nWD$o;vtnl`s_-)GUjcZMUQbylRDyq7vG zI;k7E_7T?ttm#bJ7-Jui;+_2epMEu@(wOK>HllJq@Z-4Y^Hy%kPsijXUrivdaa7(u z{#n)pNop>q?i{pHguZR(-ve&jMDd37c_zjAGAm~h)ya!DxSYAsep(K5NP>6H^tCI# zZZ@W;E7kG)CQf@=e@2gfjOsy+=+w)1$%Lu$ee$pHk6-xKSBL*m<(TO3<-+1RNA2>;E~T z_0^)^T`AKgD$B)ojH3WmK8iXZ;K$?D^e`m-%LX+9JColILCM_>M*Vxi|O&`l}b1Rmk3JrIb zIiTQBD(lP5RaugvP+kpC9eHh}lD*{fYdd`ZljSuc?*a96q>hx7PsiGfjIW!6WgJV9 zRa}x+SuT%ZT-`~}q8YvdL0@H}3Max9=AbFv;L}Da;&QO8=!%WD|_>M<2}qC;#D zpC@O6&G5Zq&T+c5F}gJWUsvY=*W()Y@#jfJ2niucR!B%zvO)+UBYTuR$~g8) zRyJ9Wy*b9QM>g4e90v!-$UOGu7>D3fEkwzdF zVSPdA=Vfh&uN`q!pd=!XY+cT1YQ+~dU464qaYMRc!k`9jZ>Um)x5OvQR_zFvxf%aj zmkBX_tVcyn&(Pv{&r$w=5uGd~o=V-ZL^alg6(NujoipSjwSe>x=*&7j1b;GotgvFH zYd{v@x+tXFcF=&Z^?Indtj$w;!SXaLI-Gjq=W+ogaW3 zcRd(|nET+f0KMG$Byt?x0Bxo0n_-jfW++Tk{Wz(D)PKXeG`8mSrz30mi2h|tuS&4w zzl4|mT!-CHZd$MiJESg}6*7RddQMn@VU9|zfFCG?7+s{y@m z*404ih_M~M+{$9CAX7DHeL;U-{K#lA+vG5G*E4uivGHEpAvbw(cWSaUAa*}EtK^wa z<7j6WO&*KGBf$MgEbXu(w&IJM zu5B}u`4JvJ0e4b%a-C8Q_SJ|!07_n1?bW`F2W2#5co5`&Ql4x-X>wJ3Gwb=`hpv@n z`f?6$U@7t#xM!ruprKK~av8^e@+a#|R*1vE| zN!yjEb2orRmco5Afkn`#A#oyL|6h`@9b{AkxEFIDJyfav)Mhus?$>3*=t1en{LvJqml!VOHNte?4qW*=M-TjpQfOLYd5DYg znAs-1(T~QzHM;yX^okmIi9@pRG(sysxr6ah{Z!9mN6R=RXB3T@$&@76ZlFbDU3b@`vw{$Qjc{U`o&rtueFwYBjmd? zCo!ORw2O{bXFt=Y?H_E{!l42tC-Sdny@b3XHEAf%^*6XK+sI7r#$b!A(u3tj43FVV zmX^#JsV#{Zn^d-5`k8K>6AAyu5E%}{Cd#i*+ULwKpvQ~xc!wOnSFmo0Un$a0CEee^ zColpvR^n&j`&=uK{a`To`?m4a>Ry^}CF#gsmK5&F^e&J+wA0P#YIj^K0$;(}T3Y_U zPu4)pcR=b5Y7p)x$>t8~d!XLpS^!%)W;Y-Qz$TYAdY~R*VKEF_62%wBuLQ9x@Hx#q z4~#%kCStRRA3pmyILqbXIU_M}MRc+}AZQi|90|w_sX+jgW&VmiEn|<>*WYw=@`dMY z0_Ixr{(Oc131yok5xrmOO(u0DX-YE>LiZesFVt~9)aL^;O}i9ArtUQMclOa>6i^JF z@tQ0qdkcN6mRty2t_d_A@uu?RtG;UEPz{ILslGD)fO>Ukp8;ItdMctPNtPD-I?As~ zKe*-D;Kh$}X_PS$zaVftG%g0epW34BB<888MqP9w7agqiWz6(t>kzk%IQavQNJAyM zoOuF;E+DQ1{N!`>Ea-ZJz0G=BhK~Tbu-+&}>RSrA4ETXS#-%xZXq67ML#TdYZ;XCj+GX6NLRHO&dj>^7pw-_)etu zWzeoqOgEt4T1n;jnwSY3m;EM7Io5Kq+7WHjUuaETJHWI)70sk=V}Y1W$^=G5)(g;! zaLb8Nm(=a4Vy|NQfw>01CmbHRKu+Y4&Mf)sISCx$;|||qXr5_nI4Y%Xhm&Sl55IjX4 zh7mZ;a;dFUDMvkhNb8O^+gvDVsI!SwFTb5D#VjFoimA?67n*QB#2$$AxC6-EAsxeGd* z^oLC(!zP`{HiXzp_?1Fg6;^4$31Xem3JNgY%neq{0KS&nXdB0YHi5MTioJ4OO-2#k z#+oc4%vY!}6Ug!y1`j$m1Jqm;@PWM$Sc~mCx{lf#2|NdjI7TG?8JSz4TSv?wc~9;& zKyQ<%lhXeQi9c~@g0o0R=6GFqhu8`djiA{g5hN0MhVBJpffZblk8BGA;R%mZsM-Nv z0O)oK(N(|FLhy;jR+u5;37@o#u26A+qg_w_F@_;LH7Fz?-$B|mvsH`0{xTC=654~1e z>3#Nncvu?)Qi*Juh>Tuf7L;;=H z=dqT9)cKg!RRZ^BkZFwj8_JQJ3`BhC=>}@G3D2N1?$M9UKy=bHHk-`6TFR&im8PnE zOxll@R~3Fy<7pFy6R;H^znC;!AY@bmt}U*oaO)yn)KsDPiWGpY$R^$IW<8YD1@X-X zH80}Eqice$5IxO}J~tEwNneq0>=RRHTHC9bL4`Kq$cwspwG`jb7$Ro@mkaDfa+2_| zm8&X0fu^HwiMv1Qg~AO9C+AVRD)I%}KI#z3M;@DuN56}l`{A&R*?}~E*m@{yMX&no9j!{zu?1*&x}L()xximV@m$y;O;O!tj_JUXh1VN6IWk-#is@S=cO`)8y$_$jBNPG&1WJ*VgRVfB9w0m zJk{1nuL)l1yq17*0E@K4=Qlk>t|ZyWeh&J|bf_sfo^)q7;CE^J0sQi?ZVS#=O(qx? zzU3*Z4!DJxTRQNMO)ArxG@5{?qZlT($r!(}Zl^64U)~R33{z6M=-7ASL_R?1oZ{`a zCI*=WyfVS5I^156?|>dvyo~%DHGjhTS?7Z|3;#y96?1i{--W?QMqV;BChJA!P;EzL z^!?f21x_Rr5T)>02#X-?du^@YC|Lfa&#jEw6H}kGJ;<|1Te1P)AC8=b2S_l@mV|(Z zjB@~I1C;x;jce?mQ%7F{%CPPu?O-qRD|=p@m@FenFc<$uN@gRrjS%J;aYkAam&5i9 z&kp$CV_y~G|L_!JqZ*ZYS1J(63BY`OzS60Nns^TYB8$;)X1J1U zH-I--4+7%}@$b-yTLRdHv58D!PDI%=WovYdf$dKe)k!M1E!t!OAXQ1+oP@iu_X6xD zKriUREB5}(8}N@OU5BJ?icSDdrT@MTd}16(w*1P`$iYw`)^ zB6>9%j3`u-=s_$c7F4%=;It#JO?m^viyMtiK#I)8uN><#^q2dkj4A93fgy66{cOuG z*mQI7Vwu(o4dxfh7_8Y9aU+>tv3CLCK9O#UD$zTsg2(n5#}!RkMS7> zRsrDuf~klDIL>stBDxjmCcto96 zQ^_rIp1frhb2jTle6qr+1ODOooI`g29b%oV&F6K;0bQ@X60Q755vc|7NfhfrFfYwa zmMi$>252e(jZ##`U>fVKUt4mCpEpNtA7cu>0VKQ$IT25qv4z;|MAi^|j%0E%<7a~VXa~+>uR_pvY%lN$v=-MfJ)0d+?ghy|2;S|0 z`>gqQGe1zf@DbsWn#q!lT9*UuMZ+tnG$;Ay{S(;xSS}%azc48A5$30~!WnqEaP
#ao^9%A%*N<%Z4@q>$x|Q9<#5=KeLemwz!b?y%t&0jk}Ct{MzNlW?+eY-OF4+| zWo#nuVALURY6*eQ1>vmc`!x>VIPkVP@Z&C&O~n7}Wl?k&0puxQh64oWQQ%AV3sa${ zfrw3}l3*-}b1F_WYmu51!UOsY=?{-U|4+(6{IN77i*=-~nK$M>InHZrCQh9&>|4Qf zXC4ApZst6I1QC;qyxo~sP|$K_U;O%F|=<9GJc*mNS^m3fcm_ocSg*e;VZ zf^#a$-iS071NIO{9)oUVfyi5^_9ao*RE`ykw_v+jiSNYp#kBkICWgH}fNNd(SE!JoO zOcJ^oWDHAnD8%O-EDyutA{9Nr=FPell}&_EVRZixR{&P$8KJaK?gkb)A+NLkfigD< zY%+)SBrVro%YQ-A+<=aP#NVt%dI4OIeMu7TN4EgG$Z&K$NdCjRU7zohue5A2A^k(`f!OMh@&ORFm80ldLCGEcbb3)7|8&f$WiQ>ouXqz#S0iU%Fj}VPPYMmR zkv{?KM4*E;C)D&V`(D+8(;icE%E(Iz8|aTnR!VvR);IFaWcbpOP1f5`{>ScvOB>v? zXqUD^Z8pf$EsqBB0S`=Wll>4b%|KiT`<%FzLcbN=Vr}*Z!Uh7Bl&boiTJWlwb5`_~wTtKQ zbr)y#mE~8c{DM6Y-}+WWBhxi1k<2SG)nin_Bv<|))>Azjwz`QiTPx zV4Aa(b#v?y#B~9~10N?%`JBoIvF=I(r$e>3l|;&z(?AwO{Tpdc!TbejBMFTpMMJ`G zY5G%yUBa)C9+z6AiN#N3DHyFt-vHmMP_aozd~8w<+j(LWp%DeWqF@c;O+CManJ%>s zE2ub^;%K~p-*Y*7fb}Fmq!;sM5;XxRAG63zk{$!hoYL?(d|qy_b&(7LQgQ{)HDv6vVS@Fqa+E%uqjmj>?^_Cj#U&VDp=XSjVP$4KlEzsNxp+t@1Xq?$u*t${}ms8>CzyZvKYb5v;#I>dw_me=bM>s*$04g z370jBlabuNTVI-)-ex(=E1W;RG_iuhO;?9Wko?7J8O~{cj2KV+pK=(>0NtB-k&%pG z+-&j-_0ELjHT=snSAq8<=w+dnnKXD9xp)Sz@h59Lj_popRbVet5uA0(DIS|I>tf&y zcQUN^;bwNHQULP4O~b`WT}Xls#JJ*8z`82t?F<4HS{eRFCr1^zxpU4G0M^R&nFaQXl?%pH>wI(5 z)8i^QHYv?I8=EN14Wtj2Qw!6*@@!hv3Yu*=Psf4e0*#8K^-XmYBcc0|{Xl$Y=@HL{ zZwD))1^=!1N_Y|>W3>b8$W)*GZCE#x{OiOYYD%l|4jj{K$vH4qryCjIDR-(lDxf540imq;wI$Ip zr{v3yM z8T>yfmBnB!BxMx)IN}yDm&7L@vHno_$-bxnm11)hhZqfv1Vki|{arwo0$$R3+mc`O zexxdADE)~cw@o(TK2>`zy5Hct7N{nS5v)B(v!8L3RC#F6M||zj2cWx1itlh+&U~Ge z;rNtfeU=vg3KmP_x*gwo?htrW`Msf0k0J04QiUK>5Pci$)lz-4ZvwzYhz$WCBcS7y z@FjfPVta~zG$TJ5UPERM4gDJeGr)6UJ&L&E*cP(pM>l5yhBwI@lsH~hz~fZYhDt=7 znTwEg5J{c`o{jZR{92Qs1hy^sb^!D}zT?4?`{KjEO=Cs1=1P(r@SljPt~Iqa-|k;f zUSCQT*}~|F`4PPmSwjg!wH>m*$Or=Y3HAfnPEm3#vWwJ(K^68}*|#F51k7f@NJMUc zZ;9KBIX$_|^ z@_*A-Zq*~s!^w=BtjCce3pjAapO86*&wJLq?dCtJh5jSt9;0cYNhU#L z9%~nThpO&?M!4cDQdQ2n%2f20qy|amsbLDi1E_2y!QPm746E@KGV;{Qc7W}q!jjCt zLc#;R$aHW-I%xL{eAY2c$aMuzMDF|V#C`^N--!1O17I(UmwL{Pg@njToSx(S2XhaA zyRfck#Yb?;>=bUq3+2|D>p4vs1K;ZchpmzrRca9`@|?H^_)ll#(loW0|5W~g#4nI0 zg4IZ4mJxRy3L=-8$JiT|cckeN;|Awt1m=WWagwDY_=+~bqLxvqj!sViFQHqG-vGv1 zfKF&b_JAYe4e7-sZ^7Jx*gRUmZgkaI=Z4Tm$kt6Eo^syQrjmUGTvxX8YOYg|>W^*> z^LPlAgP6!rO_;LdvnZ0Z25dP#;i<^JXC0xwMHDv*5;?)_MTJZ>r6HnlIpzXqcm&D#UiJpz`(DGmO) z;8_PgJ(!nsmWsS(?GKHboOL3-nG4dR>R@M=O9Y#sj0Z^M0HEO4lo&=yYpw%>q7$>lPs)?Sas`w!lexZFLC#;~(97T8d)zX4Dk@KeV5SMSjUq{!C z5P$r>GQ2cRacm;hu-7NWDtcg(J8(^-d>2CFAL0kA|8R0`WAw*4(21ic(nX7UfYWw3 ziVS4!s%v-VcMv;DvW5ygfP`~cAE*9K_)i3MD}E@z6de6;B2W9yWs;+eX7k*(iV_&20+A<*#u#yR(n(lPKHE!)*TsTuq}mrG;u4b zd>BW1G`ddKfiC=9_W`!69`w1my@g*rTrL3}tj*7eeUu)z8_aQ}bdnQ;^+MG@0jDV` zhA`ZS?|@HZeBKhfo>DH5vJbwI=!QbQ1|yGrd~h5?Z-&SS>Rv@tL?T!Z1}FnTe?ZJ8 zzf)5sl1xRBhj}!%U94Y|=m6kPAUzQ>m!z{u2Kwo!BzLgykF7br_vwYb+*Q@rO6qF5 zRxSZnZ-_eUfog$WWH<9;;30w*0#Bxj{xNtQ##I54y->t!g>@YI?++ zVIK(Nmt-o#m=59`GUtb7Vf=ofg2U)V_Ol;BkB;=2-djTmQ?MNjPasdznIGg;@b zr=^)mwqBFxgnD)Y9xG4?ptk_qPf$COjMFk_p*zC3i9LWs&H#RAWMN$ZtV7^T#~!SQ zqLI!*v^(}X#1$ilk9;Spgz^AMMG7)6*JGN2q^C5YI{_k**eXzUODgJ4k}Gt`hmP1} z3rR!Jm*HHn$w+)gu+Oa+ZAd(b(MlX7`CJmUBJp_w2W#b@*zadO2JmIz$=Q*r%a2^Ktvbx{OQAbkvtX{0%lm=uijd^tjBVfV#N7V*N~u z`wN>r{+&5oE~crXHD>pcPi1Hq`S8UO}7{F4UEc z+Iy2}2$^2ue+<9U_-EI%D3r3Cz^e(_QTT2ltv_sjXt_oC27I;`R~Yn^WCWjvVkd&< zF#557#(piPvjhzVU>0kUNf5aKNI{aX0{kNcM9vUX8G?tg?Zzjy)CQ{$`1Yu5Et0*&F^GA$ zb~v8BJ>YIiVhj7NnqW7&NvtQ6bTBZ&cru6l!|F}Q?Ylze+;@%Qk`eCWbdfd5}+Xx>clmbElBbceywQ7cIG6E z6VOd&FRxD*DT_W63A=I(`!GbxSY{vowwGQxiYh!+JEpNdr03OG=Kkt;RD9ss0*-fC zC$WAFe3){o!F&q;RoH7&m&g-%+tHIhtXNV8%*16Tq0yB0o^cZwSD5y|?K^1-CI|69 zV@h6%Uv=gU_*vHZK0I<~87^)>)IlAn9s7e!2iaG^eK&=Q{Em+oEZl(|NVrXg&`puW zmS11K&@#{`ktAS;L-H?yQrMyF3$U+GK|6uU56h?c&H=KC_OU;@_1OPmoYK^SSC4&u z8q*N`jl_y9BXtvPWGuch@`ZK_<8Zi&G$r9%J!p9dZcmbe01boCV(ixxXdShRRA*lu zpS-M3P-8{(eThpgdDyfD{}z5ZDCQM@yR^VE>FV*@4vK}a>8m8NvKI+vbRbCNGoY6N zKL-08_y#JGY}g+FI-0T5n%a;5Ru5q*(p(!Gg}Wo6cQ`gfSYIS`DljLhb%h>_0QOH= zCu(!DQ?rOX=1*h`zFla#P1<5#r~5Y8N<)1)@uTHeB9Xl$8Lz=}0kwx`d#&#!dPmkn z6u<>iA};70Y5o{Zo{zZi=qG7G$xiyuQfzg|;R#k4g`Fn08h!)hlbFvWYs2OP%tRUi znv;NebRh#QgK_Rm(p9N|x3iDdrVhn#5u**@EAd?=U4yJQu}4T&mAIj-MY3YQ%V=i9 zlKMkQmJ1S90F+`Db40fS;(*g^=KR>dK`tJU?D$+D*)PnyAUXyAN$jh0_`d3yfXcY7 z>m|fCBcVt?O~XC&TXUG2}U zuL+ozg6+Y$56^0v=N-Jf*eB=_`;8C_olVjKI~w>Y_=psShsZJfed)tl#(b;o0Mjj` z1a3ztK_mob{g@-s9U|l)>Fz135(>4KG$*m;074``KG|qnFYCYn{u|(I-3Ha8uAb}O zTAM!}jvz#XR?u=8$T!*(fE*!FR$3#n9nP+}oYsWz;p)J?no$1I>~#YiLt%+~R<-)AMB*aED2G1RCuLjez+&Y*N5; z!W$CvgY{kDhH)gjYbzH4JBZjV%%_NdjgQDddg-CqdGPfoCLb6GXvjyV5?06{(=()P ziY8fI7p!ymJA##+`HHq7mi0PXFjV@CZZh0Os=@UzL!@=w)(latJ VGBTVQnHZTFSrWD_bLq1De*l+;I#K`t delta 93724 zcmXWkb$}IB8^`gvyZ2ri0V&C)yO&=r15BFjN%MDb<_#^VQ!p= zI?*mniWg8b@)xGUq!Y}1sDV_+Pp|`O35H@$+=GgxKX5qapBQkR9u&4r3^-LVYLa!N zE9ykEF)nUG&B$KVQvHT;@CIhW2bc&GP7XL>OpoetR=-{m)!`cG4GeYuiIWK`6_(SW zk?%*X={<~(&rv6Irr5}1;m1_dpr$%MYGhS$7WTz2Fz(cVGaX0ZKukU@;B>*MSRY@Z zg1ox>wXMxU{G5h^I0y586L6B?aqNj#{CbV)0Vfyr)~G3-fQstn7=?QI+G5S3;hEwLrbg$mXtsH_@-`IP^wC@2Uo`TmVr zsmEO!aMEJ|RGQU8jo>rXj_6_sJc8vhC);0Z?19mE3U$H2avN9{j77Z!>U!nT)ks=U z(24t^(rAodpN&eRHK?UI=D+>`l@)KX7)E?&CoYMai3+F@HbVv77}WU}U;^BPO5X$D zk^gEqM#D#V!GFVDRL@_aI+SvS9hd|4zM`lZse)Rv_NWVefeCSn-@X8~v|CUe_z88r zi>UqNj}@-* zhG9a~(oIHX**TYjHk{X}DGsf+5obfS7sJk25ewj2)Ruh}6^w6C?@PGG29nA*Gp?XL zFKWilqelJ*YDS;qb994iZRh(J6$=^HnI%vou8#`Rc9<7$qNX&_dK+m*R7c98-q#3q zf%B-~y^C6+@CF-sYScc_9y!13Ot6CUt?w$-2C@@%o4kP~G0{d#!Ls(_=ABS#Amnj!ymyckno8{2R5Q z?A>iAxQUATm#Dj7qCFOL$x%12qSy-Cp+0`Tp2%kG0pf_9W>3j~7}|sET>^ z(L+Ww054IWxZh6P@j$@oNPP-wDxaffAapR`w7{aMY?+RV?j5)q-(enH`Mq`EJZdH$ zqhcW92l78mA?FYF=u`lssrSd7xCYB%`ycJ5u^bCgPkkuhl*Kw&1gBwEEd?re9{*$; zP>RELyRC>_XrGO`dw#(DnCpmZ7jAhZ;MAaDG3LaFsAx}d)b4tfQBge_wFI+JYr7ds z;W3xqE#hI&5K+U7iIGgbk$RBut|X?x1jv^VNJ(@^c-VnKA*P|%cK#fq5tw7t+6m0sgf z=``DSC29maQCV{mH6zzh(ft~uFyR^7sPdueHBra)KxNr*^zwfZg|#$nz#iEAe-<>y zur~F7P|;lJXX|-g-*%{-uMa9qhM{J1IckgEfEw{nsP~;lWzA(&N3UaI<^Kx`ir(-q z0cQ*5z*%?&^#IcMtUZE#^lQMmPJI~W$JXa;hn$MK@IusuR{8a9sBAdk*F)!RNk2kH z?qtAt%K!ZS3o*X6ecPhm*ay|);i$cT7HTA0QER^&6)R^^OLYgeBri~F{m})2n(T0k=P-AjD;oc+Z2{ZP3qfvLU#+Vxi;|N@d+In+73OMtzD{3DIJ+@fLh0Ul} zLq+>C9EOij1NrQUf|mRnML|>aH7bbKV`e;w+8Ljsw%W{3ZR*qiZ6nKy>Udey@y$>t z?vL4VGU{Hk1DD}V)C`Y)W&@jyah3lYDQHdh;0BEU+=65;Dvys~CA^6xFxv}zy*(;s zdSH2+fy)1jsE*u2jrapb;jowXd0`PMs3UoLar070MnO|o5f!!FP%|+U^$BMlDm}NO zvSSY_Xpf*~;2bLdAK^26gMX?1%9iNzzqS-9Ui-m^8rY%NF!0t!@&XG| zFZ!RwLN{zheK@wm>)0I2y|a(o^KljRr0*@b_G5MG2|fgzao7|Ue+06ya@HgRv;}i8vDv;ZkgtIKtVA|6wlNl*Ep^g37Xl zA4fQ;l>ZqhXbNLc7p{z&k=j@po1yY~F{Z~|sP|n$o#+N?tA37}iHM|DPlDP}GoWUs zAgbe)u`muqS5d!#LUw$BTHBA4MR?!!q(Lo73sid_)J``9H8ZnOQU4ukDb}C{vJVyY zM^GJoghlWrs-wA+TZc*}k8r&c*P%fhPE*uK2cUXB1#{ve%#SCqEWSleX-tX;?=xao z)J8N1HNwqU2ydf;FGb1-rxtcWU1vLHz+Y36|BB+5H0Vj?lTWP2=~2;~4Ha~iQF&V* z)xl<{;OgzyC!#vA3^grJB@^t9${u_4tZ#asY zfh(wy{E6!58`Oo8rm+rWM8!ryzg`zDdbE!9uxJ^x>&ps9W0HIP2( zY|4_NPLKsP)rC<#uZFrn3)IwhLB+~I)Dp}_y>A0*ioZv7^gL={w@}CZjmeb%5$SE@ zDN!dbj5)BJ-`*Y7k#YX(bFe=3<^Joha5?p)QFfu-s0$rIb?iLqyf0AaaWdG_BtkbE z^@0>KV{_D0x~P$?@!NkujpQyW`ro3a^y7>X-g83+)CH?xBW#SCv2|DozsDl@0yWdQ zGTBB}IurS?HEvCVPBrSTjl(f$A90@mZKScn(e zpmxORsHt0kTB3Eh2=`zcY+lfAHhWOF(}$?LVa7tX#@SFaP!N@NrLh9mM%{D1LGR~( zJ1A)CANZz>wl%7ZQM9*39WWeqlll$|;99JNS5a%4sj$ULDb&miLEY`vV0k=-T8el@ zY(VMI)yQ&F(3F+%U#N+?Z#PG+ReQg^J8DFOP(eBxb=*SK+Hb;)0qzx;3_ldLv`tn# z!Wqiz-{MqEQ6j==iz`cz|6M7>E@^4h8x@QLQPDjKmA6Y!OR)=-*P zCn}3dqXyOx^&rw7m8RoSOFIqK;khy7zbr!?A5?K1bj!)P|R=3>zF4b17);`=a*zC8%gViQZma)@C3P zY9!fE9j=W^yAD_q7oe8vGAf&Hp)U9wHKSR}S$hdoR@6Yvpxcy!*02LsWzG7dMtY#U zrQs#tSE#8?ULnH!fnsjdh=){+@P6nt19hS2s3nV4$xP>47&WssQTsqsWCmTQ9|iU3 zORSFLu`-@R?d_>6TU56|b>Lf6hd285A5a~+=+~d3(l}hjVxt6V&0C^kqBH7x{V=)m ze>epN;T)WgfvOSShs%YiwSJA7TBn*F7zdS($x#&*02la#7@*JqDHm`6|B2ZGx!vB zT+x~~fGWOqQ5|W9t`6w!zpxtB(=DjrxP-a!HY!~b)v~FKK}CIK)QFp*W}+KvrbgmI zoP?UeT(vD|3!-MK3O2)bwaNcl1l?X5w57(WYbX8`buai5HL`DUJFdht*s7jwwYlqC zEEGU>r~;}(jZw#U@!LmXdg`;WBksh-n5KbipZ)eXuqlsjXeX+Q>Uj&SfbCH?r4@er zVbn-YVF>T~^@ph73OBM3CLg0Vt_rBUuaD|ze;kP8Tnfc01R7f&mqe}o7pNXj#K*W6 z71eW_*vQVHPW%_D18*=pI!$fqa-gy$8nxEdecPkbb1-TjalfXZHD7_c;3-rOAEF*S zK44BP)yz8D6^l?`iq-HkY9=x@x8N*=+8LXnmaZMH$6iIs++W<%O}R zk#9g9_#;N)&sY}!MvbIkOAE&8sE!Xn1?zm&zOWLtgYHJf!ehVw0lgV%Wdp5_-p~KL zQP2qnqS9p~YKo@&^);xD?eRV1zkbVq{Wa>uaax<{eG8*HTmu!19dI^&<+rD7!_Ca4 zAwPwD*ctQUEY#W@_WccYAAf?`FhN_}SPG+#YlB+*slL1LFX}h30iJGW8(N0;epcZL z+P_6tdE2prt?f|M2D1|@;;*P!NZHXIAaY?7>OGOZI7hH5^{ibi7<-`xFbwPBdMwNP z-lNjDOt%PU9O?cNhvBf#$p5$$-u198F?KJznUugs9Plm1=k>9lTky>29pU^*`xShM zhx^z}Z0Tz=a|N}v2K!mP2$rSZ8aLx2R8ZIJZ!t8rziVF#?WJK97b-l!M!x3@^8=RW zfQkd{p>Zs>r+x$*VU9r&e2GXHV+)Kk*q&@UVGq3zzr^Sv5#CQ&He(m+?@__q+5OT^ zGzm48x9}9^8XDm=#(yyi>kPBK{&Rds{Q}Oxa|}Qu>+zL6wx=H+p#EF=FjD2;o4P&TBjJ4Zz8PqqU6R;2M z`^WKIfceMUL#d0(ro*ThJCDke$Ee^APVjV{PblackG!ZiRI?YHHmLmVhl>8usI7Gw zYJb>-I_?1KxXZpzP{)NPTAnAzlGKY}2>ak#9Ejfc|CuM*gF*q+U9JIY197n&Zo^9W z4`#ra$+i`@Mr~Z*U{~CY+9xtjv0yEN1*s214PY}WIRA&bw*;p0y7E6Zh1ggU)$@v| z{B4B#Kv8a*ZK;(}Q&$_+kq)TiMx!n~1(mK#{rYylejFFjeg(B(4F1}JdJVeT%O6qD z4w(5Ho3ebUwX1{L%iExKvMv}8UH|oos0+{Y-H2L}L;ma6P$PYeTB4Vz0mPeb^{DCO zzt*w{4cc-mqJpIb>ZZ~UH6v3{?^}d%a6Kl*ov4l_RC}@6Y2~ z1|zB0n?d?0zZ=oe3g@7D{158F?=UAOoM{~@j_ODQ)Ks@a#XvvQar011wiFetD}A^5 z{(zc^Gng6gxD<3-j5EukvmWY1O;8tVjdk%e)Kct6P2pjT!rxFGeCxMoo$WtIpl0$5 zRE$hR&D6K3U|f#c>fIkH=)~8s2HwSOSa42+_fxBTsOX>gZG_Vle?grf=UmH+%*iJkf z`%|y7#CF2{s42{})MBD4YNYj1Gt>gh;^(L--;6c!C@O}MF4Izxf9WVFYBQlWh|;Jx zR76F4ZB&*tN1fcC!${e1{IuhF+FaOI^YZio%k_o zYJ=ZdJtJxji=o!49_sZTsGysOQMd&&;IF7Gc!}N!SJ+J^9ct|>qF%3qWw9r^wJ2<) zpu5yN9EXEf+FdMil|8j~M9t7x)D$j71?dyih5tc~Fy(493ibZ%m=7zU-q#nERWtq9 zSF9%gl_o#Xps7ED+3*}Hjs8QOIIzajFAnn1=ww2rUqRISE1^D;^+1jMYxL3)b<RHX{_BLbXwX!*MD?&gs(lP*$C;Q051?l1cdUp_*I7pvAiognY(lMZ z)eRPeEm8H}s8|_|T7sFV4sLTPC|&lVE_@nw;cJ*5AEDMf-A0S<7*woOLT$+{P$%w- z8rewSiKq)tM`goG)N%Vz?>~#Wo_mXert&#z%EOy1>f>P+>M5`pmO@SCY^;Lkuq&q7 zZ2QA#EJOVyw#9f`?0ui1F1QU9gg>FS-v1%jbDdu)s3(_D9l4Jh*?*{+NxIc`!mOwh zL}O+wgL+>_zy77~5^O;G5j=ybwpo_k$AZ-3ZnuG!!put8@)Q(&T~Jfl19hSPs2Tan ze|@yyJ`oiwvrsXy5w%sHLS5iD%!LVdSe_S01$i^y&ZvR)MeqJUnnHUTc40P5z0;PU z0&2?ZU_P9Lg>fH#iqEhPw%lcp-Rn>@`8#Tf9-=;5M(?(c^+fF>ORx~`M^{1dHwEp{ zvG&-_qZ#VLGf`807N6rQ)CvFEYx_W!eU=4%umbHnu{FL$t$FkPHdEbDQ9lxOTVLw8 z@7quQYs${kpec-fz@j!eY6HoMiit|7jy6S2ZBHDCbJZTfSGWgl$#VQ)53|vz0SrTZ ze%Om!s2}^$&NJkYb@=N;JWQ4Pe!m(2k&M_Q*+P;LUe#VyM z9)3-G@&Br#}^Dp)};XYQRUiPeYcr@zXau_dSrC;rNKkYgDe6R>p zay~c9dHZBj`a*>Fi^fCo4hP)9t9blkgwqRGUb4>tDK6XlJ7II$m*WxqfIacZZ#LD1 zf47C-_e{##X!%SmNvst zSu!1!hI=tKo1bsyQ(wnWWjf9!(8up8b*rEk5* zc6=99ec)sAUnibIgGRgzwH5ylQ{Z`28a+aduJcp264*iUVTONrV~ zqEQ=8dDPmsL~XtOQ8PF8DfzF4bu{P#2XG{w#jmjO-*$qFs2TYib)xsEjVr}7t5-)Y zO$XGo;s{g+cca$&IqEujpIh*jMb*2y6w*@|jOB4IDrl}^K75OsiCiyigcVRT)&RW| zpq6MbYH3EJvSpTEUyYjTJ*XM_8TI}f7=`X%6b@2||1!e4kEiey?)b+ZKt{f@VB3cE zX}^hD+vtBSkLP16>i=O`Z2mgJ8G`drOPb=1e=|cxe;p)goMxC)_y5)u*utIh{u?Ht zrfwE$4S&WcyoMR^18S)+4bJeiGBM z|2UEF?8F&S&wlw)Yg`7EzYQ@1_C}p>y6-|%?5svz_&8?4d#Da1cyCLWA2U&Jg^K#& zm>pN3s~7&~zwjKjL8Sa(2NXhepb17{Kh*0pQ8Ts)HRZcd!F3$f(aWg!y+s9Yau!1M zyjTdUVPPEVM7rKrEn8`*PQ#yg6$=F-y%8jih;-UhkH*e88#OcUQPKZ#WTZC(Sx^J1 zglhlPcL-`}CZm>e2`czjqSAF;q#Nl4$4MH>(Qpm5R#Cx7FTZo5_WV|;5#K>|;2|!+ zKq%6SnMJ4>SciIjA8ILoLB+}qzy6P34~6Zx)GmciydgWPr&DkSE=8TNXsk$Yt*T%F z>Yt-JvJ|J`8dR2)jBO*UhKhmOsEw*0Y6qN*iu#qPnb?4u33nTXoD_Cr6y8DQZ77a) zpa9mSUJjK$Q?LZC!2$RO>H;m}+64z-S?W_!1Ns?t!8@o6K0poN2{Kcz^NNDfD}Frd zc{0>Zr6ekK`4VyKRcK&{~v|MlhAocd;5j`0&jdN--fs1fE)XiHK6b$l7$8mRL$@n7$O zDU|<1{5MQTt=S?}aP7iP*!ZJJ?-46jBAfa%s5Ot1*rGTE)}~$rHGt8mwEPA&1Ith| z{5@*FIF5>~`{+IYzoww6`6!7Um=1M;eAom_VP2ex%8s8BqD{}`3u?@;Mg z;A6|Kx>%Na2P}rmQ89G&WAa};OPSQ(m;p5d(Wn#DLUrUbzkM)jMAK2Ru?ZFJXHXl> z3)B+CPi7rWj5?7%A&HUnd*~_{Lf0k^&3{8PP7#(;7Qa8KT2*>mK1e!%8VL$ zYu`_O`{6;_T~v^kNnyuVMrA<_zg`a&%#B?N+IV`S)?_Pc2Rnr7@p;sUAEK5ZPD)GD zVi--m8S3>Zm;=|MMtmN1!P}@U`97+{@jkKhBuCZVN)(DxsEaya9C{m(|AwWgC|-|R zs@;D5M^uN;p!S7ps40DedS9$mc7a5w{UJ4KV1-dLTm`v~>$IWpDGhzGDqckeSJu?F zh9yyHQwbGhEl^9+4Rv4dg$l|Ms1Z%_>$6dLz65pLa@4@KqRxL5GbsPBP|%6q`)^2` z#-=O_W~aRhMh4h=F&FiIX>BBnQ8TjzwU!4^GjbUfQ}R^=e zzY_&b(HQ>?i&6Qz4b_3eSP36vWsFX5F)#$Rw)0W%JAjI%d#K}cMA>b&1m>guIV%4b zqdNLMy6Vx-6qJ{DP(hY9gN>*rcA?${6;%I2P5o8WRNq3a`6DchZ%}KTKcl^`JSwKD zU@5GH1#u$I#RD11|7H}LWs3B^>)ndFVCKvgM3Yb_n28$EJk$l&p=Rs=s$-XM2Hr*O z3q!Kl0KP>{^)}RTC;av+sF`?`#kJ^9k=5>Ub+8IA%t!4|cTh8wKASy&6hf`(T+|dU z#SORxXJWhTkYK)o?d zZVS#V_yzT1sA%4VJ@6p5#XNZ;opv|{JK|GpiH-6`dS5_n!LO*N%NObWiPs{WK;3Pf z-}dbLsI^I3z^1S+{!6_lD!;oFv=NU)P5E@xR=or@fIX;=T|ssHFVqaZKrLOckZtM7 zQ0I$AmdbVNQc(W(M0H>wHo&!*1wWvoK1;MM&1b0kHmr(oQ9)R-uyw2+Y9`yDmg-AX zP>({rZ!0SQzsEGn|MPysGgMH;Dq_Ks0X4EhsP;zK4SS(x;5RIbf1*a7qiCe}rBg9f z(Dp|K-w@R6U!!JZF}}o2=-vNU6tlhl0BUPIk2UcTYK==2kJOJ!oK=`JKunZ~^nQ)5 zO36s)8`>|TM%pdLF4zYZwBt~B(fO#Q+KcMQIaCL4qpPXEPeCJkj>_*qDVwS=>VS_? z@5|`dbE8gB5|viva3MCp&G-y8#mh_Ed3U2aa1^8P25Ke(WypV>AaNOc{?CMEsP{z0 z!Uj|@-9#Pm0M(&4sF{jW*0$OVsP?Lu2b-Wi4~$0LMOUMi@OxD7{f0X4KV@Aje4s%W zh+WP`loHEP&xtzVGpvH+FgyN?&G0qqxCZ5I#2rvUHW0NWqfs+E8FjCihsuVPs3qFv zQqb0T3U#8m6|4iPd~>5_q%;=5VZNJCC%lEaDLuwUn5v@1z~}fK^)Wafb61LVmf~^L z5`R|NzyJ59P>6;vQ77DlgK!`2z#>&5z3=ZHp@MQ$)kyERSbjk*!Kc+MO^4%R>MKz* zSGBtBpcAk;^}`s2Q8gmH-zh7HS(N`hDd;$JK#wig86FNiPoal_AY8llh(3q z$cXK!*Q#yDZSqZ8C(`+h_JOFi{{ySx2W*Sg>T1Tw|1}hf(BRawDJ+WGU?!tx7iqB?L8b^K{`6?E|%S+u4> zoiH;hUn`;xXyvze#|+dbqB^o3bKoJ=`yZh$6mD$UkP3BtKGc3u3N@n@Q17qP*w6p2 zG(^!b7?n2jQ2D$Jli(J={V=M-r%`Ek6*bil{Q6teaj~1&Ql!Ab)ElABGZDR|!J^bR zHX;92xJQHXI(<_MvZ|=5AAmZ+*QgjdipB6f=EtJVY@_Lly6_~-it|uG{iE-1_!ISK zs3)hL&26TBbSdaU7f^ZpH!2I#wy;mFF{lIDp+@`}Y6b>jEgX-Uv5TnSyzamLCu;5g zMa4w&mUet`)cY#?x^*Z-)6f)k;mMd2*I_oih|1>=SP{#$vQN8XP%{%~ZNXF&b5kFH znQ<9v29BX(;07u-9;22bqK!8Y*GWb}(V7MILOxXVm&Ya8%&)&i1yPc=Hq|LHhI%&K zfgQ0Rrfz5V``V}(7>dgOd47GnU;ovslYfsWDC*<2w;9NVnxg8cU}=Dg+K#9+{T#LT zPr@+XMLlplLX9+T2R<)gO4Pv8pq45tYU%o+&NB*Aa(!np1)X3w>VONVk={TZa2GW* z|DY}yr=z7;B2)*npwh93U$2Qet`&ZZJy1&=t5c-+Bik5MN54Z?C)i3s7x)Pk#TPLO z@1oW)R%bgwdaOphAy&eLSO)K4NzB~EvY{<%21lWGy2+?~U*y+!pol6SSN$cB@sm&Zl;KU|8vK8^H#p)g4|d+I%gIxc5-o1v1ZB`c455UGs{z7D7? z`T{j$qq@6x;9MFs(zU3b9zu2O3TmqEV0L_lIWYBSkHhK{Hn4)E(EaX)g- z>hNgP(o9AjKM%DZtVgZ&1Jo41M@@NwFDy2ipk}l+df)$dp`af3M{UKEP;0jm)uBD8 z6COpy#_yOHU!ac5G|*050u_YieCwm$*8$bhZ%}Eu77fgehPXfyM(&XRn&?9 zMjaS?kR6a56%(0I7ixzZNgq^)hoIJU3hF{@P&?or)V^{FHFLMnn;~?y(Y&XiEiyRR z)+ilnqsfCsFxszoM;+M5cMR&dxqf|{?=jSpTtRi@v0s0W>PVs?7E7sykpBvX;xs7w zTcOshKX%1cs60*lr9GNuLycf4>aI2#H3O?K3OA!><}51RZew$NhJRzNp^?sSSZ0`g z-bm$=|M_X?go^fAcnW{SXq@_$-Q|8lWx*TN$Wjcqht3@6#SCg@R^kcVi+ga)2tOu9 z+VS;K@9%|6aDq!=D}~&n?7`y(>H#C+XnQcJf;zE_x-Cyft@Qy^jQoO{p+8Ye@g6m! zDaY8<$Dp1cYWg<8+tl0pb+__Z%lmq$=-|sHmLcOsJ>V$1jGth(ll+mfV2jWjo^y#y*N%A-2g1~qftupLgoqWBQIW9Dz{?l}!L6MMcP|CPrlX^@Xm zCr&)wmgE!E1=FE|GB@g8P#p_k8`RGEHRi@ys2MnfTC%gK4*rEYF7^!TP+HWzqR|ZU zyeEZkXwVx1Gi`%Nj(Wr2*b4K`;zCT}BrHt*>)G~U^C+rgx#rkyxEksOo2B@iPg~zcc*1=-)BAvE44twK$ z+=4CU+xZhNuusd?upaIG7TROFdxXLw8veqnIB}7ES$qy-G2-CjNbmRi<1euoadABF z+k!t~%u@RXG_cG*Cv3tpv_C_2yx?+s-*D7SRQ}EeP}6jsRuq&bJyB~m1pkLKFd=qa zVXyZ^1=&}q_KCi8QQ5H?l{NdYIG#h@_Yt3jb^fqs4S@Kzp*)bQ-*qcp>5GZeAO>QSgA z$b~w-5Gt)}q4t{zo5+9NF4xmg1%E-^EI!$62R20Yyd~20^I+aB_W7VC zDvL&=?(=6*x9R(+yQ#C)W;71!ylGtu_bJ4nqCe|4zON(g%HR#WvfU2czth(82uAY0 z^H>ls;};lzmu1N)R1kiRT7n&@0iHq4&@=oF-=SvOUAEiauo1nzAM^9V6ZDp5k1a(3 z)QL)Bc5H(>;W!N9bkq(y2bJgRQL(cXH3LUc=e>rS$&dDW9bo^bpbOa$Y^Py3 z>cT}2*ae!PM%*5?R%1{>^Brn!kD-F=HYywb^4qH(v<`H@oV2_6Crh~oTTq|=gWbNL zp!fY>?H}!#ZzvY#4LdLzANutShpfE`mZE(!Hpi2wbj$jaZ9p;Dg?d-iKz_yo_!M>C zjE8L_Ylv-P2ocbHJ6!|aMjJ3ex)O%lW?a^s14GOl$ z7=n#ECT-W;`s4n=irGU`5G>5_f(@flX4z6#a;7;|H?%a)GiQ9;)QYvDnR!UXPb zkho;#UBXBy6QT2My}y*`f~~3F!FE{Twx30&>l~w?Df`Pe$sHR(ar~0@AxM@w|DvLK;2-v+v;-~}bVH%u@ zTHAG~o$nbcol-xvU%{$}yQ$woEy4Upwlq&r_mcFFEykK-Dmt(LE6~2{2}`7r{YPOc z7JC}$+{9z3v|01FZ9JKt*_xHduC!0Z@9mT>J_gHE zpNVR}g#FQZZ5H#rL+gA9_#zYfrvMgQldy2Mflbs10U0F2?rUf^_$a z44BcV4t7EvHywN8Y21u45kc>H;xXo>UL-Q;?HiqNA@#Jupz{mvb15{SFeMc9p5t$! zrmkQ(=;djDRMh{7lko*Aokqk8I@-E#qOzn@?4VN?Z=upPQyen}_5McK3Af==Ocgii z?KAFv3c5dE$4dAQ=E9hGL2t|Kidm>nM@8*!-*>2ymx~|to{op0w&pFU{ox)q!qf?Z z-ct3(s?_IUExd!%^!dMFLYtC9n2{ISe-v~^;b?4&aT5i-n@V?7$F`%=>LzL@OOrV0 z{qE?esF>J>+7Yjz1{5!eowpt;JNlts--6!#|2l=TG=x58t;o;HcoX|44LbZAqfV3L zL5F_`*QuB?=>0f8eX5`r)ss=T;q9ojN|f5_#W6kg8JGgM;U{?x1cs1HMJNXJn7MC$Yw zTWzs6^=0U4t)5X(3}lV6wJe27pMI#V`4sBG;yG%~TV$~4pNUndA3_CLyo^Eb7ZSRm zmg*g@#~hh#X)dBV8pv!NES@>&I@)MP(x3zWM4c#U7E7DHIE(sHtd7OAS_ejDZbI#(Cs7@*m_6uy&>4o>!hg-~+KA)iu&6AH&3Iu7*26zhd0ir> zt>J3a4tNMPW0!oNpmw-$uAuir=Pz*)_4}yvjn5tQJ{8|a1#hN2LGNE!Z|zc8K|@jg zl4J^A!%WyCU(kD~{2DV7e2-C4o49~k8i!Nwj#{Eem>QE7w2|h=wA8y{WgLgg@qaiB z`xOd$f9mNzr=ThNGCJt}3e`&-Kz%}Cdqbc|(EEj<37C%dYDFzLyJ9Em zxG~n@VyGqAh)S~~I2ixL@32Fup!bUlaY_fBmDHEuYTf^i8ZQ!ak_j8Hie{$r$GP&T0y5h0Z2i zAHkMd!Gh#TCCk&Cl`UEap<-Yo>MnN$qlk?YrD&n5bSY=shQ#!gjP5t{(J$ z2V^#WOFg=V?Kfx89Yupv)Ast&IG5@soPjlJ*@$mo2kJ>{TYVswr@js&>A({_P5pVD zp!X#7L*1bBf%=eoLFZ>#-|hu98`#}*DNdsO*9PQ&e@@W0p#{^0Mi#v>jcrRFfZFkP z`t^8Cg5EP9fMi=~;d8<-%HN3G^|T%K08fAqwdxEDXh+Ze`I{_F4Y6Y9aX)`4^wpL!cigr8wz9Eys8 zseb!%mx6a!L!ICz#>2N*5M#BoU@C!GsMkZ?3%)?TJ{4o|M=XvX@KY?_-rm0qb^hZR zjW1Ch$=Siu*^Qx~n?wuDfg5};VS4Hj9W9D8qOu?x>S47M>SOq6)Cn)4((M5%-8yx$ ze2>?e0kOo<7@PL8T`bG0A^)JZ>olOCwW;{2&eb*untZ*PIkaW)pg zXP5zVbhi%IKxIjH)cfb4?sn&}EN1%5X0#(VSN;#7pa+8ss2NDw!`7@cDo^X6dfpu~ zVn5VU%|@MgGmb^4r_IzjOh9!qYKG>aw)7Pk3s0b8;4Eh0`p!KH3Z?|Tg5LLaNqsY6 z9NG)wM;L>tuqGI=VE1>Fi zF(Eed?TSgLe}P)-38)LtM~&zJX2m0@jy^&~{X75lguU%yG&!n0A1ap0_9p+;qsD$i zAJj<3p+2wAz*>0FZ%@$2I`#=FIJ09JtcqIeai|Xdgqr#bsI0h&nz__{ts_NH*QwLj zwG+0WL7(-yVHA$VLAVOl5SWMMN-KN`MW}J)_aSO6E{QVCFMQMSN*3-IJg8CTL1%ANncmcJ8eL&rO zqDR@3f8qNTY9_~{_J_-;oiTc}1zT@aER01h*$^bTQ>7xl2#97hH{~{E0 z;xeebZ{*iIqDDLz74;MS_IaodY)0*LCs65i2^HPXQOCVO1zEg_7DI_pOPUk)dYOsj zzfM$_25mr}qJnDxszW3E_Bnq0cYb{{Y9t3x9X{{Z@A$93Ma@L)Nwyy(K@A`?>N?S= znJYJm^w0$x(x9HT_3e+js82ve?+#Rt@1Q#N5_REtlWmPtp`tqmb)j~s9kDm+eRKTR zSE8cN=ek(_Qf1H+<$#7=BBuk%!BSi)>%`V@c5aGrY=6gUU4T>_g{q)X0miwi#K1>!`urfQ`tCq&<@?e5_rDKQQ1Cp$Oc;BE-3@bNe(Kdw zuMft#1j|fR+UDPGX;cl1P;ZIaqNk&7!^cn^{0)^Af1@^{zzz%cv^&UuMSW2k6y^0$ z7wm-{a4{;_f;;UVPyiM6&G8=gL7lMquAp-W2cWjx61#)mPrqB@bm|}N33|T?u?+Qa zns9H>xrW>JlK;9%Oy6f8iGD_1Fk-)b(#eN8sdqrVZwhLpCw(Ih&>@1bIBKoy9khGF zbgV%AEY8Q|-`hQ8D=PiYq4t-zE(PUtwjV5CV^H<_e!UASScYPJT#MRLccG?qzu$fu zmG8fyHkPNpfgf$dNrKw((xLW|0;q>xwOmoPlI0kirhNyj@BX+|+s3p6K zQTPhA<|%)&3)jLQskcV$d>Ibg66Ht5OifhqbwbX||Nqqr&Jc{`h4H8nOh%nxA+G0z z^{6Rsah$xRz5wfyo-a-XowY1M<^KhpezZUPnJK2;<(w_ul=C*Q-KeF#jN>qTK}$^j zO{JhIK7^g|Z)}52FIqb7@=bfmPBa29@%mEK8Vg!M&PQk0TR5!5@_18ET^IWqH z>=^z@{TV8Ff4^=UQ_34bXD{`$=nkeZ!IxnEm8ZyFw{&X zdF0wd=lVw$1GiBlN&GnI{e+_^>I9#oMz92r;VE2+GoRQDlzJNU{yEMrsI_2ONVFURn?){>Sci z53mI76<^uRx!9HZP1KT9|JP<@6l#Bo``W%)ann;!koCp%xCNEpXR$0k#7dawjok(N zqDFWQ6;$sqFP3;~dHyMup*|X$<6$g`QU94OaXj@oSYG*`@m+*{CO`cc?6j^HIog6%36jT)^(Aj+9Si7ao9` z!uhBuK8$^_aN>~n<-=X~=sHD28#VR!7BFBh(V~N*c2J z{{$LzUtf;8+3Z7&^aN_{KKS)=$!y98pf;WrsI~tYwbedH1#ybxA@7q^QB=JK>OrJC zYQQ6~JI+qd??1nw5SfChz<*I2(!i7iIz&h__Kw+A>YZyDg8$8Ps#94S74)52zik zQ9A3uaNJLQHmc)|(ucg~gq7&96x&b(*d7(~zTkN8n>s_t+tA!%6m-H4*aW9y6y8J4 zNbHQZG~-ZDK8sQN#YNNzlV`HEZj4&8DHw%^P{Df#b)LAHZR8VBGjS9%EB~KTSVBXx zEY_o)s35$Biqhm+L*7p;I^a09qh_jmHk+9{IDq<~?DqOo9Hn}WkoN<~_oywrVNRQY z(KvzT*$d=1v69xrdm*@rFh z9e$F}mMlg7koSefTGX@OV{DJf3WS_3nwo(Wls35vhP*Ept`-V;PeA`+I$lo@9dgR@ zdTwOOoF0X3>c7E))X!o83>C4ND~j5ZyW=FBi{D_jq9O0WWe-MDpI(fmiJ~x@f-bZR zl~xx~BMcO`bSZ^hsnM6KNDYJPg@?TTYg9hbuZ`2x% zMLnf%z(lwMwJ{y_>*rBB-d)trmaDXFI7Lt!Om&QhZBX}+?ihhbQRh2>I^XXu1@-7Y z#=-xP%yq(LEbZc>cCO5*_L7(w%b_mN0AphtY>r(~9Y2KX*h$n)>H@~ca9Ml(W7PHB z)D+TF$bwpmO8y(#qI%lZcM$4A6a3ewW0?9p{1}&_F0ccK;~`WBDwQ+qqF!&|*SjJE zaGkys6nrjf!&rzJ@F(B9s0+j{Zyim8+B#!UGtmh3dKdf@hxo7mftrc;sB8#Vu;U7& zI#wIKt*IFWZ8&Xwr{hP|kD@Mc5j7L{{rVeBLp^@QkQ2llsI|5#Ix|yh{ zUWYYt2WlxJD=~x0|2P!X(?qBjQlc)L4iy{uQ5UM8bXe-oG^gwl_A8IK_ zphmg?)qz#0CD?*`|3P$BIN~>)M%{+bp-%J=wdQY7GZ0zXI+heQi7u1eHtq5=KAdmuqXAketW8_u8k;dRqJU!)YO+n^{_sw$DL49IS92xqfqagfLi1E zs3qKrnz6m8j{JnF@vL8ej5_W=)cF#+)$9bHpbpHB%Io5Oy^?Qj)P7*$>O6t!W&%{!e1f`%6hw8{Z9+l8)dn@S9Z@mS7j?nGsG0Z*zrg9J3&pDu z^1iG}hI;=3)K0n_wFR%jf_NP@;v_Zg`5-guyv>m7^6&ppPz-dm24@iFqdp8ZMH^5T z+>M&jL#Ubh1vSFoeD9(L@(eXIuTWE;qL#&0A=E(XqGqfECer=CF9n@&6sqTwQEUDa z4#P{RXSyb}L*BpX(jWDDR2?%Kb?>O^*IWDbKB$3>L&eAfREM{rrv7{6^Dog)L1}jy zHR3<85MCs8AM zj!~GRt#zcBZ#&cgCZLYnjE(U}mx9*nlXmvRG7t|jBYUwSx*b9e|3_`-Tt`NX2RnzH zj`&BHkP~2QtNy8tyk_^1_kBSx%*pu{ptrN4mhvhV!&g`W^M7VD=XR%{bQy`-7?z>3 z;22KD4_FST_OLYi1@*cAF>0-I^|TSULM_2CEQL!@>2@8JJ2J=0t181=izQlBxqpx+mDrTYH z3H#wh^nU-x>1Utq*5EW=h}}Qr{p8|XjG{hzK*;-Dt`)e1sjvJ+$Qh4+4zv%EeFpP+ zf%-Mfff>KFpshL7K9GEaU$0=y4-l5Vgk!zpja-sh3I72Z3 zj{AzK#aY8GOU{k3B^ox;-j{Hc&D1BOt>Z8V5DedhlKAMpQdsf?%P3d*^nXm?y=J*>}8Pl(~nCOg!sn12l+Ry8m+8-!9 zq@f9J*kC6LZ?uQWk5LaMLs47sT)!S`lil?)qh=}>4#6Wh4$E&2c|U?ViOTaMTkJz= z+N~k)YrLh{koG+8wvhL;n-SQZhR}8!ac}HFJ!*&5r=aSkc3OQc)}-Eimwi-Qi5l5$ z)W-G6Zu>mY1M5;hhE>(RC**zc*d7N`cQ;TNN+H```=;VM+(13iJ{$2t)Q*>Xzm34f zj?{w(EKNT}1=(r8p68&=$k#Yb$9>O-TU?9VvDFVD@26-V|LDbx>-K`A|%)9JA z6ryQ(jzuy1aZ8uBsHt;N`T8?z&7w}&_W}L!DfQQQ9v_?xdH++Y?@w8M{ppbRZ$XYc z6Y_rTuEPI9-p_)rqBfwxKZl&7T;F*@fj>%ccK#CbexYc|c{}hasso!Ykd_#@Xj4BC z6;w}AC#rJEHm-d*ntH9vOg&lgD{AERub69b2KC_8ki)P3JKv%^fQG3zZEp_Wvb7q6 z{0)Lr>~_dm&g(hug}nb|(iv2=5B}4(=4AIRCQji<+Uq^ASUHb(sb~Mo+CO?2a(<#d z9o506kLkH~+Gpu=Mu@g?N1CY(7>>^XhRbK7uU;sM^b@C92lueW+h8ez59A?Gmd z=l%;hH>l5jXL&v(5cci?8&NZO8#`chMA*AI%|T_)g$O?XC|xo|hP@Gffy-16hP^HG zDAuEX7h7SmP}qz9Sy+PlThs@NBH^(2v!m~@3-$Q1!rqeg!}iqQ`}KCQ!(Ooeg>7gb z;>NMU@2C@%j2reIk=CGkoHm|~U^uR)eijenSMkH%R$Mkg*!$AyK7K{}iiBpikHX&C zuR`4|1Bt>;Tg;BS@Oad~-1`)?F_cUk_VRobsv{Rs8${(KVQ<4Yh#9EI`#9|ViB%rd z?esV{!zcI+R!bW8((4Lp>We3{DW8COs2{_U_zza#`cA>*VQ;SvsEo!ANAqn4~=N*m!WEJHotQwOD^P3v6!pMTDwPdvFy^LyA3sxEc4R z4|{*A(IYDCJz+h-eq7(lkRj~dmuI2&@N2jqlV%Ki`Fa*VrQRizt=TWA_hrg#Q`!vk zQXh-DP4B>p)MsS3kzdA2)RX53J3sPzOVsT?eV(x6Hm9(XLJN$@8+OWKYut&8a5Of_ z7xsR0=_+c3+4I}lev2omKR_+njsi9lAFvVi-UY+nbHPy@MSWl)Tk3bdG0}Ygq5JfZ z=&-ke?7^?8mo6N37UR#Ty}x&nu=neDQ&4LeyQp=r66T=(4mHAT#Vj^@V0G$0;CV(I zzj)aDFnTK{>^=D;D`l}!q7?bxjW>>^K|aGB*s65c+p&_C2|N5zqjMS6u~ikq&Q`Y8 z5*5SVBirN3Hr0VDVej#}GHT>5*2eRwEXZ6n?A=@X;}YuYQA=FMt!4)%s2+CWg-AD4 z7Syj}Cpd#0sHd%KGcg>sV=hFk;m7sD-p)7=6_m~E+e}TwcGN=+ti20r|Coa(8Bpbh zVefZI+$2rI{Ai317B~k_wFo<7cw?tFVS6&dTGThRwHf#icTu0x&Z56cdt2lEs4ci> z2V3hpU91D=upaL((lzWo8I8jz>WM$~IzawYm_@^N)Km}X7WRI$TB&E)`}O)qsJqtA zUSVei*8Du|-GrVa|62%WN^c9&q5Z<%qg7=8u=fi`Q&2aZsspS&!54O(Ik<}UJOkBn z^6vr#-CoBI3VYB0i3f+B@2D?DZ9G+n*q%QXbvu25Izg>3!w!E>=KO;i`Tx0k3vj8b zFJS)=-l;otXD�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 C$w#OF diff --git a/conf/locale/eo/LC_MESSAGES/django.po b/conf/locale/eo/LC_MESSAGES/django.po index f3606c227011..ee2c5f662c52 100644 --- a/conf/locale/eo/LC_MESSAGES/django.po +++ b/conf/locale/eo/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:36+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.128712\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.373996\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: eo\n" @@ -27932,10 +27932,6 @@ msgstr "Mänägé Tägs Ⱡ'σяєм ιρѕυм ∂σłσя #" msgid "Manage Access" msgstr "Mänägé Àççéss Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#" -#: cms/templates/studio_xblock_wrapper.html -msgid "Manage tags" -msgstr "Mänägé tägs Ⱡ'σяєм ιρѕυм ∂σłσя #" - #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "Çöpý tö Çlïpßöärd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#" diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo index 1333e405cf95480a0ab63fee72ae81870499584f..a6d62c869a55253fce63838c0d3447684434025f 100644 GIT binary patch delta 54 zcmdmeN_zJx>4p}@Eld%bLPmxPMg~^KW>$tKdM3seMy4k1S(;2h%nZaVK+L*5OOx&5 FZUD}|5O4qh delta 54 zcmdmeN_zJx>4p}@Eld%bLWU*^Mg~^KW>yB~dIsjE1|}BmS(;2h%nZaVK+L*5OOx&5 FZUD~*5OM$j diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.po b/conf/locale/eo/LC_MESSAGES/djangojs.po index b6d224c027f8..090b10b2673c 100644 --- a/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:35+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.075048\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.438254\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: eo\n" diff --git a/conf/locale/es_419/LC_MESSAGES/django.po b/conf/locale/es_419/LC_MESSAGES/django.po index 35adf8066d05..73109db5ae40 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -100,7 +100,7 @@ # Zainab Amir , 2019 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -140,7 +140,7 @@ # Valeria Freire , 2014 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -271,7 +271,7 @@ # Zimeng Chen, 2021 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -284,9 +284,9 @@ # Leonardo J. Caballero G. , 2018 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Spanish (Latin America) (https://app.transifex.com/open-edx/teams/6205/es_419/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # Miguel Bonilla , 2019 @@ -296,7 +296,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Albeiro Gonzalez , 2019\n" "Language-Team: Spanish (Latin America) (https://app.transifex.com/open-edx/teams/6205/es_419/)\n" @@ -8777,6 +8777,13 @@ msgstr "Profesión" msgid "Specialty" msgstr "Especialidad" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13704,6 +13711,10 @@ msgstr "Duplicado de '{0}'" msgid "Invalid prerequisite course key" msgstr "Clave inválida del curso prerrequisito" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Establecer Fecha" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13922,10 +13933,6 @@ msgstr "Solo Evaluación Par" msgid "Course has been successfully reindexed." msgstr "El curso ha sido reindexado correctamente." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Establecer Fecha" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -25131,6 +25138,10 @@ msgstr "Expandir o Colapsar" msgid "Select this problem" msgstr "Seleccionar este problema" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Administrar acceso" @@ -25504,6 +25515,10 @@ msgstr "Navegación del curso" msgid "Outline" msgstr "Estructura" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Editor" diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.po b/conf/locale/es_419/LC_MESSAGES/djangojs.po index f4be62ca19fd..5bb5965336f5 100644 --- a/conf/locale/es_419/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/eu_ES/LC_MESSAGES/django.po b/conf/locale/eu_ES/LC_MESSAGES/django.po index dcd52ce8bc00..2fc51a561f03 100644 --- a/conf/locale/eu_ES/LC_MESSAGES/django.po +++ b/conf/locale/eu_ES/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ # Pedro Lonbide , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Basque (Spain) (http://app.transifex.com/open-edx/edx-platform/language/eu_ES/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -21,7 +21,7 @@ # Pedro Lonbide , 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Basque (Spain) (http://app.transifex.com/open-edx/edx-platform/language/eu_ES/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7627,6 +7627,13 @@ msgstr "Lanbidea" msgid "Specialty" msgstr "Espezialitatea" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11922,6 +11929,10 @@ msgstr "" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Ezarri data" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12129,10 +12140,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Ezarri data" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21807,6 +21814,10 @@ msgstr "Zabaldu edo tolestu" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22131,6 +22142,10 @@ msgstr "Ikastaroaren nabigazioa" msgid "Outline" msgstr "Egitura" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Argitaratzailea" diff --git a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po index b65cb4f92b87..9703a1a94066 100644 --- a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po +++ b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Basque (Spain) (http://app.transifex.com/open-edx/edx-platform/language/eu_ES/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/fa_IR/LC_MESSAGES/django.po b/conf/locale/fa_IR/LC_MESSAGES/django.po index 021611fbad48..fe9186fa62d8 100644 --- a/conf/locale/fa_IR/LC_MESSAGES/django.po +++ b/conf/locale/fa_IR/LC_MESSAGES/django.po @@ -43,7 +43,7 @@ # Zahra Sadat Navabi , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Persian (Iran) (http://app.transifex.com/open-edx/edx-platform/language/fa_IR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -60,7 +60,7 @@ # Somaye Joolaee, 2022 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Persian (Iran) (http://app.transifex.com/open-edx/edx-platform/language/fa_IR/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -8318,6 +8318,13 @@ msgstr "حرفه" msgid "Specialty" msgstr "تخصص" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13099,6 +13106,10 @@ msgstr "کپی '{0}' " msgid "Invalid prerequisite course key" msgstr "کلید دوره پیش‌نیاز معتبر نیست" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "ثبت تاریخ" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13312,10 +13323,6 @@ msgstr "فقط ارزیابی همتا" msgid "Course has been successfully reindexed." msgstr "دوره آموزشی با موفقیت دوباره نمایه شده است." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "ثبت تاریخ" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -24238,6 +24245,10 @@ msgstr "گسترده یا فشرده" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "مدیریت دسترسی" @@ -24607,6 +24618,10 @@ msgstr "پیمایش دوره آموزشی" msgid "Outline" msgstr "طرح کلی" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "ناشر" diff --git a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po index fe13c7e28753..8d31d1def536 100644 --- a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po +++ b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Persian (Iran) (http://app.transifex.com/open-edx/edx-platform/language/fa_IR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/fr/LC_MESSAGES/django.po b/conf/locale/fr/LC_MESSAGES/django.po index 32b0615503bd..26f88f42b87b 100644 --- a/conf/locale/fr/LC_MESSAGES/django.po +++ b/conf/locale/fr/LC_MESSAGES/django.po @@ -94,7 +94,7 @@ # d6910e756eb8532754192e6021dc9f83, 2014-2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from French (http://app.transifex.com/open-edx/edx-platform/language/fr/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -147,7 +147,7 @@ # d6910e756eb8532754192e6021dc9f83, 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from French (http://app.transifex.com/open-edx/edx-platform/language/fr/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -8744,6 +8744,13 @@ msgstr "Profession" msgid "Specialty" msgstr "Spécialité" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13638,6 +13645,10 @@ msgstr "Duplication de '{0}'" msgid "Invalid prerequisite course key" msgstr "Id du cours prérequis invalide" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Définir une date" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13857,10 +13868,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Cours réindexé avec succès." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Définir une date" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -25056,6 +25063,10 @@ msgstr "Déplier ou Replier" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -25431,6 +25442,10 @@ msgstr "Navigation du cours" msgid "Outline" msgstr "Plan du Cours" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Éditeur" diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.po b/conf/locale/fr/LC_MESSAGES/djangojs.po index ee42a0decbe7..a7343cf2dbc0 100644 --- a/conf/locale/fr/LC_MESSAGES/djangojs.po +++ b/conf/locale/fr/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from French (http://app.transifex.com/open-edx/edx-platform/language/fr/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/id/LC_MESSAGES/django.po b/conf/locale/id/LC_MESSAGES/django.po index 7b04fdbbf15f..29ca5f46d609 100644 --- a/conf/locale/id/LC_MESSAGES/django.po +++ b/conf/locale/id/LC_MESSAGES/django.po @@ -22,7 +22,7 @@ # Waheed Ahmed , 2019 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -31,9 +31,10 @@ # Ahmad Sofyan , 2013 # Faizar Septiawan , 2020,2022-2023 # fizdoonk, 2013 +# oon arfiandwi (OonID) , 2024 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7861,6 +7862,13 @@ msgstr "Profesi" msgid "Specialty" msgstr "Keahlian" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12445,6 +12453,10 @@ msgstr "Duplikasi '{0}'" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12652,10 +12664,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -23116,6 +23124,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23449,6 +23461,10 @@ msgstr "Navigasi kursus" msgid "Outline" msgstr "Garis Besar" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/id/LC_MESSAGES/djangojs.po b/conf/locale/id/LC_MESSAGES/djangojs.po index 10caa3808455..ff83e5b31f43 100644 --- a/conf/locale/id/LC_MESSAGES/djangojs.po +++ b/conf/locale/id/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -84,7 +84,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-07 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Faizar Septiawan , 2023\n" "Language-Team: Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/)\n" diff --git a/conf/locale/it_IT/LC_MESSAGES/django.po b/conf/locale/it_IT/LC_MESSAGES/django.po index 9598f0b84827..cd95d82babbd 100644 --- a/conf/locale/it_IT/LC_MESSAGES/django.po +++ b/conf/locale/it_IT/LC_MESSAGES/django.po @@ -31,7 +31,7 @@ # Tiziana Longeri , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -46,7 +46,7 @@ # Pietro Lombardo , 2014-2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -99,7 +99,7 @@ # e9bb8fb5ffc36b415d1216869d7411be_857723a <56bb50d0e16dd64ebfbee187920dfe4a_229834>, 2014 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -114,9 +114,9 @@ # Stefania Trabucchi , 2021 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Italian (Italy) (https://app.transifex.com/open-edx/teams/6205/it_IT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # Waheed Ahmed , 2019 @@ -127,7 +127,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Ilaria Botti , 2021\n" "Language-Team: Italian (Italy) (https://app.transifex.com/open-edx/teams/6205/it_IT/)\n" @@ -8587,6 +8587,13 @@ msgstr "Professione" msgid "Specialty" msgstr "Specializzazione" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13474,6 +13481,10 @@ msgstr "Duplicato di '{0}'" msgid "Invalid prerequisite course key" msgstr "Chiave corso richiesta non valida" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Imposta data" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13694,10 +13705,6 @@ msgstr "Solo valutazione dei colleghi " msgid "Course has been successfully reindexed." msgstr "Il corso è stato correttamente reindicizzato." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Imposta data" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -24873,6 +24880,10 @@ msgstr "Espandi o comprimi " msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -25248,6 +25259,10 @@ msgstr "Indice del corso" msgid "Outline" msgstr "Struttura " +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Publisher" diff --git a/conf/locale/it_IT/LC_MESSAGES/djangojs.po b/conf/locale/it_IT/LC_MESSAGES/djangojs.po index 36794d8fb791..45e9abb57b25 100644 --- a/conf/locale/it_IT/LC_MESSAGES/djangojs.po +++ b/conf/locale/it_IT/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.po b/conf/locale/ja_JP/LC_MESSAGES/django.po index 7ced9c8d3027..071840df7641 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/django.po +++ b/conf/locale/ja_JP/LC_MESSAGES/django.po @@ -24,7 +24,7 @@ # 鈴木 陽一 , 2017 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Japanese (Japan) (http://app.transifex.com/open-edx/edx-platform/language/ja_JP/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -40,7 +40,7 @@ # わたカフェの店長, 2013 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Japanese (Japan) (http://app.transifex.com/open-edx/edx-platform/language/ja_JP/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7547,6 +7547,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11781,6 +11788,10 @@ msgstr "'{0}' の重複" msgid "Invalid prerequisite course key" msgstr "無効な履習要件コースキー" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11989,10 +12000,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "講座の見出し再作成が完了しました。" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21749,6 +21756,10 @@ msgstr "開くまたは閉じる" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22083,6 +22094,10 @@ msgstr "講座ナビゲーション" msgid "Outline" msgstr "アウトライン" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po index 92d9f7422023..534d1af35d27 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po +++ b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Japanese (Japan) (http://app.transifex.com/open-edx/edx-platform/language/ja_JP/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/ka/LC_MESSAGES/django.po b/conf/locale/ka/LC_MESSAGES/django.po index 6f7b323aa6b4..671a3e90e13b 100644 --- a/conf/locale/ka/LC_MESSAGES/django.po +++ b/conf/locale/ka/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ # Simon Janashia , 2019 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Georgian (http://app.transifex.com/open-edx/edx-platform/language/ka/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -21,7 +21,7 @@ # Lasha Kokilashvili, 2018 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Georgian (http://app.transifex.com/open-edx/edx-platform/language/ka/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7725,6 +7725,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12279,6 +12286,10 @@ msgstr "'{0}'-ის ასლი" msgid "Invalid prerequisite course key" msgstr "სავალდებულო კურსის არასწორი გასაღები" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12486,10 +12497,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "კურსის ხელახალი ინდექსაცია წარმატებით დასრულდა." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22952,6 +22959,10 @@ msgstr "ჩამოშალე ან აკეცე" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23294,6 +23305,10 @@ msgstr "კურსის ნავიგაცია" msgid "Outline" msgstr "სტრუქტურა" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/ka/LC_MESSAGES/djangojs.po b/conf/locale/ka/LC_MESSAGES/djangojs.po index c517a7eb9081..9fb42fdad536 100644 --- a/conf/locale/ka/LC_MESSAGES/djangojs.po +++ b/conf/locale/ka/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Georgian (http://app.transifex.com/open-edx/edx-platform/language/ka/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/lt_LT/LC_MESSAGES/django.po b/conf/locale/lt_LT/LC_MESSAGES/django.po index b23eaf5baef0..157e2085bbff 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/django.po +++ b/conf/locale/lt_LT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ # 99ff332f197efc0398f769062a4c5442_2965e21 , 2013 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Lithuanian (Lithuania) (http://app.transifex.com/open-edx/edx-platform/language/lt_LT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -24,7 +24,7 @@ # 99ff332f197efc0398f769062a4c5442_2965e21 , 2013 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Lithuanian (Lithuania) (http://app.transifex.com/open-edx/edx-platform/language/lt_LT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7454,6 +7454,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11627,6 +11634,10 @@ msgstr " '{0}' kopija" msgid "Invalid prerequisite course key" msgstr "Neteisingas būtino kurso raktas" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11834,10 +11845,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kursas sėkmingai perindeksuotas." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22005,6 +22012,10 @@ msgstr "Išskleisti arba suskleisti" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22345,6 +22356,10 @@ msgstr "Kurso navigacija" msgid "Outline" msgstr "Planas" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po index dd018f0755b0..7b4b47ef61c5 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po +++ b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Lithuanian (Lithuania) (http://app.transifex.com/open-edx/edx-platform/language/lt_LT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/lv/LC_MESSAGES/django.po b/conf/locale/lv/LC_MESSAGES/django.po index b85fc9ed9623..ccd7345ed3b0 100644 --- a/conf/locale/lv/LC_MESSAGES/django.po +++ b/conf/locale/lv/LC_MESSAGES/django.po @@ -9,14 +9,14 @@ # LTMC Latvijas Tiesnešu mācību centrs , 2018 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Latvian (http://app.transifex.com/open-edx/edx-platform/language/lv/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: # LTMC Latvijas Tiesnešu mācību centrs , 2018 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Latvian (http://app.transifex.com/open-edx/edx-platform/language/lv/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7896,6 +7896,13 @@ msgstr "Profesija" msgid "Specialty" msgstr "Specialitāte" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12487,6 +12494,10 @@ msgstr "" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12694,10 +12705,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kurss ir veiksmīgi pārindeksots." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22833,6 +22840,10 @@ msgstr "Izvērst vai sakļaut" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23156,6 +23167,10 @@ msgstr "" msgid "Outline" msgstr "" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/lv/LC_MESSAGES/djangojs.po b/conf/locale/lv/LC_MESSAGES/djangojs.po index 601c4c00b728..988f9f8a051d 100644 --- a/conf/locale/lv/LC_MESSAGES/djangojs.po +++ b/conf/locale/lv/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Latvian (http://app.transifex.com/open-edx/edx-platform/language/lv/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/mn/LC_MESSAGES/django.po b/conf/locale/mn/LC_MESSAGES/django.po index 15d00e9d0280..807ae88a0a09 100644 --- a/conf/locale/mn/LC_MESSAGES/django.po +++ b/conf/locale/mn/LC_MESSAGES/django.po @@ -14,13 +14,13 @@ # Otgontsetseg Sukhbaatar , 2018 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Mongolian (http://app.transifex.com/open-edx/edx-platform/language/mn/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Mongolian (http://app.transifex.com/open-edx/edx-platform/language/mn/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7525,6 +7525,13 @@ msgstr "Мэргэжил" msgid "Specialty" msgstr "Мэргэшил" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11716,6 +11723,10 @@ msgstr "" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11923,10 +11934,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21568,6 +21575,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -21892,6 +21903,10 @@ msgstr "Хичээлийн навигаци " msgid "Outline" msgstr "Төлөвлөгөө" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/mn/LC_MESSAGES/djangojs.po b/conf/locale/mn/LC_MESSAGES/djangojs.po index 0162f00bad07..4878072ecaa5 100644 --- a/conf/locale/mn/LC_MESSAGES/djangojs.po +++ b/conf/locale/mn/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Mongolian (http://app.transifex.com/open-edx/edx-platform/language/mn/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/pl/LC_MESSAGES/django.po b/conf/locale/pl/LC_MESSAGES/django.po index d2b20b4909bd..3dc5af467294 100644 --- a/conf/locale/pl/LC_MESSAGES/django.po +++ b/conf/locale/pl/LC_MESSAGES/django.po @@ -42,7 +42,7 @@ # Dyfeomorfizm , 2014 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Polish (http://app.transifex.com/open-edx/edx-platform/language/pl/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -58,7 +58,7 @@ # ajafo , 2014 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Polish (http://app.transifex.com/open-edx/edx-platform/language/pl/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7995,6 +7995,13 @@ msgstr "Zawód" msgid "Specialty" msgstr "Specjalność" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12622,6 +12629,10 @@ msgstr "Duplikat '{0}'" msgid "Invalid prerequisite course key" msgstr "Błędny klucz kursu poprzedzającego" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Ustaw datę" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12840,10 +12851,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kurs został pomyślnie przeindeksowany." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Ustaw datę" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -23445,6 +23452,10 @@ msgstr "Rozwiń lub zwiń" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23814,6 +23825,10 @@ msgstr "Nawigacja po kursie" msgid "Outline" msgstr "Program" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/pl/LC_MESSAGES/djangojs.po b/conf/locale/pl/LC_MESSAGES/djangojs.po index f78408ec8dec..2d31dfb4d47e 100644 --- a/conf/locale/pl/LC_MESSAGES/djangojs.po +++ b/conf/locale/pl/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Polish (http://app.transifex.com/open-edx/edx-platform/language/pl/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po index 9249f74382e6..9b19a103c729 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Brazil) (http://app.transifex.com/open-edx/edx-platform/language/pt_BR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/pt_PT/LC_MESSAGES/django.po b/conf/locale/pt_PT/LC_MESSAGES/django.po index 5005264e8fa3..4d9fb7918861 100644 --- a/conf/locale/pt_PT/LC_MESSAGES/django.po +++ b/conf/locale/pt_PT/LC_MESSAGES/django.po @@ -32,7 +32,7 @@ # Rui Ribeiro , 2018-2020 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -50,7 +50,7 @@ # Rui Ribeiro , 2018-2019 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -104,7 +104,7 @@ # Rui Ribeiro , 2018-2019 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -130,9 +130,9 @@ # Rui Ribeiro , 2019 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Portugal) (https://app.transifex.com/open-edx/teams/6205/pt_PT/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # Cátia Lopes , 2019 @@ -141,7 +141,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Cátia Lopes , 2019\n" "Language-Team: Portuguese (Portugal) (https://app.transifex.com/open-edx/teams/6205/pt_PT/)\n" @@ -8540,6 +8540,13 @@ msgstr "Profissão" msgid "Specialty" msgstr "Especialidade" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13400,6 +13407,10 @@ msgstr "Duplicado de '{0}'" msgid "Invalid prerequisite course key" msgstr "Chave do curso de pré-requisitos inválida" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Definir Data" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13621,10 +13632,6 @@ msgstr "Somente Avaliação por Pares" msgid "Course has been successfully reindexed." msgstr "O curso foi reindexado com sucesso." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Definir Data" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -24707,6 +24714,10 @@ msgstr "Expandir ou Encolher" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Gerir o Acesso" @@ -25082,6 +25093,10 @@ msgstr "Navegação do Curso" msgid "Outline" msgstr "Estrutura Geral" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Editor" diff --git a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po index b33940f3322e..f7800ca32933 100644 --- a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/rtl/LC_MESSAGES/django.mo b/conf/locale/rtl/LC_MESSAGES/django.mo index 18928966ac49f5cf4da56f63e274fb55af3ae62e..52bc1ec30493f5b1c8225f1ccdf68b1fb7960200 100644 GIT binary patch delta 93663 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 z�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%0D&~H9< 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 diff --git a/conf/locale/rtl/LC_MESSAGES/django.po b/conf/locale/rtl/LC_MESSAGES/django.po index 5087b5a0e0ba..6b5e37a31f6d 100644 --- a/conf/locale/rtl/LC_MESSAGES/django.po +++ b/conf/locale/rtl/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:36+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.128712\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.373996\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: rtl\n" @@ -24177,10 +24177,6 @@ msgstr "Mɐnɐƃǝ Ŧɐƃs" msgid "Manage Access" msgstr "Mɐnɐƃǝ Ⱥɔɔǝss" -#: cms/templates/studio_xblock_wrapper.html -msgid "Manage tags" -msgstr "Mɐnɐƃǝ ʇɐƃs" - #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "Ȼødʎ ʇø Ȼlᴉdbøɐɹd" diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.mo b/conf/locale/rtl/LC_MESSAGES/djangojs.mo index e3e7177ddcc3ac15225bc3deff63188803a14b67..aba1fafda64091ee5b4f6e81ce6972d1e4423df4 100644 GIT binary patch delta 46 zcmbP#MR5KV!G;#bEld%bLPmxPMg~^KW>$tKdM3seMy4k1S(;2h%)C8IlVz&|08n2I AVgLXD delta 46 zcmbP#MR5KV!G;#bEld%bLWU*^Mg~^KW>yB~dIsjE1|}BmS(;2h%)C8IlVz&|08p0= AWB>pF diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.po b/conf/locale/rtl/LC_MESSAGES/djangojs.po index 8d4bfa87175d..cef3d5931fe4 100644 --- a/conf/locale/rtl/LC_MESSAGES/djangojs.po +++ b/conf/locale/rtl/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2024-01-14 20:35+0000\n" -"PO-Revision-Date: 2024-01-14 20:36:07.075048\n" +"POT-Creation-Date: 2024-01-21 20:36+0000\n" +"PO-Revision-Date: 2024-01-21 20:36:14.438254\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: rtl\n" diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.po b/conf/locale/ru/LC_MESSAGES/djangojs.po index a2496a7f58e3..c1c87ca1308a 100644 --- a/conf/locale/ru/LC_MESSAGES/djangojs.po +++ b/conf/locale/ru/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Russian (http://app.transifex.com/open-edx/edx-platform/language/ru/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/sk/LC_MESSAGES/django.po b/conf/locale/sk/LC_MESSAGES/django.po index cf83fd38b2ae..925e2e732110 100644 --- a/conf/locale/sk/LC_MESSAGES/django.po +++ b/conf/locale/sk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ # adb712fb58d87c74cf0f50ac3f74745f_5787dfc , 2014 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Slovak (http://app.transifex.com/open-edx/edx-platform/language/sk/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -17,7 +17,7 @@ # Vladimír Záhradník , 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Slovak (http://app.transifex.com/open-edx/edx-platform/language/sk/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7552,6 +7552,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11753,6 +11760,10 @@ msgstr "Duplikát '{0}'" msgid "Invalid prerequisite course key" msgstr "Neplatný kľúč ku kurzu, ktorý je predpokladom pre kurz aktuálny" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11960,10 +11971,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kurz bol úspešne preindexovaný." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21542,6 +21549,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -21867,6 +21878,10 @@ msgstr "" msgid "Outline" msgstr "" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/sk/LC_MESSAGES/djangojs.po b/conf/locale/sk/LC_MESSAGES/djangojs.po index 500bf8dc899a..d696329967af 100644 --- a/conf/locale/sk/LC_MESSAGES/djangojs.po +++ b/conf/locale/sk/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Slovak (http://app.transifex.com/open-edx/edx-platform/language/sk/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/sw_KE/LC_MESSAGES/django.po b/conf/locale/sw_KE/LC_MESSAGES/django.po index 02aeb4f8926f..89e2726e23cd 100644 --- a/conf/locale/sw_KE/LC_MESSAGES/django.po +++ b/conf/locale/sw_KE/LC_MESSAGES/django.po @@ -16,7 +16,7 @@ # YAHAYA MWAVURIZI , 2017 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Swahili (Kenya) (http://app.transifex.com/open-edx/edx-platform/language/sw_KE/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -30,7 +30,7 @@ # YAHAYA MWAVURIZI , 2017 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Swahili (Kenya) (http://app.transifex.com/open-edx/edx-platform/language/sw_KE/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7597,6 +7597,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11878,6 +11885,10 @@ msgstr "Nakala ya '{0}'" msgid "Invalid prerequisite course key" msgstr "" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py msgid "Uploading" @@ -12083,10 +12094,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Kozi imefaulu kupata namba nyingine." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22251,6 +22258,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22593,6 +22604,10 @@ msgstr "" msgid "Outline" msgstr "Muongozo" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po index 27c09d86d923..d817b71cc507 100644 --- a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po +++ b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Swahili (Kenya) (http://app.transifex.com/open-edx/edx-platform/language/sw_KE/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/th/LC_MESSAGES/django.po b/conf/locale/th/LC_MESSAGES/django.po index ab5fb2b58bfa..24829294ea89 100644 --- a/conf/locale/th/LC_MESSAGES/django.po +++ b/conf/locale/th/LC_MESSAGES/django.po @@ -25,7 +25,7 @@ # Theeranuch Sirikojakorn , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Thai (http://app.transifex.com/open-edx/edx-platform/language/th/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -42,7 +42,7 @@ # Sitdhibong Laokok , 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Thai (http://app.transifex.com/open-edx/edx-platform/language/th/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7392,6 +7392,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11535,6 +11542,10 @@ msgstr "ค่าซ้ำกันของ '{0}'" msgid "Invalid prerequisite course key" msgstr "หลักสูตรพื้นฐานไม่ถูกต้อง" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11742,10 +11753,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "หลักสูตรได้รับการจัดเรียงเรียบร้อย" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21747,6 +21754,10 @@ msgstr "ขยายเพิ่มหรือยุบทิ้ง" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22084,6 +22095,10 @@ msgstr "แนะนำหลักสูตร" msgid "Outline" msgstr "เค้าโครงหลักสูตร" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/th/LC_MESSAGES/djangojs.po b/conf/locale/th/LC_MESSAGES/djangojs.po index 02e7fcaa4578..b5d94c2b5991 100644 --- a/conf/locale/th/LC_MESSAGES/djangojs.po +++ b/conf/locale/th/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Thai (http://app.transifex.com/open-edx/edx-platform/language/th/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.po b/conf/locale/tr_TR/LC_MESSAGES/django.po index 5a7a199d008b..ed22d43b8795 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/django.po +++ b/conf/locale/tr_TR/LC_MESSAGES/django.po @@ -28,7 +28,7 @@ # ca47f5bf05c27c3888896d9870e257ad_00aad6f <5addf4166015f6e11583e89fe2c53975_164880>, 2014 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -49,7 +49,7 @@ # Mustafa Tat, 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -121,9 +121,9 @@ # a56fc07028489bb2b53400de33ba6a83, 2014 # #-#-#-#-# edx_proctoring_proctortrack.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (https://app.transifex.com/open-edx/teams/6205/tr_TR/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2023. +# EdX Team , 2024. # # Translators: # Ali Işıngör , 2021 @@ -132,7 +132,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Ali Işıngör , 2021\n" "Language-Team: Turkish (Turkey) (https://app.transifex.com/open-edx/teams/6205/tr_TR/)\n" @@ -8427,6 +8427,13 @@ msgstr "Meslek" msgid "Specialty" msgstr "Uzmanlık" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -13237,6 +13244,10 @@ msgstr "'{0}'ın tekrarı" msgid "Invalid prerequisite course key" msgstr "Geçersiz ders anahtar koşulu." +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Tarihi Belirle" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -13454,10 +13465,6 @@ msgstr "Sadece Akran Değerlendirmesi" msgid "Course has been successfully reindexed." msgstr "Dersin tekrar indekslenme işlemi başarılı." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Tarihi Belirle" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -24334,6 +24341,10 @@ msgstr "Genişlet veya Daralt" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Erişimi Yönet" @@ -24705,6 +24716,10 @@ msgstr "Ders Navigasyonu" msgid "Outline" msgstr "Taslak" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "Yayımcı" diff --git a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po index 38a434471eac..12124f2c5bb0 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po +++ b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -32,7 +32,7 @@ # ElektrikAkar , 2014 # #-#-#-#-# djangojs-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -69,7 +69,7 @@ # # #-#-#-#-# underscore.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -88,7 +88,7 @@ # sevde , 2015 # #-#-#-#-# underscore-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -110,7 +110,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-12-24 20:43+0000\n" +"POT-Creation-Date: 2024-01-14 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Ali Işıngör , 2018,2020-2021,2023\n" "Language-Team: Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/)\n" diff --git a/conf/locale/uk/LC_MESSAGES/django.po b/conf/locale/uk/LC_MESSAGES/django.po index e19d8f1b6a33..6efc858e4d88 100644 --- a/conf/locale/uk/LC_MESSAGES/django.po +++ b/conf/locale/uk/LC_MESSAGES/django.po @@ -34,7 +34,7 @@ # Валентина Пицик , 2019 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Ukrainian (http://app.transifex.com/open-edx/edx-platform/language/uk/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -50,7 +50,7 @@ # Валентина Пицик , 2019 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Ukrainian (http://app.transifex.com/open-edx/edx-platform/language/uk/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -8076,6 +8076,13 @@ msgstr "Професія" msgid "Specialty" msgstr "Спеціальність" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12742,6 +12749,10 @@ msgstr "Копіювання '{0}'" msgid "Invalid prerequisite course key" msgstr "Невірний ключ передумовного курсу" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "Встановити Дату" + #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py msgid "Uploading" @@ -12957,10 +12968,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Пошуковий індекс курсу успішно оновлено." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "Встановити Дату" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22796,6 +22803,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -23125,6 +23136,10 @@ msgstr "" msgid "Outline" msgstr "Структура курсу" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/uk/LC_MESSAGES/djangojs.po b/conf/locale/uk/LC_MESSAGES/djangojs.po index f24f64597136..75eab73030dd 100644 --- a/conf/locale/uk/LC_MESSAGES/djangojs.po +++ b/conf/locale/uk/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Ukrainian (http://app.transifex.com/open-edx/edx-platform/language/uk/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/vi/LC_MESSAGES/django.po b/conf/locale/vi/LC_MESSAGES/django.po index 3cbf399171ff..65e6e1d2c4fa 100644 --- a/conf/locale/vi/LC_MESSAGES/django.po +++ b/conf/locale/vi/LC_MESSAGES/django.po @@ -49,7 +49,7 @@ # Vu Bach, 2019 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Vietnamese (http://app.transifex.com/open-edx/edx-platform/language/vi/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -74,7 +74,7 @@ # Trung V. Nguyen , 2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Vietnamese (http://app.transifex.com/open-edx/edx-platform/language/vi/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7469,6 +7469,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11614,6 +11621,10 @@ msgstr "Sao chép của '{0}'" msgid "Invalid prerequisite course key" msgstr "Khóa điều kiện bắt buộc không hợp lệ" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11830,10 +11841,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "Khóa học đã được lập chỉ mục lại." -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22367,6 +22374,10 @@ msgstr "Mở rộng hoặc Thu gọn" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22734,6 +22745,10 @@ msgstr "Danh Mục Khóa Học" msgid "Outline" msgstr "Phác Thảo" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/vi/LC_MESSAGES/djangojs.po b/conf/locale/vi/LC_MESSAGES/djangojs.po index 85682ee6c057..05d6164f9307 100644 --- a/conf/locale/vi/LC_MESSAGES/djangojs.po +++ b/conf/locale/vi/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Vietnamese (http://app.transifex.com/open-edx/edx-platform/language/vi/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.po b/conf/locale/zh_CN/LC_MESSAGES/django.po index c0795eb20dab..3d2a2963c80c 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -100,7 +100,7 @@ # 赵宏鑫 , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7954,6 +7954,13 @@ msgstr "从事职业" msgid "Specialty" msgstr "专业技能" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12226,6 +12233,10 @@ msgstr "“{0}”的副本" msgid "Invalid prerequisite course key" msgstr "先修课程标识无效" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "设置日期" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12434,10 +12445,6 @@ msgstr "仅限同行评估" msgid "Course has been successfully reindexed." msgstr "课程重新索引成功。" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "设置日期" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22168,6 +22175,10 @@ msgstr "展开或折叠" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22497,6 +22508,10 @@ msgstr "课程导航" msgid "Outline" msgstr "大纲" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po index 82f342d05f75..b081196244d8 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.po b/conf/locale/zh_HANS/LC_MESSAGES/django.po index c0795eb20dab..3d2a2963c80c 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/django.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/django.po @@ -100,7 +100,7 @@ # 赵宏鑫 , 2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7954,6 +7954,13 @@ msgstr "从事职业" msgid "Specialty" msgstr "专业技能" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -12226,6 +12233,10 @@ msgstr "“{0}”的副本" msgid "Invalid prerequisite course key" msgstr "先修课程标识无效" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "设置日期" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -12434,10 +12445,6 @@ msgstr "仅限同行评估" msgid "Course has been successfully reindexed." msgstr "课程重新索引成功。" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "设置日期" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -22168,6 +22175,10 @@ msgstr "展开或折叠" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22497,6 +22508,10 @@ msgstr "课程导航" msgid "Outline" msgstr "大纲" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po index 82f342d05f75..b081196244d8 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.po b/conf/locale/zh_TW/LC_MESSAGES/django.po index 07a4d86c7f2d..a95a94acfc20 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/django.po +++ b/conf/locale/zh_TW/LC_MESSAGES/django.po @@ -44,7 +44,7 @@ # 陳子琦 , 2014 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (Taiwan) (http://app.transifex.com/open-edx/edx-platform/language/zh_TW/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -72,7 +72,7 @@ # Zhen-Rong Chen , 2014-2015 # #-#-#-#-# mako.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (Taiwan) (http://app.transifex.com/open-edx/edx-platform/language/zh_TW/) -# Copyright (C) 2023 edX +# Copyright (C) 2024 edX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: @@ -7567,6 +7567,13 @@ msgstr "" msgid "Specialty" msgstr "" +#. Translators: This label appears above a dropdown menu to select +#. the user's work experience +#: openedx/core/djangoapps/user_api/accounts/settings_views.py +#: openedx/core/djangoapps/user_authn/api/form_fields.py +msgid "Work experience" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/utils.py #, python-brace-format msgid "" @@ -11770,6 +11777,10 @@ msgstr "與'{0}'重複" msgid "Invalid prerequisite course key" msgstr "無效的預備課程key" +#: cms/djangoapps/contentstore/utils.py +msgid "Set Date" +msgstr "" + #. #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# #. Translators: This is the status of an active video upload #: cms/djangoapps/contentstore/video_storage_handlers.py @@ -11977,10 +11988,6 @@ msgstr "" msgid "Course has been successfully reindexed." msgstr "課程已經成功重新索引。" -#: cms/djangoapps/contentstore/views/course.py -msgid "Set Date" -msgstr "" - #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " @@ -21562,6 +21569,10 @@ msgstr "" msgid "Select this problem" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage Tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -21885,6 +21896,10 @@ msgstr "" msgid "Outline" msgstr "課程大綱" +#: cms/templates/widgets/header.html +msgid "Videos" +msgstr "" + #: cms/templates/widgets/header.html msgid "Publisher" msgstr "" diff --git a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po index 88242ee6fccd..7423aa7b0468 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po @@ -1,6 +1,6 @@ # #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Chinese (Taiwan) (http://app.transifex.com/open-edx/edx-platform/language/zh_TW/). -# Copyright (C) 2023 EdX +# Copyright (C) 2024 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: From 3fcd41fbb5fee3a3747179780f6b8968c6b6c104 Mon Sep 17 00:00:00 2001 From: John Nagro Date: Mon, 22 Jan 2024 11:08:23 -0500 Subject: [PATCH 15/21] feat: release edx-enterprise 4.10.5 (#34086) --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index eaaee5ea139c..8f9acb17c8f5 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -23,7 +23,7 @@ click>=8.0,<9.0 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.10.4 +edx-enterprise==4.10.5 # django-oauth-toolkit version >=2.0.0 has breaking changes. More details # mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index f348cf7067ae..aca8cc81b706 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -474,7 +474,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.4 +edx-enterprise==4.10.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index a4150a7bd223..01e4b60c8f95 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -755,7 +755,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.4 +edx-enterprise==4.10.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 45ee2bc02007..4768719b0c4d 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -552,7 +552,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.4 +edx-enterprise==4.10.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 58fcc9b1ee5b..60e8d181047c 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -580,7 +580,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.4 +edx-enterprise==4.10.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From ee380b7563811702477d9621f7d870dfa3160e58 Mon Sep 17 00:00:00 2001 From: Justin Hynes Date: Thu, 4 Jan 2024 20:36:02 +0000 Subject: [PATCH 16/21] feat: Use built-in retry features of Celery when retrying Credentials grading tasks --- .../djangoapps/credentials/tasks/v1/tasks.py | 62 +++++++++---------- .../credentials/tests/test_tasks.py | 4 +- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/openedx/core/djangoapps/credentials/tasks/v1/tasks.py b/openedx/core/djangoapps/credentials/tasks/v1/tasks.py index dad4d3618a97..ee24289dad8c 100644 --- a/openedx/core/djangoapps/credentials/tasks/v1/tasks.py +++ b/openedx/core/djangoapps/credentials/tasks/v1/tasks.py @@ -6,7 +6,6 @@ from urllib.parse import urljoin from celery import shared_task -from celery.exceptions import MaxRetriesExceededError from celery.utils.log import get_task_logger from celery_utils.logged_task import LoggedTask from django.conf import settings @@ -43,12 +42,16 @@ CertificateStatuses.downloadable, ] -# Maximum number of retries before giving up. For reference, 11 retries with exponential backoff yields a maximum -# waiting time of 2047 seconds (about 30 minutes). Setting this to None could yield unwanted behavior: infinite retries. -MAX_RETRIES = 11 - -@shared_task(bind=True, ignore_result=True) +@shared_task( + bind=True, + ignore_result=True, + autoretry_for=(Exception,), + max_retries=10, + retry_backoff=30, + retry_backoff_max=600, + retry_jitter=True, +) @set_code_owner_attribute def send_grade_to_credentials( self, @@ -62,6 +65,10 @@ def send_grade_to_credentials( """ Celery task to notify the Credentials IDA of an "interesting" grade change via an API call. + If an exception occurs when trying to send data to the Credentials IDA, we will retry the task a maximum number of + 11 times (initial attempt + 10 retries). We are relying on built-in functionality of Celery to add a randomized + jitter to the retries so that the tasks don't retry exactly at the same time. + Args: username (string): The username of the learner we are currently processing course_run_key (string): String identifier of the course run associated with the grade update @@ -70,35 +77,26 @@ def send_grade_to_credentials( percent_grade (float): Number representing the learner's grade in this course run grade_last_updated (string): String describing the last time this grade was modified in the LMS """ - logger.info(f"Running task send_grade_to_credentials for username {username} and course {course_run_key}") + data = { + 'username': username, + 'course_run': course_run_key, + 'letter_grade': letter_grade, + 'percent_grade': percent_grade, + 'verified': verified, + 'lms_last_updated_at': grade_last_updated + } + logger.info(f"Running task `send_grade_to_credentials` for username {username} with data: {data}") - countdown = 2 ** self.request.retries course_key = CourseKey.from_string(course_run_key) + credentials_client = get_credentials_api_client(User.objects.get(username=settings.CREDENTIALS_SERVICE_USERNAME)) + api_url = urljoin(f"{get_credentials_api_base_url(org=course_key.org)}/", "grades/") - try: - credentials_client = get_credentials_api_client( - User.objects.get(username=settings.CREDENTIALS_SERVICE_USERNAME) - ) - api_url = urljoin(f"{get_credentials_api_base_url(org=course_key.org)}/", "grades/") - response = credentials_client.post( - api_url, - data={ - 'username': username, - 'course_run': course_run_key, - 'letter_grade': letter_grade, - 'percent_grade': percent_grade, - 'verified': verified, - 'lms_last_updated_at': grade_last_updated - } - ) - response.raise_for_status() - logger.info(f"Sent grade for course {course_run_key} for user {username}") - except Exception: # lint-amnesty, pylint: disable=W0703 - grade_str = f'(percent: {percent_grade} letter: {letter_grade})' - error_msg = f'Failed to send grade {grade_str} for course {course_run_key} for user {username}.' - logger.exception(error_msg) - exception = MaxRetriesExceededError(f"Failed to send grade to credentials. Reason: {error_msg}") - raise self.retry(exc=exception, countdown=countdown, max_retries=MAX_RETRIES) # pylint: disable=raise-missing-from + response = credentials_client.post( + api_url, + data=data, + ) + response.raise_for_status() + logger.info(f"Sent grade for user {username} in course {course_run_key} to Credentials") @shared_task(base=LoggedTask, ignore_result=True) diff --git a/openedx/core/djangoapps/credentials/tests/test_tasks.py b/openedx/core/djangoapps/credentials/tests/test_tasks.py index 64bde301f579..1ad372e4f8ad 100644 --- a/openedx/core/djangoapps/credentials/tests/test_tasks.py +++ b/openedx/core/djangoapps/credentials/tests/test_tasks.py @@ -82,14 +82,14 @@ def test_happy_path(self, mock_get_api_client): def test_retry(self, mock_get_api_client): """ - Test that we retry when an exception occurs. + Test that we retry the appropriate number of times when an exception occurs. """ mock_get_api_client.side_effect = boom task = tasks.send_grade_to_credentials.delay('user', 'course-v1:org+course+run', True, 'A', 1.0, None) pytest.raises(Exception, task.get) - assert mock_get_api_client.call_count == (tasks.MAX_RETRIES + 1) + assert mock_get_api_client.call_count == 11 @ddt.ddt From bda102de515294c3c3f046670ab07a137bd1ef84 Mon Sep 17 00:00:00 2001 From: Marcos Date: Fri, 19 Jan 2024 10:50:32 -0300 Subject: [PATCH 17/21] feat: Added --active option for reindex_courses --- .../management/commands/reindex_course.py | 35 ++++++++++++++++--- .../commands/tests/test_reindex_courses.py | 24 +++++++++++-- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/cms/djangoapps/contentstore/management/commands/reindex_course.py b/cms/djangoapps/contentstore/management/commands/reindex_course.py index f5b6b9fadd55..74317169957a 100644 --- a/cms/djangoapps/contentstore/management/commands/reindex_course.py +++ b/cms/djangoapps/contentstore/management/commands/reindex_course.py @@ -4,6 +4,7 @@ import logging from textwrap import dedent from time import time +from datetime import date from django.core.management import BaseCommand, CommandError from elasticsearch import exceptions @@ -38,6 +39,9 @@ def add_arguments(self, parser): parser.add_argument('--all', action='store_true', help='Reindex all courses') + parser.add_argument('--active', + action='store_true', + help='Reindex active courses only') parser.add_argument('--setup', action='store_true', help='Reindex all courses on developers stack setup') @@ -65,12 +69,17 @@ def handle(self, *args, **options): """ course_ids = options['course_ids'] all_option = options['all'] + active_option = options['active'] setup_option = options['setup'] readable_option = options['warning'] index_all_courses_option = all_option or setup_option - if (not len(course_ids) and not index_all_courses_option) or (len(course_ids) and index_all_courses_option): # lint-amnesty, pylint: disable=len-as-condition - raise CommandError("reindex_course requires one or more s OR the --all or --setup flags.") + if ((not course_ids and not (index_all_courses_option or active_option)) or + (course_ids and (index_all_courses_option or active_option))): + raise CommandError(( + "reindex_course requires one or more s" + " OR the --all, --active or --setup flags." + )) store = modulestore() @@ -104,12 +113,28 @@ def handle(self, *args, **options): course_keys = [course.id for course in modulestore().get_courses()] else: return + elif active_option: + # in case of --active, we get the list of course keys from all courses + # that are stored in the modulestore and filter out the non-active + course_keys = [] + + today = date.today() + all_courses = modulestore().get_courses() + for course in all_courses: + # Omitting courses without a start date as well as + # couses that already ended (end date is in the past) + if not course.start or (course.end and course.end.date() < today): + continue + course_keys.append(course.id) + + logging.warning(f'Selected {len(course_keys)} active courses over a total of {len(all_courses)}.') + else: # in case course keys are provided as arguments course_keys = list(map(self._parse_course_key, course_ids)) total = len(course_keys) - logging.warning(f'Reindexing {total} courses') + logging.warning(f'Reindexing {total} courses...') reindexed = 0 start = time() @@ -120,6 +145,6 @@ def handle(self, *args, **options): if reindexed % 10 == 0 or reindexed == total: now = time() t = now - start - logging.warning(f'{reindexed}/{total} reindexed in {t:.1f} seconds') + logging.warning(f'{reindexed}/{total} reindexed in {t:.1f} seconds.') except Exception as exc: # lint-amnesty, pylint: disable=broad-except - logging.exception('Error indexing course %s due to the error: %s', course_key, exc) + logging.exception('Error indexing course %s due to the error: %s.', course_key, exc) diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py b/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py index 57534f30c4a0..8761cf760f76 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py @@ -10,6 +10,7 @@ from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.tests.factories import CourseFactory, LibraryFactory # lint-amnesty, pylint: disable=wrong-import-order +from datetime import datetime, timedelta @ddt.ddt @@ -26,11 +27,18 @@ def setUp(self): org="test", library="lib2", display_name="run2", default_store=ModuleStoreEnum.Type.split ) + yesterday = datetime.min.today() - timedelta(days=1) + self.first_course = CourseFactory.create( - org="test", course="course1", display_name="run1" + org="test", course="course1", display_name="run1", start=yesterday, end=None ) + self.second_course = CourseFactory.create( - org="test", course="course2", display_name="run1" + org="test", course="course2", display_name="run1", start=yesterday, end=yesterday + ) + + self.third_course = CourseFactory.create( + org="test", course="course3", display_name="run1", start=None, end=None ) REINDEX_PATH_LOCATION = ( @@ -103,7 +111,7 @@ def test_given_all_key_prompts_and_reindexes_all_courses(self): call_command('reindex_course', all=True) patched_yes_no.assert_called_once_with(ReindexCommand.CONFIRMATION_PROMPT, default='no') - expected_calls = self._build_calls(self.first_course, self.second_course) + expected_calls = self._build_calls(self.first_course, self.second_course, self.third_course) self.assertCountEqual(patched_index.mock_calls, expected_calls) def test_given_all_key_prompts_and_reindexes_all_courses_cancelled(self): @@ -116,3 +124,13 @@ def test_given_all_key_prompts_and_reindexes_all_courses_cancelled(self): patched_yes_no.assert_called_once_with(ReindexCommand.CONFIRMATION_PROMPT, default='no') patched_index.assert_not_called() + + def test_given_active_key_prompt(self): + """ Test that reindexes all courses when --active key is given """ + + with mock.patch(self.REINDEX_PATH_LOCATION) as patched_index, \ + mock.patch(self.MODULESTORE_PATCH_LOCATION, mock.Mock(return_value=self.store)): + call_command('reindex_course', active=True) + + expected_calls = self._build_calls(self.first_course) + self.assertCountEqual(patched_index.mock_calls, expected_calls) From a6dd0fe60632c73d65c2983fe37d9da10d07671e Mon Sep 17 00:00:00 2001 From: Marcos Date: Mon, 22 Jan 2024 16:53:47 -0300 Subject: [PATCH 18/21] fix: Updated comment on test case --- .../management/commands/tests/test_reindex_courses.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py b/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py index 8761cf760f76..13d33c48f92a 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_reindex_courses.py @@ -126,8 +126,10 @@ def test_given_all_key_prompts_and_reindexes_all_courses_cancelled(self): patched_index.assert_not_called() def test_given_active_key_prompt(self): - """ Test that reindexes all courses when --active key is given """ - + """ + Test that reindexes all active courses when --active key is given + Active courses have a start date but no end date, or the end date is in the future. + """ with mock.patch(self.REINDEX_PATH_LOCATION) as patched_index, \ mock.patch(self.MODULESTORE_PATCH_LOCATION, mock.Mock(return_value=self.store)): call_command('reindex_course', active=True) From 333049fd52c65d315c0ce81ddc473825b4753bc7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:12:35 +0000 Subject: [PATCH 19/21] feat: Upgrade Python dependency ora2 (#34088) Reduces duplicate workflow lookups in workflow API Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master` Co-authored-by: nsprenkle --- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index aca8cc81b706..1f07b14f53d3 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -787,7 +787,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/kernel.in optimizely-sdk==4.1.1 # via -r requirements/edx/bundled.in -ora2==6.0.26 +ora2==6.0.28 # via -r requirements/edx/bundled.in packaging==23.2 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 01e4b60c8f95..bc7f9f56f8ff 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1324,7 +1324,7 @@ optimizely-sdk==4.1.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -ora2==6.0.26 +ora2==6.0.28 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 4768719b0c4d..78cf7e0a27ff 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -929,7 +929,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via -r requirements/edx/base.txt -ora2==6.0.26 +ora2==6.0.28 # via -r requirements/edx/base.txt packaging==23.2 # via diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 60e8d181047c..f09547c27d0a 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -989,7 +989,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via -r requirements/edx/base.txt -ora2==6.0.26 +ora2==6.0.28 # via -r requirements/edx/base.txt packaging==23.2 # via From 672b8c574ceee7a8b2b7476019abfb47c4e1fbc7 Mon Sep 17 00:00:00 2001 From: John Nagro Date: Mon, 22 Jan 2024 17:08:52 -0500 Subject: [PATCH 20/21] feat: release edx-enterprise 4.10.6 (#34090) --- requirements/constraints.txt | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/doc.txt | 2 +- requirements/edx/testing.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 8f9acb17c8f5..c42e9e2b5942 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -23,7 +23,7 @@ click>=8.0,<9.0 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.10.5 +edx-enterprise==4.10.6 # django-oauth-toolkit version >=2.0.0 has breaking changes. More details # mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 1f07b14f53d3..197dab2cb7f9 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -474,7 +474,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.5 +edx-enterprise==4.10.6 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index bc7f9f56f8ff..af369d720af6 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -755,7 +755,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.5 +edx-enterprise==4.10.6 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 78cf7e0a27ff..7eb6b36351d3 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -552,7 +552,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.5 +edx-enterprise==4.10.6 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index f09547c27d0a..4fadc81c7ff6 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -580,7 +580,7 @@ edx-drf-extensions==9.1.2 # edx-when # edxval # openedx-learning -edx-enterprise==4.10.5 +edx-enterprise==4.10.6 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt From 4ec70eb98b4ebe66dc02cd5920f02ac66b35b43b Mon Sep 17 00:00:00 2001 From: bydawen Date: Tue, 23 Jan 2024 10:21:06 +0200 Subject: [PATCH 21/21] feat: add brand_color variable for the email templates (#33421) * feat: add brand_color variable for the email templates * test: fix tests assertations --------- Co-authored-by: Eugene Dyudyunov --- common/djangoapps/student/tests/test_email.py | 19 +-- .../edx_ace/accountactivation/email/body.html | 2 +- .../edx_ace/emailchange/email/body.html | 2 + .../emailchangeconfirmation/email/body.html | 2 + lms/djangoapps/instructor/tests/test_api.py | 139 +++++++++--------- .../edx_ace/addbetatester/email/body.html | 2 + .../edx_ace/allowedenroll/email/body.html | 2 + .../edx_ace/allowedunenroll/email/body.html | 2 + .../edx_ace/enrolledunenroll/email/body.html | 2 + .../edx_ace/enrollenrolled/email/body.html | 2 + .../edx_ace/removebetatester/email/body.html | 2 + .../verificationsubmitted/email/body.html | 2 + .../ace_common/edx_ace/common/base_body.html | 8 +- .../edx_ace/common/return_to_course_cta.html | 10 +- .../edx_ace/upgradereminder/email/body.html | 10 +- .../email/body.html | 2 + 16 files changed, 113 insertions(+), 95 deletions(-) diff --git a/common/djangoapps/student/tests/test_email.py b/common/djangoapps/student/tests/test_email.py index bcede1821376..9ece964ac388 100644 --- a/common/djangoapps/student/tests/test_email.py +++ b/common/djangoapps/student/tests/test_email.py @@ -406,10 +406,9 @@ def test_email_success(self): subject='Request to change édX account e-mail', body_fragments=[ 'We received a request to change the e-mail associated with', - 'your édX account from {old_email} to {new_email}.'.format( - old_email=old_email, - new_email=new_email, - ), + 'your édX account from', + old_email, + new_email, 'If this is correct, please confirm your new e-mail address by visiting:', f'http://edx.org/email_confirm/{registration_key}', 'Please do not reply to this e-mail; if you require assistance,', @@ -467,13 +466,11 @@ def setUp(self): # Text fragments we expect in the body of the confirmation email self.email_fragments = [ - "This is to confirm that you changed the e-mail associated with {platform_name}" - " from {old_email} to {new_email}. If you did not make this request, please contact us immediately." - " Contact information is listed at:".format( - platform_name=settings.PLATFORM_NAME, - old_email=self.user.email, - new_email=PendingEmailChange.objects.get(activation_key=self.key).new_email - ), + "This is to confirm that you changed the e-mail associated with ", + str(settings.PLATFORM_NAME), + "If you did not make this request, please contact us immediately. Contact information is listed at:", + self.user.email, + PendingEmailChange.objects.get(activation_key=self.key).new_email, "We keep a log of old e-mails, so if this request was unintentional, we can investigate." ] diff --git a/common/templates/student/edx_ace/accountactivation/email/body.html b/common/templates/student/edx_ace/accountactivation/email/body.html index 9709074cc3d4..2c78b6f4b998 100644 --- a/common/templates/student/edx_ace/accountactivation/email/body.html +++ b/common/templates/student/edx_ace/accountactivation/email/body.html @@ -50,7 +50,7 @@

{% trans "Upgrade now" as tmsg %}{{ tmsg | force_escape }}

border-radius: 4px; -webkit-border-radius: 4px; -moz-border-radius: 4px; - background-color: #005686; - border-top: 10px solid #005686; - border-bottom: 10px solid #005686; - border-right: 16px solid #005686; - border-left: 16px solid #005686; + background-color: {{ brand_color }}; + border-top: 10px solid {{ brand_color }}; + border-bottom: 10px solid {{ brand_color }}; + border-right: 16px solid {{ brand_color }}; + border-left: 16px solid {{ brand_color }}; display: inline-block; "> {# old email clients require the use of the font tag :( #} diff --git a/openedx/core/djangoapps/user_api/templates/user_api/edx_ace/deletionnotificationmessage/email/body.html b/openedx/core/djangoapps/user_api/templates/user_api/edx_ace/deletionnotificationmessage/email/body.html index 0e9ff89f9e06..3ca277e05907 100644 --- a/openedx/core/djangoapps/user_api/templates/user_api/edx_ace/deletionnotificationmessage/email/body.html +++ b/openedx/core/djangoapps/user_api/templates/user_api/edx_ace/deletionnotificationmessage/email/body.html @@ -2,6 +2,7 @@ {% load i18n %} {% block content %} +{% with contact_email=''|safe|add:contact_email|add:''|safe %}
@@ -44,4 +45,5 @@
+{% endwith %} {% endblock %}

{% blocktrans trimmed asvar assist_msg %} If you need help, please use our web form at {start_anchor_web}{{ support_url }}{end_anchor} or email {start_anchor_email}{{ support_email }}{end_anchor}. {% endblocktrans %} - {% interpolate_html assist_msg start_anchor_web=''|safe start_anchor_email=''|safe end_anchor=''|safe %} + {% interpolate_html assist_msg start_anchor_web=''|safe start_anchor_email=''|safe end_anchor=''|safe %}

diff --git a/common/templates/student/edx_ace/emailchange/email/body.html b/common/templates/student/edx_ace/emailchange/email/body.html index b5c2c5edf21e..d6290d2161e4 100644 --- a/common/templates/student/edx_ace/emailchange/email/body.html +++ b/common/templates/student/edx_ace/emailchange/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with old_email=''|add:old_email|add:''|safe new_email=''|add:new_email|add:''|safe %}
@@ -31,4 +32,5 @@

+{% endwith %} {% endblock %} diff --git a/common/templates/student/edx_ace/emailchangeconfirmation/email/body.html b/common/templates/student/edx_ace/emailchangeconfirmation/email/body.html index 9fc9f5929c43..f62c8e71476b 100644 --- a/common/templates/student/edx_ace/emailchangeconfirmation/email/body.html +++ b/common/templates/student/edx_ace/emailchangeconfirmation/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with old_email=''|add:old_email|add:''|safe new_email=''|add:new_email|add:''|safe %}
@@ -30,4 +31,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py index bb534d9b026a..0874d6954def 100644 --- a/lms/djangoapps/instructor/tests/test_api.py +++ b/lms/djangoapps/instructor/tests/test_api.py @@ -1228,14 +1228,17 @@ def test_enroll_with_email(self, protocol): assert text_body.startswith('Dear NotEnrolled Student\n\n') for body in [text_body, html_body]: - assert f'You have been enrolled in {self.course.display_name} at edx.org by a member of the course staff.'\ - in body - - assert 'This course will now appear on your edx.org dashboard.' in body + assert f'You have been enrolled in {self.course.display_name} at ' in body + assert self.site_name in body + assert ' by a member of the course staff.' in body + assert 'This course will now appear on your ' in body assert f'{protocol}://{self.site_name}{self.course_path}' in body assert 'To start accessing course materials, please visit' in text_body - assert 'This email was automatically sent from edx.org to NotEnrolled Student\n\n' in text_body + assert ( + f'This email was automatically sent from {self.site_name} to {self.notenrolled_student.first_name} ' + f'{self.notenrolled_student.last_name}\n\n' + ) in text_body @ddt.data('http', 'https') def test_enroll_with_email_not_registered(self, protocol): @@ -1264,22 +1267,21 @@ def test_enroll_with_email_not_registered(self, protocol): assert register_url in html_body for body in [text_body, html_body]: - assert 'You have been invited to join {course} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {course} at '.format( course=self.course.display_name ) in body - - assert ('fill out the registration form making sure to use ' - 'robot-not-an-email-yet@robot.org in the Email field') in body - + assert self.site_name in body + assert ' by a member of the course staff.' in body + assert 'fill out the registration form making sure to use ' in body + assert self.notregistered_email in body + assert ' in the Email field' in body assert 'Once you have registered and activated your account,' in body - assert '{proto}://{site}{about_path}'.format( proto=protocol, site=self.site_name, about_path=self.about_path ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert 'This email was automatically sent from ' in body @ddt.data('http', 'https') @patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True}) @@ -1302,23 +1304,22 @@ def test_enroll_email_not_registered_mktgsite(self, protocol): assert 'Please finish your registration and fill' in html_body for body in [text_body, html_body]: - assert 'You have been invited to join {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {display_name} at '.format( display_name=self.course.display_name ) in body - + assert self.site_name in body + assert 'by a member of the course staff.' in body assert '{proto}://{site}/register'.format( proto=protocol, site=self.site_name ) in body - - assert ('fill out the registration form making sure to use ' - 'robot-not-an-email-yet@robot.org in the Email field') in body - + assert 'fill out the registration form making sure to use ' in body + assert self.notregistered_email in body + assert ' in the Email field' in body assert 'You can then enroll in {display_name}.'.format( display_name=self.course.display_name ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert 'This email was automatically sent from ' in body @ddt.data('http', 'https') def test_enroll_with_email_not_registered_autoenroll(self, protocol): @@ -1353,20 +1354,19 @@ def test_enroll_with_email_not_registered_autoenroll(self, protocol): assert register_url in html_body for body in [text_body, html_body]: - assert 'You have been invited to join {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {display_name} at '.format( display_name=self.course.display_name ) in body - - assert (' and fill ' - 'out the registration form making sure to use robot-not-an-email-yet@robot.org ' - 'in the Email field') in body - + assert self.site_name in body + assert 'by a member of the course staff.' in body + assert ' and fill out the registration form making sure to use ' in body + assert self.notregistered_email in body + assert 'in the Email field' in body assert ('Once you have registered and activated your account, ' 'you will see {display_name} listed on your dashboard.').format( display_name=self.course.display_name ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert 'This email was automatically sent from ' in body def test_unenroll_without_email(self): url = reverse('students_update_enrollment', kwargs={'course_id': str(self.course.id)}) @@ -1461,13 +1461,15 @@ def test_unenroll_with_email(self): assert text_body.startswith('Dear Enrolled Student') for body in [text_body, html_body]: - assert 'You have been unenrolled from {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been unenrolled from {display_name} at '.format( display_name=self.course.display_name, ) in body - - assert 'This course will no longer appear on your edx.org dashboard.' in body + assert self.site_name in body + assert ' by a member of the course staff.' in body + assert 'This course will no longer appear on your ' in body assert 'Your other courses have not been affected.' in body - assert 'This email was automatically sent from edx.org to Enrolled Student' in body + assert 'This email was automatically sent from ' in body + assert f'to {self.enrolled_student.first_name} {self.enrolled_student.last_name}' in body def test_unenroll_with_email_allowed_student(self): url = reverse('students_update_enrollment', kwargs={'course_id': str(self.course.id)}) @@ -1519,7 +1521,9 @@ def test_unenroll_with_email_allowed_student(self): ) in body assert 'Please disregard the invitation previously sent.' in body - assert 'This email was automatically sent from edx.org to robot-allowed@robot.org' in body + assert 'This email was automatically sent from ' in body + assert self.site_name in body + assert self.allowed_email in body @ddt.data('http', 'https') @patch('lms.djangoapps.instructor.enrollment.uses_shib') @@ -1551,11 +1555,13 @@ def test_enroll_with_email_not_registered_with_shib(self, protocol, mock_uses_sh assert course_url in html_body for body in [text_body, html_body]: - assert 'You have been invited to join {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {display_name} at '.format( display_name=self.course.display_name, ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert self.site_name in body + assert ' by a member of the course staff.' in body + assert 'This email was automatically sent from ' in body + assert self.notregistered_email in body @patch('lms.djangoapps.instructor.enrollment.uses_shib') @patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True}) @@ -1576,11 +1582,13 @@ def test_enroll_email_not_registered_shib_mktgsite(self, mock_uses_shib): assert text_body.startswith('Dear student,') for body in [text_body, html_body]: - assert 'You have been invited to join {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {display_name} at '.format( display_name=self.course.display_name, ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert self.site_name in body + assert ' by a member of the course staff.' in body + assert 'This email was automatically sent from ' in body + assert self.notregistered_email in body @ddt.data('http', 'https') @patch('lms.djangoapps.instructor.enrollment.uses_shib') @@ -1611,11 +1619,13 @@ def test_enroll_with_email_not_registered_with_shib_autoenroll(self, protocol, m assert 'To access this course click on the button below and login:' in html_body for body in [text_body, html_body]: - assert 'You have been invited to join {display_name} at edx.org by a member of the course staff.'.format( + assert 'You have been invited to join {display_name} at '.format( display_name=self.course.display_name, ) in body - - assert 'This email was automatically sent from edx.org to robot-not-an-email-yet@robot.org' in body + assert ' by a member of the course staff.' in body + assert 'This email was automatically sent from ' in body + assert self.site_name in body + assert self.notregistered_email in body def test_enroll_already_enrolled_student(self): """ @@ -1998,22 +2008,19 @@ def test_add_notenrolled_with_email(self, protocol): assert f'Visit {self.course.display_name}' in html_body for body in [text_body, html_body]: - assert 'You have been invited to be a beta tester for {display_name} at edx.org'.format( + assert 'You have been invited to be a beta tester for {display_name} at '.format( display_name=self.course.display_name, ) in body - + assert self.site_name in body assert 'by a member of the course staff.' in body assert 'enroll in this course and begin the beta test' in body - assert '{proto}://{site}{about_path}'.format( proto=protocol, site=self.site_name, about_path=self.about_path, ) in body - - assert 'This email was automatically sent from edx.org to {student_email}'.format( - student_email=self.notenrolled_student.email, - ) in body + assert 'This email was automatically sent from ' in body + assert self.notenrolled_student.email in body @ddt.data('http', 'https') def test_add_notenrolled_with_email_autoenroll(self, protocol): @@ -2050,22 +2057,19 @@ def test_add_notenrolled_with_email_autoenroll(self, protocol): assert text_body.startswith(f'Dear {student_name}') for body in [text_body, html_body]: - assert 'You have been invited to be a beta tester for {display_name} at edx.org'.format( + assert 'You have been invited to be a beta tester for {display_name} at '.format( display_name=self.course.display_name, ) in body - + assert self.site_name in body assert 'by a member of the course staff' in body - assert 'To start accessing course materials, please visit' in body assert '{proto}://{site}{course_path}'.format( proto=protocol, site=self.site_name, course_path=self.course_path ) - - assert 'This email was automatically sent from edx.org to {student_email}'.format( - student_email=self.notenrolled_student.email, - ) in body + assert 'This email was automatically sent from ' in body + assert self.notenrolled_student.email in body @patch.dict(settings.FEATURES, {'ENABLE_MKTG_SITE': True}) def test_add_notenrolled_email_mktgsite(self): @@ -2081,16 +2085,14 @@ def test_add_notenrolled_email_mktgsite(self): assert text_body.startswith(f'Dear {student_name}') for body in [text_body, html_body]: - assert 'You have been invited to be a beta tester for {display_name} at edx.org'.format( + assert 'You have been invited to be a beta tester for {display_name} at '.format( display_name=self.course.display_name, ) in body - + assert self.site_name in body assert 'by a member of the course staff.' in body - assert 'Visit edx.org' in body assert 'enroll in this course and begin the beta test' in body - assert 'This email was automatically sent from edx.org to {student_email}'.format( - student_email=self.notenrolled_student.email, - ) in body + assert 'This email was automatically sent from ' in body + assert self.notenrolled_student.email in body def test_enroll_with_email_not_registered(self): # User doesn't exist @@ -2184,18 +2186,15 @@ def test_remove_with_email(self): assert text_body.startswith(f'Dear {self.beta_tester.profile.name}') for body in [text_body, html_body]: - assert 'You have been removed as a beta tester for {display_name} at edx.org'.format( + assert 'You have been removed as a beta tester for {display_name} at '.format( display_name=self.course.display_name, ) in body - + assert self.site_name in body assert ('This course will remain on your dashboard, but you will no longer be ' 'part of the beta testing group.') in body - assert 'Your other courses have not been affected.' in body - - assert 'This email was automatically sent from edx.org to {email_address}'.format( - email_address=self.beta_tester.email, - ) in body + assert 'This email was automatically sent from ' in body + assert self.beta_tester.email in body class TestInstructorAPILevelsAccess(SharedModuleStoreTestCase, LoginEnrollmentTestCase): diff --git a/lms/templates/instructor/edx_ace/addbetatester/email/body.html b/lms/templates/instructor/edx_ace/addbetatester/email/body.html index 39389f39ac0c..2b454d8583f1 100644 --- a/lms/templates/instructor/edx_ace/addbetatester/email/body.html +++ b/lms/templates/instructor/edx_ace/addbetatester/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe email_address=''|safe|add:email_address|add:''|safe %}
@@ -67,4 +68,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/instructor/edx_ace/allowedenroll/email/body.html b/lms/templates/instructor/edx_ace/allowedenroll/email/body.html index 37aef5de4a1f..c70d3c16d518 100644 --- a/lms/templates/instructor/edx_ace/allowedenroll/email/body.html +++ b/lms/templates/instructor/edx_ace/allowedenroll/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe email_address=''|safe|add:email_address|add:''|safe %}
@@ -81,4 +82,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/instructor/edx_ace/allowedunenroll/email/body.html b/lms/templates/instructor/edx_ace/allowedunenroll/email/body.html index d3f40738e3b0..06b53856dcd5 100644 --- a/lms/templates/instructor/edx_ace/allowedunenroll/email/body.html +++ b/lms/templates/instructor/edx_ace/allowedunenroll/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe email_address=''|safe|add:email_address|add:''|safe %}
@@ -30,4 +31,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/instructor/edx_ace/enrolledunenroll/email/body.html b/lms/templates/instructor/edx_ace/enrolledunenroll/email/body.html index 33524c068927..686797dc2a95 100644 --- a/lms/templates/instructor/edx_ace/enrolledunenroll/email/body.html +++ b/lms/templates/instructor/edx_ace/enrolledunenroll/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe %}
@@ -39,4 +40,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/instructor/edx_ace/enrollenrolled/email/body.html b/lms/templates/instructor/edx_ace/enrollenrolled/email/body.html index e5a4735a62c0..8f14a6a0876a 100644 --- a/lms/templates/instructor/edx_ace/enrollenrolled/email/body.html +++ b/lms/templates/instructor/edx_ace/enrollenrolled/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe %}
@@ -37,4 +38,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/instructor/edx_ace/removebetatester/email/body.html b/lms/templates/instructor/edx_ace/removebetatester/email/body.html index bb5677b40f61..72b0607ecd38 100644 --- a/lms/templates/instructor/edx_ace/removebetatester/email/body.html +++ b/lms/templates/instructor/edx_ace/removebetatester/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with site_name=''|safe|add:site_name|add:''|safe email_address=''|safe|add:email_address|add:''|safe %}
@@ -44,4 +45,5 @@

+{% endwith %} {% endblock %} diff --git a/lms/templates/verify_student/edx_ace/verificationsubmitted/email/body.html b/lms/templates/verify_student/edx_ace/verificationsubmitted/email/body.html index c23fbdfca5ea..9e68d5cb30e4 100644 --- a/lms/templates/verify_student/edx_ace/verificationsubmitted/email/body.html +++ b/lms/templates/verify_student/edx_ace/verificationsubmitted/email/body.html @@ -3,6 +3,7 @@ {% load i18n %} {% load static %} {% block content %} +{% with dashboard_link=''|add:dashboard_link|add:''|safe %}
@@ -39,4 +40,5 @@

+{% endwith %} {% endblock %} diff --git a/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/base_body.html b/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/base_body.html index c04873ffdd44..3c0c3fa6839c 100644 --- a/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/base_body.html +++ b/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/base_body.html @@ -29,6 +29,7 @@ {% google_analytics_tracking_pixel %} +{% with brand_color="#005686" logo_max_height="65px" %}
- {% filter force_escape %}{% blocktrans %}Go to {{ platform_name }} Home Page{% endblocktrans %}{% endfilter %} + {% filter force_escape %}{% blocktrans %}Go to {{ platform_name }} Home Page{% endblocktrans %}{% endfilter %} @@ -218,8 +219,8 @@ {% get_action_links channel omit_unsubscribe_link=omit_unsubscribe_link as action_links %} {% for action_link_url, action_link_text in action_links %}

- - {{ action_link_text }} + + {{ action_link_text }}

{% endfor %} @@ -253,6 +254,7 @@
+{% endwith %} {# Debug info that is not user-visible #} diff --git a/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/return_to_course_cta.html b/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/return_to_course_cta.html index 72806a7c5c60..722cb54b18de 100644 --- a/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/return_to_course_cta.html +++ b/openedx/core/djangoapps/ace_common/templates/ace_common/edx_ace/common/return_to_course_cta.html @@ -21,11 +21,11 @@ border-radius: 4px; -webkit-border-radius: 4px; -moz-border-radius: 4px; - background-color: #005686; - border-top: 12px solid #005686; - border-bottom: 12px solid #005686; - border-right: 50px solid #005686; - border-left: 50px solid #005686; + background-color: {{ brand_color }}; + border-top: 12px solid {{ brand_color }}; + border-bottom: 12px solid {{ brand_color }}; + border-right: 50px solid {{ brand_color }}; + border-left: 50px solid {{ brand_color }}; display: inline-block; "> {# old email clients require the use of the font tag :( #} diff --git a/openedx/core/djangoapps/schedules/templates/schedules/edx_ace/upgradereminder/email/body.html b/openedx/core/djangoapps/schedules/templates/schedules/edx_ace/upgradereminder/email/body.html index 03824fbea24f..cc3db8166e96 100644 --- a/openedx/core/djangoapps/schedules/templates/schedules/edx_ace/upgradereminder/email/body.html +++ b/openedx/core/djangoapps/schedules/templates/schedules/edx_ace/upgradereminder/email/body.html @@ -101,11 +101,11 @@