gitextract_frv4ewgf/ ├── .cfnlintrc.yaml ├── .dockerignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── dependabot.yml │ └── workflows/ │ ├── black.yml │ ├── build.yml │ ├── codeql.yml │ ├── db_ops.yml │ ├── dev-main-deploy.yml │ ├── feature-branch-deploy.yml │ ├── pip-audit.yml │ ├── prod-deploy.yml │ ├── renew_coverage.yml │ ├── stage-hotfix-rel-deploy.yml │ ├── stage-image-refresh.yml │ ├── stage-release-deploy.yml │ ├── test-main-deploy.yml │ └── test.yml ├── .gitignore ├── Dockerfile ├── LICENSE.md ├── Loadtesting.md ├── MANIFEST.in ├── Makefile ├── Pipfile ├── README.md ├── build_containers.sh ├── celerybeat/ │ ├── Dockerfile │ └── entrypoint.sh ├── cloudformation/ │ ├── LICENSE │ ├── NOTICE │ ├── README.md │ ├── add_cloudflare_ips_to_sgs.py │ ├── create_secrets.sh │ ├── featurebranch.yaml │ ├── images/ │ │ └── architecture-overview.graffle/ │ │ └── data.plist │ ├── infrastructure/ │ │ ├── bastion-hosts.yaml │ │ ├── data-load.yaml │ │ ├── elasticache-feature.yaml │ │ ├── elasticache.yaml │ │ ├── elasticsearch.yaml │ │ ├── fargate-cluster.yaml │ │ ├── fargate-featurebranch.yaml │ │ ├── jenkins-server.yaml │ │ ├── network-acl.yaml │ │ ├── opensearch.yaml │ │ ├── rds.yaml │ │ ├── search-proxy-task.yaml │ │ ├── security-groups.yaml │ │ └── vpc.yaml │ ├── master.yaml │ ├── stack_drift.sh │ ├── sync_templates.sh │ └── tests/ │ └── validate-templates.sh ├── concordia/ │ ├── __init__.py │ ├── admin/ │ │ ├── __init__.py │ │ ├── actions.py │ │ ├── filters.py │ │ ├── forms.py │ │ ├── utils.py │ │ └── views.py │ ├── admin_site.py │ ├── api/ │ │ ├── __init__.py │ │ └── schemas.py │ ├── api_views.py │ ├── apps.py │ ├── asgi.py │ ├── authentication_backends.py │ ├── celery.py │ ├── consumers.py │ ├── context_processors.py │ ├── contextmanagers.py │ ├── converters.py │ ├── decorators.py │ ├── documents.py │ ├── exceptions.py │ ├── forms.py │ ├── logging.py │ ├── maintenance.py │ ├── management/ │ │ ├── __init__.py │ │ └── commands/ │ │ ├── __init__.py │ │ ├── calculate_difficulty_values.py │ │ ├── create_load_test_fixtures.py │ │ ├── ensure_initial_site_configuration.py │ │ ├── import_site_reports.py │ │ ├── prepare_load_test_db.py │ │ └── print_frontend_test_urls.py │ ├── middleware.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0001_squashed_0040_remove_campaign_is_active.py │ │ ├── 0002_auto_20181004_1848.py │ │ ├── 0003_auto_20181004_2103.py │ │ ├── 0004_auto_20181010_1715.py │ │ ├── 0005_campaign_short_description.py │ │ ├── 0006_campaignresource.py │ │ ├── 0007_thumbnail_images.py │ │ ├── 0008_auto_20181015_1711.py │ │ ├── 0009_project_description.py │ │ ├── 0010_auto_20181021_1659.py │ │ ├── 0010_auto_20181022_1530.py │ │ ├── 0011_auto_20181022_1532.py │ │ ├── 0012_merge_20181022_1554.py │ │ ├── 0013_auto_20181031_1305.py │ │ ├── 0014_auto_20181115_1411.py │ │ ├── 0015_auto_20181115_1436.py │ │ ├── 0016_auto_20181115_1803.py │ │ ├── 0017_change_transcription_supersedes_related_name.py │ │ ├── 0018_auto_20181128_1611.py │ │ ├── 0018_simplepage.py │ │ ├── 0019_merge_20181128_1715.py │ │ ├── 0020_auto_20181128_1718.py │ │ ├── 0021_sitereport.py │ │ ├── 0022_auto_20181211_1310.py │ │ ├── 0023_auto_20190130_1555.py │ │ ├── 0024_add_site_report_ordering.py │ │ ├── 0024_auto_20190211_1420.py │ │ ├── 0025_auto_20190329_1705.py │ │ ├── 0025_unicode_slugs.py │ │ ├── 0026_update_published_field_definition.py │ │ ├── 0027_merge_20190423_1657.py │ │ ├── 0028_asset_year.py │ │ ├── 0029_assettranscriptionreservation_reservation_token.py │ │ ├── 0030_auto_20190503_1559.py │ │ ├── 0031_auto_20190509_1142.py │ │ ├── 0032_topic_ordering.py │ │ ├── 0033_simple_content_blocks.py │ │ ├── 0034_auto_20190627_1438.py │ │ ├── 0035_auto_20190627_1455.py │ │ ├── 0036_auto_20190703_1203.py │ │ ├── 0037_carouselslide.py │ │ ├── 0038_sitereport_topic.py │ │ ├── 0039_auto_20200129_1536.py │ │ ├── 0040_auto_20200130_1756.py │ │ ├── 0041_auto_20200203_1351.py │ │ ├── 0042_auto_20200316_1623.py │ │ ├── 0043_auto_20200323_1729.py │ │ ├── 0044_auto_20200323_1827.py │ │ ├── 0045_auto_20200323_1832.py │ │ ├── 0046_auto_20200323_1907.py │ │ ├── 0047_auto_20200324_1103.py │ │ ├── 0048_auto_20200324_1820.py │ │ ├── 0049_auto_20200324_2004.py │ │ ├── 0050_auto_20210920_1544.py │ │ ├── 0051_asset_storage_image.py │ │ ├── 0052_auto_20220531_1331.py │ │ ├── 0053_banner.py │ │ ├── 0054_banner_active.py │ │ ├── 0055_campaign_status.py │ │ ├── 0056_auto_20220922_1508.py │ │ ├── 0057_resource_resource_type.py │ │ ├── 0058_banner_slug.py │ │ ├── 0059_resourcefile.py │ │ ├── 0060_alter_resourcefile_resource.py │ │ ├── 0061_auto_20230201_1453.py │ │ ├── 0061_sitereport_registered_contributors.py │ │ ├── 0062_resourcefile_updated_on.py │ │ ├── 0062_userretiredcampaign.py │ │ ├── 0063_banner_alert_status.py │ │ ├── 0064_alter_banner_alert_status.py │ │ ├── 0065_alter_userretiredcampaign_unique_together.py │ │ ├── 0066_auto_20230217_1302.py │ │ ├── 0066_campaignretirementprogress.py │ │ ├── 0067_alter_campaignretirementprogress_campaign.py │ │ ├── 0068_campaignretirementprogress_complete.py │ │ ├── 0069_merge_20230224_1446.py │ │ ├── 0070_alter_campaign_options.py │ │ ├── 0071_auto_20230306_1456.py │ │ ├── 0072_merge_20230313_1047.py │ │ ├── 0073_auto_20230314_1327.py │ │ ├── 0074_auto_20230314_1341.py │ │ ├── 0075_auto_20230327_1333.py │ │ ├── 0076_sitereport_report_name.py │ │ ├── 0077_alter_sitereport_report_name.py │ │ ├── 0078_alter_sitereport_report_name.py │ │ ├── 0079_auto_20230601_1234.py │ │ ├── 0080_auto_20230602_0920.py │ │ ├── 0081_sitereport_review_actions.py │ │ ├── 0082_delete_userretiredcampaign.py │ │ ├── 0083_sitereport_daily_active_users.py │ │ ├── 0084_rename_review_actions_sitereport_daily_review_actions.py │ │ ├── 0085_auto_20231016_1432.py │ │ ├── 0086_auto_20231215_1311.py │ │ ├── 0087_auto_20240213_0756.py │ │ ├── 0088_alter_simplepage_body.py │ │ ├── 0089_campaign_image_alt_text.py │ │ ├── 0090_auto_20240408_1334.py │ │ ├── 0091_guide_simple_page.py │ │ ├── 0092_auto_20240509_1522.py │ │ ├── 0093_asset_campaign.py │ │ ├── 0094_alter_asset_campaign.py │ │ ├── 0095_transcription_rolled_back_and_more.py │ │ ├── 0096_transcription_source.py │ │ ├── 0097_alter_sitereport_options_userprofile_review_count_and_more.py │ │ ├── 0098_userprofile_create_and_population.py │ │ ├── 0099_alter_campaign_display_on_homepage_and_more.py │ │ ├── 0100_researchcenter.py │ │ ├── 0101_auto_20241119_1215.py │ │ ├── 0102_campaign_research_centers.py │ │ ├── 0103_alter_item_title.py │ │ ├── 0104_nexttranscribabletopicasset_and_more.py │ │ ├── 0105_nextreviewablecampaignasset_concordia_n_transcr_aafdba_gin_and_more.py │ │ ├── 0106_alter_nextreviewablecampaignasset_options_and_more.py │ │ ├── 0107_alter_nextreviewablecampaignasset_options_and_more.py │ │ ├── 0108_add_next_asset_cache_periodic_task.py │ │ ├── 0109_alter_nextreviewablecampaignasset_asset_and_more.py │ │ ├── 0110_remove_asset_media_url_alter_asset_storage_image.py │ │ ├── 0111_auto_20250428_1023.py │ │ ├── 0112_projecttopic_url_filter_alter_projecttopic_id.py │ │ ├── 0113_create_asset_status_periodic_task.py │ │ ├── 0114_create_daily_activity_periodic_task.py │ │ ├── 0115_alter_asset_storage_image_alter_banner_link_and_more.py │ │ ├── 0116_item_thumbnail_image.py │ │ ├── 0117_alter_projecttopic_options_projecttopic_ordering.py │ │ ├── 0118_asset_concordia_a_item_id_f10916_idx_and_more.py │ │ ├── 0119_remove_asset_concordia_a_id_137ca8_idx_and_more.py │ │ ├── 0120_sitereport_assets_started.py │ │ ├── 0121_keymetricsreport.py │ │ ├── 0122_alter_item_title.py │ │ ├── 0123_alter_campaignretirementprogress_options.py │ │ ├── 0124_update_periodic_task_paths.py │ │ ├── 0125_update_userprofile_tasks.py │ │ ├── 0126_concordiafile_helpfullink_remove_resource_campaign_and_more.py │ │ ├── 0127_alter_campaignretirementprogress_options_and_more.py │ │ ├── 0128_alter_campaignretirementprogress_options.py │ │ └── __init__.py │ ├── models.py │ ├── parser.py │ ├── passwords/ │ │ ├── LICENSE │ │ ├── __init__.py │ │ └── validators.py │ ├── routing.py │ ├── secrets.py │ ├── settings_dev.py │ ├── settings_docker.py │ ├── settings_ecs.py │ ├── settings_loadtest.py │ ├── settings_local_test.py │ ├── settings_template.py │ ├── settings_test.py │ ├── signals/ │ │ ├── __init__.py │ │ ├── handlers.py │ │ └── signals.py │ ├── static/ │ │ ├── admin/ │ │ │ ├── custom-inline.js │ │ │ └── editor-preview.js │ │ ├── js/ │ │ │ └── src/ │ │ │ ├── about-accordions.js │ │ │ ├── asset-reservation.js │ │ │ ├── banner.js │ │ │ ├── base.js │ │ │ ├── campaign-selection.js │ │ │ ├── contribute.js │ │ │ ├── filter-assets.js │ │ │ ├── guide.js │ │ │ ├── homepage-carousel.js │ │ │ ├── modules/ │ │ │ │ ├── accessible-colors.js │ │ │ │ ├── chroma-esm.js │ │ │ │ ├── concordia-visualization.js │ │ │ │ ├── quick-tips.js │ │ │ │ ├── turnstile.js │ │ │ │ └── visualization-errors.js │ │ │ ├── ocr.js │ │ │ ├── password-validation.js │ │ │ ├── profile-fields.js │ │ │ ├── quick-tips-setup.js │ │ │ ├── recent-pages.js │ │ │ ├── viewer-split.js │ │ │ ├── viewer.js │ │ │ └── visualizations/ │ │ │ ├── asset-status-by-campaign.js │ │ │ ├── asset-status-overview.js │ │ │ └── daily-activity.js │ │ ├── scss/ │ │ │ ├── _variables.scss │ │ │ └── base.scss │ │ └── vendor/ │ │ └── jquery.cookie.js │ ├── storage.py │ ├── storage_backends.py │ ├── tasks/ │ │ ├── __init__.py │ │ ├── assets.py │ │ ├── blog.py │ │ ├── housekeeping.py │ │ ├── next_asset/ │ │ │ ├── __init__.py │ │ │ ├── renew.py │ │ │ ├── reviewable.py │ │ │ └── transcribable.py │ │ ├── reports/ │ │ │ ├── __init__.py │ │ │ ├── backfill.py │ │ │ ├── key_metrics.py │ │ │ └── sitereport.py │ │ ├── reservations.py │ │ ├── retirement.py │ │ ├── search_index.py │ │ ├── thumbnails.py │ │ ├── unusualactivity.py │ │ ├── useractivity.py │ │ └── visualizations.py │ ├── templates/ │ │ ├── 404.html │ │ ├── 429.html │ │ ├── 500.html │ │ ├── 503.html │ │ ├── account/ │ │ │ ├── account_deletion.html │ │ │ ├── email_reconfirmation_failed.html │ │ │ └── profile.html │ │ ├── admin/ │ │ │ ├── auth/ │ │ │ │ └── user/ │ │ │ │ └── change_form.html │ │ │ ├── base_site.html │ │ │ ├── bulk_change.html │ │ │ ├── bulk_import.html │ │ │ ├── bulk_review.html │ │ │ ├── celery_task.html │ │ │ ├── clear_cache.html │ │ │ ├── concordia/ │ │ │ │ ├── asset/ │ │ │ │ │ ├── change_form.html │ │ │ │ │ └── change_list.html │ │ │ │ ├── campaign/ │ │ │ │ │ ├── change_form.html │ │ │ │ │ └── retire.html │ │ │ │ ├── item/ │ │ │ │ │ └── change_form.html │ │ │ │ ├── project/ │ │ │ │ │ ├── change_form.html │ │ │ │ │ └── item_import.html │ │ │ │ ├── simplepage/ │ │ │ │ │ └── change_form.html │ │ │ │ └── transcription/ │ │ │ │ └── change_form.html │ │ │ ├── index.html │ │ │ ├── long_name_filter.html │ │ │ ├── process_bagit.html │ │ │ └── project_level_export.html │ │ ├── base.html │ │ ├── django_registration/ │ │ │ ├── activation_complete.html │ │ │ ├── activation_email_body.txt │ │ │ ├── activation_email_subject.txt │ │ │ ├── activation_failed.html │ │ │ ├── registration_closed.html │ │ │ ├── registration_complete.html │ │ │ └── registration_form.html │ │ ├── documents/ │ │ │ └── service_letter.html │ │ ├── emails/ │ │ │ ├── delete_account_body.txt │ │ │ ├── delete_account_subject.txt │ │ │ ├── email_reconfirmation_body.txt │ │ │ ├── email_reconfirmation_subject.txt │ │ │ ├── unusual_activity.html │ │ │ ├── unusual_activity.txt │ │ │ ├── welcome_email_body.html │ │ │ ├── welcome_email_body.txt │ │ │ └── welcome_email_subject.txt │ │ ├── error.html │ │ ├── forms/ │ │ │ └── widgets/ │ │ │ ├── email.html │ │ │ └── turnstile_widget.html │ │ ├── fragments/ │ │ │ ├── _filter-buttons.html │ │ │ ├── _modal_footer.html │ │ │ ├── activity-filter-sort.html │ │ │ ├── codemirror.html │ │ │ ├── common-stylesheets.html │ │ │ ├── featured_blog_posts.html │ │ │ ├── recent-pages.html │ │ │ ├── sharing-button-group.html │ │ │ ├── standard-pagination.html │ │ │ ├── transcription-progress-bar.html │ │ │ ├── transcription-progress-row.html │ │ │ └── transcription-status-filters.html │ │ ├── home.html │ │ ├── registration/ │ │ │ ├── activate.html │ │ │ ├── login.html │ │ │ ├── password_change_done.html │ │ │ ├── password_change_form.html │ │ │ ├── password_reset_complete.html │ │ │ ├── password_reset_confirm.html │ │ │ ├── password_reset_done.html │ │ │ ├── password_reset_email.html │ │ │ ├── password_reset_form.html │ │ │ └── password_reset_subject.txt │ │ ├── static-page.html │ │ └── transcriptions/ │ │ ├── asset_detail/ │ │ │ ├── asset_reservation_failure_modal.html │ │ │ ├── editor.html │ │ │ ├── error_modal.html │ │ │ ├── guide.html │ │ │ ├── language_selection_modal.html │ │ │ ├── navigation.html │ │ │ ├── nothing_to_transcribe_modal.html │ │ │ ├── ocr_help_modal.html │ │ │ ├── ocr_transcription_modal.html │ │ │ ├── quick_tips_modal.html │ │ │ ├── review_accepted_modal.html │ │ │ ├── successful_submission_modal.html │ │ │ ├── tags.html │ │ │ ├── viewer.html │ │ │ └── viewer_filters.html │ │ ├── asset_detail.html │ │ ├── campaign_detail.html │ │ ├── campaign_detail_completed.html │ │ ├── campaign_detail_retired.html │ │ ├── campaign_list.html │ │ ├── campaign_list_small_blocks.html │ │ ├── campaign_report.html │ │ ├── campaign_small_block.html │ │ ├── campaign_topic_list.html │ │ ├── completed_campaigns_section.html │ │ ├── item_detail.html │ │ ├── project_detail.html │ │ ├── topic_detail.html │ │ └── transcription.html │ ├── templatetags/ │ │ ├── __init__.py │ │ ├── concordia_filtering_tags.py │ │ ├── concordia_media_tags.py │ │ ├── concordia_querystring.py │ │ ├── concordia_sharing_tags.py │ │ ├── concordia_text_tags.py │ │ ├── custom_math.py │ │ ├── group_list.py │ │ ├── reject_filter.py │ │ ├── truncation.py │ │ └── visualization.py │ ├── tests/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── axe.py │ │ ├── data/ │ │ │ └── site_reports.csv │ │ ├── test_account_views.py │ │ ├── test_admin.py │ │ ├── test_admin_actions.py │ │ ├── test_admin_filters.py │ │ ├── test_admin_forms.py │ │ ├── test_admin_views.py │ │ ├── test_api_views.py │ │ ├── test_authentication.py │ │ ├── test_celery.py │ │ ├── test_consumers.py │ │ ├── test_contextmanagers.py │ │ ├── test_decorators.py │ │ ├── test_fields.py │ │ ├── test_logging.py │ │ ├── test_maintenance.py │ │ ├── test_management_commands.py │ │ ├── test_models.py │ │ ├── test_parser.py │ │ ├── test_registration_views.py │ │ ├── test_s3.py │ │ ├── test_selenium.py │ │ ├── test_sentry.py │ │ ├── test_signals.py │ │ ├── test_tasks_assets.py │ │ ├── test_tasks_blog.py │ │ ├── test_tasks_housekeeping.py │ │ ├── test_tasks_next_asset.py │ │ ├── test_tasks_reports_backfill.py │ │ ├── test_tasks_reports_key_metrics.py │ │ ├── test_tasks_reports_sitereport.py │ │ ├── test_tasks_retirement.py │ │ ├── test_tasks_search_index.py │ │ ├── test_tasks_thumbnails.py │ │ ├── test_tasks_unusualactivity.py │ │ ├── test_tasks_useractivity.py │ │ ├── test_tasks_visualizations.py │ │ ├── test_templatetags.py │ │ ├── test_top_level_views.py │ │ ├── test_utils_celery.py │ │ ├── test_utils_logging.py │ │ ├── test_utils_next_asset_reviewable_campaign.py │ │ ├── test_utils_next_asset_reviewable_topic.py │ │ ├── test_utils_next_asset_transcribable_campaign.py │ │ ├── test_utils_next_asset_transcribable_topic.py │ │ ├── test_validators.py │ │ ├── test_view_decorators.py │ │ ├── test_views.py │ │ ├── test_views_asset_reservation.py │ │ ├── test_views_redirect_next_reviewable.py │ │ ├── test_views_redirect_next_transcribable.py │ │ ├── test_views_tags.py │ │ ├── test_views_topics.py │ │ ├── test_views_transcription_review.py │ │ ├── test_views_transcription_save.py │ │ ├── test_views_transcription_submit.py │ │ ├── test_views_utils.py │ │ ├── test_widgets.py │ │ └── utils.py │ ├── turnstile/ │ │ ├── LICENSE │ │ ├── __init__.py │ │ ├── context_processors.py │ │ ├── fields.py │ │ └── widgets.py │ ├── urls.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── celery.py │ │ ├── constants.py │ │ └── next_asset/ │ │ ├── __init__.py │ │ ├── reviewable/ │ │ │ ├── __init__.py │ │ │ ├── campaign.py │ │ │ └── topic.py │ │ └── transcribable/ │ │ ├── __init__.py │ │ ├── campaign.py │ │ └── topic.py │ ├── validators.py │ ├── version.py │ ├── views/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── accounts.py │ │ ├── ajax.py │ │ ├── assets.py │ │ ├── campaigns.py │ │ ├── decorators.py │ │ ├── items.py │ │ ├── maintenance_mode.py │ │ ├── projects.py │ │ ├── rate_limit.py │ │ ├── simple_pages.py │ │ ├── topics.py │ │ ├── utils.py │ │ └── visualizations.py │ ├── widgets.py │ └── wsgi.py ├── configuration/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── management/ │ │ ├── __init__.py │ │ └── commands/ │ │ ├── __init__.py │ │ └── configcache.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_populate_configurations.py │ │ ├── 0003_populate_retry_configurations.py │ │ ├── 0004_alter_configuration_options.py │ │ ├── 0005_alter_configuration_data_type.py │ │ ├── 0006_populate_next_asset_rate_limit.py │ │ └── __init__.py │ ├── models.py │ ├── signals.py │ ├── templates/ │ │ └── admin/ │ │ └── configuration_confirm_update.html │ ├── templatetags/ │ │ ├── __init__.py │ │ └── configuration_tags.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── test_admin.py │ │ ├── test_models.py │ │ ├── test_signals.py │ │ ├── test_templatetags.py │ │ ├── test_utils.py │ │ └── test_validation.py │ ├── utils.py │ ├── validation.py │ └── views.py ├── db_scripts/ │ ├── Dockerfile │ ├── dump.sh │ └── restore.sh ├── development/ │ ├── Containerfile │ ├── README.md │ └── compose.yml ├── docker-compose.yml ├── docs/ │ ├── accessibility-goals.md │ ├── accessibility-techniques.md │ ├── design-principles.md │ ├── for-developers.md │ └── how-we-work.md ├── entrypoint.sh ├── exporter/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── exceptions.py │ ├── migrations/ │ │ └── __init__.py │ ├── models.py │ ├── tabular_export/ │ │ ├── admin.py │ │ └── core.py │ ├── templates/ │ │ └── admin/ │ │ └── exporter/ │ │ └── unacceptable_character_report.html │ ├── tests/ │ │ ├── __init__.py │ │ ├── test_exceptions.py │ │ ├── test_tabular_export.py │ │ ├── test_utils.py │ │ └── test_views.py │ ├── utils.py │ └── views.py ├── fixtures/ │ └── original-static-pages.json ├── frontend/ │ ├── .gitignore │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.jsx │ │ ├── ViewerSplit.jsx │ │ ├── config.js │ │ ├── editor/ │ │ │ ├── Buttons.jsx │ │ │ ├── Editor.jsx │ │ │ ├── Header.jsx │ │ │ ├── StatusMessages.jsx │ │ │ ├── TranscriptionTextarea.jsx │ │ │ └── buttons/ │ │ │ ├── Editable.jsx │ │ │ ├── Redo.jsx │ │ │ ├── Review.jsx │ │ │ ├── Save.jsx │ │ │ ├── Submit.jsx │ │ │ └── Undo.jsx │ │ ├── main.jsx │ │ ├── ocr/ │ │ │ ├── Button.jsx │ │ │ ├── ConfirmModal.jsx │ │ │ ├── Handler.jsx │ │ │ ├── HelpModal.jsx │ │ │ ├── LanguageModal.jsx │ │ │ └── Section.jsx │ │ └── viewer/ │ │ ├── Controls.jsx │ │ ├── FilterTabNav.jsx │ │ ├── GammaFilterForm.jsx │ │ ├── ImageFilters.jsx │ │ ├── InvertFilterForm.jsx │ │ ├── KeyboardHelpModal.jsx │ │ ├── KeyboardShortcutRow.jsx │ │ ├── ThresholdFilterForm.jsx │ │ └── Viewer.jsx │ └── vite.config.js ├── importer/ │ ├── Dockerfile │ ├── README.md │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── celery.py │ ├── config.py │ ├── entrypoint.sh │ ├── exceptions.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0001_squashed_0015_auto_20180925_1851.py │ │ ├── 0002_auto_20180709_0833.py │ │ ├── 0003_auto_20180709_0933.py │ │ ├── 0004_auto_20180812_1007.py │ │ ├── 0005_auto_20180816_1702.py │ │ ├── 0006_auto_20180912_0229.py │ │ ├── 0007_auto_20180917_1654.py │ │ ├── 0008_campaigntaskdetails_project.py │ │ ├── 0009_convert_project_text_to_keys.py │ │ ├── 0010_auto_20180920_2013.py │ │ ├── 0011_auto_20180922_0208.py │ │ ├── 0012_auto_20180923_0231.py │ │ ├── 0013_auto_20180924_1318.py │ │ ├── 0014_auto_20180924_1943.py │ │ ├── 0015_auto_20180925_1851.py │ │ ├── 0016_importitem_failure_reason_and_more.py │ │ ├── 0017_importitem_failure_history_importitem_retry_count_and_more.py │ │ ├── 0018_importitem_status_history_and_more.py │ │ ├── 0019_alter_downloadassetimagejob_batch_and_more.py │ │ ├── 0020_alter_downloadassetimagejob_unique_together_and_more.py │ │ └── __init__.py │ ├── models.py │ ├── setup.py │ ├── tasks/ │ │ ├── __init__.py │ │ ├── assets.py │ │ ├── collections.py │ │ ├── decorators.py │ │ ├── images.py │ │ └── items.py │ ├── tests/ │ │ ├── README.md │ │ ├── __init__.py │ │ ├── test_admin.py │ │ ├── test_celery.py │ │ ├── test_models.py │ │ ├── test_tasks_assets.py │ │ ├── test_tasks_collections.py │ │ ├── test_tasks_core.py │ │ ├── test_tasks_decorators.py │ │ ├── test_tasks_images.py │ │ ├── test_tasks_items.py │ │ ├── test_utils.py │ │ └── utils.py │ └── utils/ │ ├── __init__.py │ ├── excel.py │ └── verify_images.py ├── load_test.sh ├── locustfile.py ├── manage.py ├── package.json ├── postgresql/ │ └── create-multiple-postgresql-databases.sh ├── prometheus_metrics/ │ ├── LICENSE │ ├── __init__.py │ ├── apps.py │ ├── middleware.py │ ├── models.py │ └── views.py ├── pylenium.json ├── pyproject.toml ├── setup.cfg ├── setup.py ├── src/ │ ├── about.js │ ├── main.js │ └── profile.js ├── static/ │ └── .gitignore ├── tools/ │ └── readme_symbol_check.py └── vite.config.js